151 lines
3.4 KiB
Factor
Executable File
151 lines
3.4 KiB
Factor
Executable File
! Copyright (C) 2008 Jeff Bigot
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING:
|
|
kernel
|
|
sequences
|
|
math
|
|
accessors
|
|
adsoda
|
|
math.vectors
|
|
math.matrices
|
|
bunny.model
|
|
io.encodings.ascii
|
|
io.files
|
|
sequences.deep
|
|
combinators
|
|
adsoda.combinators
|
|
fry
|
|
io.files.temp
|
|
grouping
|
|
;
|
|
|
|
IN: adsoda.tools
|
|
|
|
|
|
|
|
|
|
|
|
! ---------------------------------
|
|
: coord-min ( x array -- array ) swap suffix ;
|
|
: coord-max ( x array -- array ) swap neg suffix ;
|
|
|
|
: 4cube ( array name -- solid )
|
|
! array : xmin xmax ymin ymax zmin zmax wmin wmax
|
|
<solid>
|
|
4 >>dimension
|
|
swap >>name
|
|
swap
|
|
{
|
|
[ { 1 0 0 0 } coord-min ] [ { -1 0 0 0 } coord-max ]
|
|
[ { 0 1 0 0 } coord-min ] [ { 0 -1 0 0 } coord-max ]
|
|
[ { 0 0 1 0 } coord-min ] [ { 0 0 -1 0 } coord-max ]
|
|
[ { 0 0 0 1 } coord-min ] [ { 0 0 0 -1 } coord-max ]
|
|
}
|
|
[ curry call ] 2map
|
|
[ cut-solid ] each
|
|
ensure-adjacencies
|
|
|
|
; inline
|
|
|
|
: 3cube ( array name -- solid )
|
|
! array : xmin xmax ymin ymax zmin zmax wmin wmax
|
|
<solid>
|
|
3 >>dimension
|
|
swap >>name
|
|
swap
|
|
{
|
|
[ { 1 0 0 } coord-min ] [ { -1 0 0 } coord-max ]
|
|
[ { 0 1 0 } coord-min ] [ { 0 -1 0 } coord-max ]
|
|
[ { 0 0 1 } coord-min ] [ { 0 0 -1 } coord-max ]
|
|
}
|
|
[ curry call ] 2map
|
|
[ cut-solid ] each
|
|
ensure-adjacencies
|
|
|
|
; inline
|
|
|
|
|
|
: equation-system-for-normal ( points -- matrix )
|
|
unclip [ v- 0 suffix ] curry map
|
|
dup first [ drop 1 ] map suffix
|
|
;
|
|
|
|
: normal-vector ( points -- v )
|
|
equation-system-for-normal
|
|
intersect-hyperplanes ;
|
|
|
|
: points-to-hyperplane ( points -- hyperplane )
|
|
[ normal-vector 0 suffix ] [ first ] bi
|
|
translate ;
|
|
|
|
: refs-to-points ( points faces -- faces )
|
|
[ swap [ nth 10 v*n { 100 100 100 } v+ ] curry map ]
|
|
with map
|
|
;
|
|
! V{ { 0.1 0.2 } { 1.1 1.3 } } V{ { 1 0 } { 0 1 } }
|
|
! V{ { { 1.1 1.3 } { 0.1 0.2 } } { { 0.1 0.2 } { 1.1 1.3 } } }
|
|
|
|
: ply-model-path ( -- path )
|
|
|
|
! "bun_zipper.ply"
|
|
"screw2.ply"
|
|
temp-file
|
|
;
|
|
|
|
: read-bunny-model ( -- v )
|
|
ply-model-path ascii [ parse-model ] with-file-reader
|
|
|
|
refs-to-points
|
|
;
|
|
|
|
: 3points-to-normal ( seq -- v )
|
|
unclip [ v- ] curry map first2 cross normalize
|
|
;
|
|
: 2-faces-to-prism ( seq seq -- seq )
|
|
2dup
|
|
[ do-cycle 2 clump ] bi@ concat-nth
|
|
! 3 faces rectangulaires
|
|
swap prefix
|
|
swap prefix
|
|
;
|
|
|
|
: Xpoints-to-prisme ( seq height -- cube )
|
|
! from 3 points gives a list of faces representing
|
|
! a cube of height "height"
|
|
! and of based on the three points
|
|
! a face is a group of 3 or mode points.
|
|
[ dup dup 3points-to-normal ] dip
|
|
v*n [ v+ ] curry map ! 2 eme face triangulaire
|
|
2-faces-to-prism
|
|
|
|
! [ dup number? [ 1 + ] when ] deep-map
|
|
! dup keep
|
|
;
|
|
|
|
|
|
: Xpoints-to-plane4D ( seq x y -- 4Dplane )
|
|
! from 3 points gives a list of faces representing
|
|
! a cube in 4th dim
|
|
! from x to y (height = y-x)
|
|
! and of based on the X points
|
|
! a face is a group of 3 or mode points.
|
|
'[ [ [ _ suffix ] map ] [ [ _ suffix ] map ] bi ] call
|
|
2-faces-to-prism
|
|
;
|
|
|
|
: 3pointsfaces-to-3Dsolidfaces ( seq -- seq )
|
|
[ 1 Xpoints-to-prisme [ 100
|
|
110 Xpoints-to-plane4D ] map concat ] map
|
|
|
|
;
|
|
|
|
: test-figure ( -- solid )
|
|
<solid>
|
|
2 >>dimension
|
|
{ 1 -1 -5 } cut-solid
|
|
{ -1 -1 -21 } cut-solid
|
|
{ -1 0 -12 } cut-solid
|
|
{ 1 2 16 } cut-solid
|
|
;
|
|
|