doc correction

db4
Jeff Bigot 2009-01-30 17:29:46 +01:00
parent dbddd6ad0d
commit 4a31f6f0e6
19 changed files with 346 additions and 699 deletions

View File

@ -3,210 +3,62 @@
USING: help.markup help.syntax kernel quotations strings ; USING: help.markup help.syntax kernel quotations strings ;
IN: 4DNav IN: 4DNav
HELP: (mvt-4D)
{ $values
{ "quot" quotation }
}
{ $description "" } ;
HELP: 4D-Rxw
{ $values
{ "angle" null }
{ "Rz" null }
}
{ $description "" } ;
HELP: 4D-Rxy
{ $values
{ "angle" null }
{ "Rx" null }
}
{ $description "" } ;
HELP: 4D-Rxz
{ $values
{ "angle" null }
{ "Ry" null }
}
{ $description "" } ;
HELP: 4D-Ryw
{ $values
{ "angle" null }
{ "Ry" null }
}
{ $description "" } ;
HELP: 4D-Ryz
{ $values
{ "angle" null }
{ "Rx" null }
}
{ $description "" } ;
HELP: 4D-Rzw
{ $values
{ "angle" null }
{ "Rz" null }
}
{ $description "" } ;
HELP: 4DNav
{ $description "" } ;
HELP: >observer3d
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: >present-space
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: >view1
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: >view2
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: >view3
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: >view4
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: add-keyboard-delegate
{ $values
{ "obj" object }
{ "obj" object }
}
{ $description "" } ;
HELP: button*
{ $values
{ "string" string } { "quot" quotation }
{ "button" null }
}
{ $description "" } ;
HELP: camera-action
{ $values
{ "quot" quotation }
{ "quot" quotation }
}
{ $description "" } ;
HELP: camera-button
{ $values
{ "string" string } { "quot" quotation }
{ "button" null }
}
{ $description "" } ;
HELP: controller-window*
{ $values
{ "gadget" "a gadget" }
}
{ $description "" } ;
HELP: init-models
{ $description "" } ;
HELP: init-variables
{ $description "" } ;
HELP: menu-3D HELP: menu-3D
{ $values { $values
{ "gadget" null } { "gadget" "gadget" }
} }
{ $description "The menu dedicated to 3D movements of the camera" } ; { $description "The menu dedicated to 3D movements of the camera" } ;
HELP: menu-4D HELP: menu-4D
{ $values { $values
{ "gadget" null } { "gadget" "gadget" }
} }
{ $description "The menu dedicated to 4D movements of space" } ; { $description "The menu dedicated to 4D movements of space" } ;
HELP: menu-bar HELP: menu-bar
{ $values { $values
{ "gadget" null } { "gadget" "gadget" }
} }
{ $description "return gadget containing menu buttons" } ; { $description "return gadget containing menu buttons" } ;
HELP: model-projection HELP: model-projection
{ $values { $values
{ "x" null } { "x" "interger" }
{ "space" null } { "space" "space" }
} }
{ $description "Project space following coordinate x" } ; { $description "Project space following coordinate x" } ;
HELP: mvt-3D-1 HELP: mvt-3D-1
{ $values { $values
{ "quot" quotation } { "quot" "quotation" }
} }
{ $description "return a quotation to orientate space to see it from first point of view" } ; { $description "return a quotation to orientate space to see it from first point of view" } ;
HELP: mvt-3D-2 HELP: mvt-3D-2
{ $values { $values
{ "quot" quotation } { "quot" "quotation" }
} }
{ $description "return a quotation to orientate space to see it from second point of view" } ; { $description "return a quotation to orientate space to see it from second point of view" } ;
HELP: mvt-3D-3 HELP: mvt-3D-3
{ $values { $values
{ "quot" quotation } { "quot" "quotation" }
} }
{ $description "return a quotation to orientate space to see it from third point of view" } ; { $description "return a quotation to orientate space to see it from third point of view" } ;
HELP: mvt-3D-4 HELP: mvt-3D-4
{ $values { $values
{ "quot" quotation } { "quot" "quotation" }
} }
{ $description "return a quotation to orientate space to see it from first point of view" } ; { $description "return a quotation to orientate space to see it from first point of view" } ;
HELP: observer3d
{ $description "" } ;
HELP: observer3d>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: present-space
{ $description "" } ;
HELP: present-space>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: load-model-file HELP: load-model-file
{ $description "load space from file" } ; { $description "load space from file" } ;
@ -218,70 +70,23 @@ HELP: rotation-4D
HELP: translation-4D HELP: translation-4D
{ $values { $values
{ "v" null } { "v" "vector" }
} }
{ $description "" } ; { $description "Apply a 4D translation" } ;
HELP: update-model-projections
{ $description "" } ;
HELP: update-observer-projections ARTICLE: "implementation details" "How 4DNav is done"
{ $description "" } ; "4DNav is build using :"
HELP: view1 { $subsection "4DNav.camera" }
{ $description "" } ; { $subsection "adsoda-main-page" }
;
HELP: view1>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: view2
{ $description "" } ;
HELP: view2>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: view3
{ $description "" } ;
HELP: view3>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: view4
{ $description "" } ;
HELP: view4>
{ $values
{ "value" null }
}
{ $description "" } ;
HELP: viewer-windows*
{ $description "" } ;
HELP: win3D
{ $values
{ "text" null } { "gadget" null }
}
{ $description "" } ;
HELP: windows
{ $description "" } ;
ARTICLE: "Space file" "Create a new space file" ARTICLE: "Space file" "Create a new space file"
"\nTo build a new space, create an XML file using " { $vocab-link "adsoda" } " model description. \nAn example is:" "To build a new space, create an XML file using " { $vocab-link "adsoda" } " model description. A solid is not caracterized by its corners but is defined as the intersection of hyperplanes."
$nl
"An example is:"
$nl $nl
"\n<model>" "\n<model>"
@ -336,10 +141,8 @@ $nl
; ;
ARTICLE: "TODO" "Todo" ARTICLE: "TODO" "Todo"
{ $list { $list
"A file chooser"
"A vocab to initialize parameters" "A vocab to initialize parameters"
"an editor mode" "an editor mode"
{ $list "add a face to a solid" { $list "add a face to a solid"
@ -357,43 +160,41 @@ ARTICLE: "TODO" "Todo"
"add a tool wich give an hyperplane normal vector with enought points. Will use adsoda.intersect-hyperplanes with { { 0 } { 0 } { 1 } } " "add a tool wich give an hyperplane normal vector with enought points. Will use adsoda.intersect-hyperplanes with { { 0 } { 0 } { 1 } } "
"decorrelate 3D camera and activate them with select buttons" "decorrelate 3D camera and activate them with select buttons"
} ; } ;
ARTICLE: "4DNav" "4DNav" ARTICLE: "4DNav" "The 4DNav app"
{ $vocab-link "4DNav" } { $vocab-link "4DNav" }
$nl $nl
{ $heading "4D Navigator" } { $heading "4D Navigator" }
"4DNav is a simple tool to visualize 4 dimensionnal objects." "4DNav is a simple tool to visualize 4 dimensionnal objects."
"\n" "\n"
"It uses " { $vocab-link "adsoda" } " library to display a 4D space and navigate thru it." "It uses " { $vocab-link "adsoda" } " library to display a 4D space and navigate thru it."
$nl
"It will display:" "It will display:"
{ $list { $list
{ "a menu window" } { "a menu window" }
{ "4 visualization windows" } { "4 visualization windows" }
} }
"Each window represents the projection of the 4D space on a particular 3D space." "Each visualization window represents the projection of the 4D space on a particular 3D space."
$nl
{ $heading "Start" }
"type:" { $code "\"4DNav\" run" }
{ $heading "Initialization" }
"put the space file " { $strong "space-exemple.xml" } " in temp directory"
" and then type:" { $code "\"4DNav\" run" }
{ $heading "Navigation" } { $heading "Navigation" }
"4D submenu move the space in translations and rotation." "Menu window is divided in 4 areas"
"\n3D submenu move the camera in 3D space. Cameras in every 3D spaces are manipulated as a single one" { $list
$nl { "a space-file chooser to select the file to display" }
{ "a parametrization area to select the projection mode" }
{ "4D submenu to translate and rotate the 4D space" }
{ "3D submenu to move the camera in 3D space. Cameras in every 3D spaces are manipulated as a single one" }
}
{ $heading "Links" } { $heading "Links" }
{ $subsection "Space file" } { $subsection "Space file" }
{ $subsection "TODO" } { $subsection "TODO" }
{ $subsection "implementation details" }
; ;

View File

@ -109,34 +109,36 @@ VAR: present-space
[ dup cos , 0.0 , dup sin neg , 0.0 , [ dup cos , 0.0 , dup sin neg , 0.0 ,
0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 ,
dup sin , 0.0 , dup cos , 0.0 , dup sin , 0.0 , dup cos , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ; 0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ;
: 4D-Rzw ( angle -- Rz ) deg>rad : 4D-Rzw ( angle -- Rz ) deg>rad
[ dup cos , dup sin neg , 0.0 , 0.0 , [ dup cos , dup sin neg , 0.0 , 0.0 ,
dup sin , dup cos , 0.0 , 0.0 , dup sin , dup cos , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ; 0.0 , 0.0 , 0.0 , 1.0 , ] 4 make-matrix nip ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! UI ! UI
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: button* ( string quot -- button ) closed-quot <repeat-button> ; : button* ( string quot -- button )
closed-quot <repeat-button> ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! !
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: model-projection-chooser ( -- gadget ) : model-projection-chooser ( -- gadget )
observer3d> projection-mode>> observer3d> projection-mode>>
{ { 1 "perspective" } { 0 "orthogonal" } } <toggle-buttons> ; { { 1 "perspective" } { 0 "orthogonal" } }
<toggle-buttons> ;
: collision-detection-chooser ( -- gadget ) : collision-detection-chooser ( -- gadget )
observer3d> collision-mode>> observer3d> collision-mode>>
{ { t "on" } { f "off" } } <toggle-buttons> { { t "on" } { f "off" } } <toggle-buttons> ;
;
: model-projection ( x -- space ) present-space> swap space-project ; : model-projection ( x -- space )
present-space> swap space-project ;
: update-observer-projections ( -- ) : update-observer-projections ( -- )
view1> relayout-1 view1> relayout-1
@ -151,14 +153,16 @@ VAR: present-space
3 model-projection <model> view4> (>>model) ; 3 model-projection <model> view4> (>>model) ;
: camera-action ( quot -- quot ) : camera-action ( quot -- quot )
[ drop [ ] observer3d> with-self update-observer-projections ] [ drop [ ] observer3d>
with-self update-observer-projections ]
make* closed-quot ; make* closed-quot ;
: win3D ( text gadget -- ) "navigateur 4D : " rot append open-window ; : win3D ( text gadget -- )
"navigateur 4D : " rot append open-window ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! 4D object manipulation ! 4D object manipulation
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: (mvt-4D) ( quot -- ) : (mvt-4D) ( quot -- )
present-space> present-space>
@ -168,42 +172,55 @@ VAR: present-space
update-observer-projections ; update-observer-projections ;
: rotation-4D ( m -- ) : rotation-4D ( m -- )
'[ _ [ [ middle-of-space dup vneg ] keep swap space-translate ] dip '[ _ [ [ middle-of-space dup vneg ] keep
swap space-translate ] dip
space-transform space-transform
swap space-translate swap space-translate
] (mvt-4D) ; ] (mvt-4D) ;
: translation-4D ( v -- ) '[ _ space-translate ] (mvt-4D) ; : translation-4D ( v -- ) '[ _ space-translate ] (mvt-4D) ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! menu ! menu
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: menu-rotations-4D ( -- gadget ) : menu-rotations-4D ( -- gadget )
<frame> <frame>
<pile> 1 >>fill <pile> 1 >>fill
"XY +" [ drop rotation-step 4D-Rxy rotation-4D ] button* add-gadget "XY +" [ drop rotation-step 4D-Rxy rotation-4D ]
"XY -" [ drop rotation-step neg 4D-Rxy rotation-4D ] button* add-gadget button* add-gadget
"XY -" [ drop rotation-step neg 4D-Rxy rotation-4D ]
button* add-gadget
@top-left grid-add @top-left grid-add
<pile> 1 >>fill <pile> 1 >>fill
"XZ +" [ drop rotation-step 4D-Rxz rotation-4D ] button* add-gadget "XZ +" [ drop rotation-step 4D-Rxz rotation-4D ]
"XZ -" [ drop rotation-step neg 4D-Rxz rotation-4D ] button* add-gadget button* add-gadget
"XZ -" [ drop rotation-step neg 4D-Rxz rotation-4D ]
button* add-gadget
@top grid-add @top grid-add
<pile> 1 >>fill <pile> 1 >>fill
"YZ +" [ drop rotation-step 4D-Ryz rotation-4D ] button* add-gadget "YZ +" [ drop rotation-step 4D-Ryz rotation-4D ]
"YZ -" [ drop rotation-step neg 4D-Ryz rotation-4D ] button* add-gadget button* add-gadget
"YZ -" [ drop rotation-step neg 4D-Ryz rotation-4D ]
button* add-gadget
@center grid-add @center grid-add
<pile> 1 >>fill <pile> 1 >>fill
"XW +" [ drop rotation-step 4D-Rxw rotation-4D ] button* add-gadget "XW +" [ drop rotation-step 4D-Rxw rotation-4D ]
"XW -" [ drop rotation-step neg 4D-Rxw rotation-4D ] button* add-gadget button* add-gadget
"XW -" [ drop rotation-step neg 4D-Rxw rotation-4D ]
button* add-gadget
@top-right grid-add @top-right grid-add
<pile> 1 >>fill <pile> 1 >>fill
"YW +" [ drop rotation-step 4D-Ryw rotation-4D ] button* add-gadget "YW +" [ drop rotation-step 4D-Ryw rotation-4D ]
"YW -" [ drop rotation-step neg 4D-Ryw rotation-4D ] button* add-gadget button* add-gadget
"YW -" [ drop rotation-step neg 4D-Ryw rotation-4D ]
button* add-gadget
@right grid-add @right grid-add
<pile> 1 >>fill <pile> 1 >>fill
"ZW +" [ drop rotation-step 4D-Rzw rotation-4D ] button* add-gadget "ZW +" [ drop rotation-step 4D-Rzw rotation-4D ]
"ZW -" [ drop rotation-step neg 4D-Rzw rotation-4D ] button* add-gadget button* add-gadget
"ZW -" [ drop rotation-step neg 4D-Rzw rotation-4D ]
button* add-gadget
@bottom-right grid-add @bottom-right grid-add
; ;
@ -211,9 +228,11 @@ VAR: present-space
<frame> <frame>
<pile> 1 >>fill <pile> 1 >>fill
<shelf> 1 >>fill <shelf> 1 >>fill
"X+" [ drop { 1 0 0 0 } translation-step v*n translation-4D ] "X+" [ drop { 1 0 0 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
"X-" [ drop { -1 0 0 0 } translation-step v*n translation-4D ] "X-" [ drop { -1 0 0 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
add-gadget add-gadget
"YZW" <label> add-gadget "YZW" <label> add-gadget
@ -221,26 +240,32 @@ VAR: present-space
<pile> 1 >>fill <pile> 1 >>fill
"XZW" <label> add-gadget "XZW" <label> add-gadget
<shelf> 1 >>fill <shelf> 1 >>fill
"Y+" [ drop { 0 1 0 0 } translation-step v*n translation-4D ] "Y+" [ drop { 0 1 0 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
"Y-" [ drop { 0 -1 0 0 } translation-step v*n translation-4D ] "Y-" [ drop { 0 -1 0 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
add-gadget add-gadget
@top-right grid-add @top-right grid-add
<pile> 1 >>fill <pile> 1 >>fill
"XYW" <label> add-gadget "XYW" <label> add-gadget
<shelf> 1 >>fill <shelf> 1 >>fill
"Z+" [ drop { 0 0 1 0 } translation-step v*n translation-4D ] "Z+" [ drop { 0 0 1 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
"Z-" [ drop { 0 0 -1 0 } translation-step v*n translation-4D ] "Z-" [ drop { 0 0 -1 0 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
add-gadget add-gadget
@top-left grid-add @top-left grid-add
<pile> 1 >>fill <pile> 1 >>fill
<shelf> 1 >>fill <shelf> 1 >>fill
"W+" [ drop { 0 0 0 1 } translation-step v*n translation-4D ] "W+" [ drop { 0 0 0 1 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
"W-" [ drop { 0 0 0 -1 } translation-step v*n translation-4D ] "W-" [ drop { 0 0 0 -1 } translation-step v*n
translation-4D ]
button* add-gadget button* add-gadget
add-gadget add-gadget
"XYZ" <label> add-gadget "XYZ" <label> add-gadget
@ -267,7 +292,8 @@ VAR: present-space
update-observer-projections ; update-observer-projections ;
: load-model-file ( -- ) : load-model-file ( -- )
selected-file dup selected-file-model> set-model read-model-file selected-file dup selected-file-model> set-model
read-model-file
redraw-model ; redraw-model ;
: mvt-3D-X ( turn pitch -- quot ) : mvt-3D-X ( turn pitch -- quot )
@ -305,37 +331,38 @@ VAR: present-space
: menu-rotations-3D ( -- gadget ) : menu-rotations-3D ( -- gadget )
<frame> <frame>
"Turn\n left" [ rotation-step turn-left ] camera-button "Turn\n left" [ rotation-step turn-left ]
@left grid-add camera-button @left grid-add
"Turn\n right" [ rotation-step turn-right ] camera-button "Turn\n right" [ rotation-step turn-right ]
@right grid-add camera-button @right grid-add
"Pitch down" [ rotation-step pitch-down ] camera-button "Pitch down" [ rotation-step pitch-down ]
@bottom grid-add camera-button @bottom grid-add
"Pitch up" [ rotation-step pitch-up ] camera-button "Pitch up" [ rotation-step pitch-up ]
@top grid-add camera-button @top grid-add
<shelf> 1 >>fill <shelf> 1 >>fill
"Roll left\n (ctl)" [ rotation-step roll-left ] camera-button "Roll left\n (ctl)" [ rotation-step roll-left ]
add-gadget camera-button add-gadget
"Roll right\n(ctl)" [ rotation-step roll-right ] camera-button "Roll right\n(ctl)" [ rotation-step roll-right ]
add-gadget camera-button add-gadget
@center grid-add @center grid-add
; ;
: menu-translations-3D ( -- gadget ) : menu-translations-3D ( -- gadget )
<frame> <frame>
"left\n(alt)" [ translation-step strafe-left ] camera-button "left\n(alt)" [ translation-step strafe-left ]
@left grid-add camera-button @left grid-add
"right\n(alt)" [ translation-step strafe-right ] camera-button "right\n(alt)" [ translation-step strafe-right ]
@right grid-add camera-button @right grid-add
"Strafe up \n (alt)" [ translation-step strafe-up ] camera-button "Strafe up \n (alt)" [ translation-step strafe-up ]
@top grid-add camera-button @top grid-add
"Strafe down \n (alt)" [ translation-step strafe-down ] camera-button "Strafe down\n (alt)" [ translation-step strafe-down ]
@bottom grid-add camera-button @bottom grid-add
<pile> 1 >>fill <pile> 1 >>fill
"Forward (ctl)" [ translation-step step-turtle ] camera-button "Forward (ctl)" [ translation-step step-turtle ]
add-gadget camera-button add-gadget
"Backward (ctl)" [ translation-step neg step-turtle ] camera-button "Backward (ctl)"
add-gadget [ translation-step neg step-turtle ]
camera-button add-gadget
@center grid-add @center grid-add
; ;
@ -370,22 +397,23 @@ VAR: present-space
[ [ rotation-step pitch-up ] camera-action ] } [ [ rotation-step pitch-up ] camera-action ] }
{ T{ key-down f { C+ } "UP" } { T{ key-down f { C+ } "UP" }
[ [ translation-step step-turtle ] camera-action ] } [ [ translation-step step-turtle ] camera-action ] }
{ T{ key-down f { C+ } "DOWN" } { T{ key-down f { C+ } "DOWN" }
[ [ translation-step neg step-turtle ] camera-action ] } [ [ translation-step neg step-turtle ]
camera-action ] }
{ T{ key-down f { C+ } "LEFT" } { T{ key-down f { C+ } "LEFT" }
[ [ rotation-step roll-left ] camera-action ] } [ [ rotation-step roll-left ] camera-action ] }
{ T{ key-down f { C+ } "RIGHT" } { T{ key-down f { C+ } "RIGHT" }
[ [ rotation-step roll-right ] camera-action ] } [ [ rotation-step roll-right ] camera-action ] }
{ T{ key-down f { A+ } "LEFT" } { T{ key-down f { A+ } "LEFT" }
[ [ translation-step strafe-left ] camera-action ] } [ [ translation-step strafe-left ] camera-action ] }
{ T{ key-down f { A+ } "RIGHT" } { T{ key-down f { A+ } "RIGHT" }
[ [ translation-step strafe-right ] camera-action ] } [ [ translation-step strafe-right ] camera-action ] }
{ T{ key-down f { A+ } "UP" } { T{ key-down f { A+ } "UP" }
[ [ translation-step strafe-up ] camera-action ] } [ [ translation-step strafe-up ] camera-action ] }
{ T{ key-down f { A+ } "DOWN" } { T{ key-down f { A+ } "DOWN" }
[ [ translation-step strafe-down ] camera-action ] } [ [ translation-step strafe-down ] camera-action ] }
{ T{ key-down f f "1" } [ mvt-3D-1 camera-action ] } { T{ key-down f f "1" } [ mvt-3D-1 camera-action ] }
@ -422,23 +450,26 @@ M: solid adsoda-display-model
[ name>> "solid called : " pprint . ] [ name>> "solid called : " pprint . ]
[ color>> "color : " pprint . ] [ color>> "color : " pprint . ]
[ dimension>> "dimension : " pprint . ] [ dimension>> "dimension : " pprint . ]
[ faces>> "composed of faces : " pprint [ adsoda-display-model ] each ] [ faces>> "composed of faces : " pprint
[ adsoda-display-model ] each ]
} cleave } cleave
; ;
M: space adsoda-display-model M: space adsoda-display-model
{ {
[ dimension>> "dimension : " pprint . ] [ dimension>> "dimension : " pprint . ]
[ ambient-color>> "ambient-color : " pprint . ] [ ambient-color>> "ambient-color : " pprint . ]
[ solids>> "composed of solids : " pprint [ adsoda-display-model ] each ] [ solids>> "composed of solids : " pprint
[ lights>> "composed of lights : " pprint [ adsoda-display-model ] each ] [ adsoda-display-model ] each ]
[ lights>> "composed of lights : " pprint
[ adsoda-display-model ] each ]
} cleave } cleave
; ;
! ---------------------------------------------- ! ----------------------------------------------
: menu-bar ( -- gadget ) : menu-bar ( -- gadget )
<shelf> <shelf>
"reinit" [ drop load-model-file ] button* add-gadget "reinit" [ drop load-model-file ] button* add-gadget
selected-file-model> <label-control> add-gadget selected-file-model> <label-control> add-gadget
; ;
@ -454,7 +485,8 @@ M: space adsoda-display-model
model-projection-chooser add-gadget model-projection-chooser add-gadget
f track-add f track-add
<shelf> <shelf>
"Collision detection (slow and buggy ) : " <label> add-gadget "Collision detection (slow and buggy ) : "
<label> add-gadget
collision-detection-chooser add-gadget collision-detection-chooser add-gadget
f track-add f track-add
<pile> <pile>

View File

@ -6,31 +6,31 @@ IN: 4DNav.camera
HELP: camera-eye HELP: camera-eye
{ $values { $values
{ "point" null } { "point" "position" }
} }
{ $description "return the position of the camera" } ; { $description "return the position of the camera" } ;
HELP: camera-focus HELP: camera-focus
{ $values { $values
{ "point" null } { "point" "position" }
} }
{ $description "return the point the camera looks at" } ; { $description "return the point the camera looks at" } ;
HELP: camera-up HELP: camera-up
{ $values { $values
{ "dirvec" null } { "dirvec" "upside direction" }
} }
{ $description "In order to precise the roling position of camera give an upward vector" } ; { $description "In order to precise the roling position of camera give an upward vector" } ;
HELP: do-look-at HELP: do-look-at
{ $values { $values
{ "camera" null } { "camera" "direction" }
} }
{ $description "Word to use in replacement of gl-look-at when using a camera" } ; { $description "Word to use in replacement of gl-look-at when using a camera" } ;
ARTICLE: "4DNav.camera" "4DNav.camera" ARTICLE: "4DNav.camera" "Camera"
{ $vocab-link "4DNav.camera" } { $vocab-link "4DNav.camera" }
"\n" "\n"
"A camera is defined by:" "A camera is defined by:"

View File

@ -1,15 +1,19 @@
USING: kernel namespaces math.vectors opengl 4DNav.turtle self ; USING: kernel namespaces math.vectors opengl 4DNav.turtle
self ;
IN: 4DNav.camera IN: 4DNav.camera
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: camera-eye ( -- point ) turtle-pos> ; : camera-eye ( -- point ) turtle-pos> ;
: camera-focus ( -- point ) [ 1 step-turtle turtle-pos> ] save-self ; : camera-focus ( -- point )
[ 1 step-turtle turtle-pos> ] save-self ;
: camera-up ( -- dirvec ) : camera-up ( -- dirvec )
[ 90 pitch-up turtle-pos> 1 step-turtle turtle-pos> swap v- ] save-self ; [ 90 pitch-up turtle-pos> 1 step-turtle turtle-pos> swap v- ]
save-self ;
: do-look-at ( camera -- ) : do-look-at ( camera -- )
[ >self camera-eye camera-focus camera-up gl-look-at ] with-scope ; [ >self camera-eye camera-focus camera-up gl-look-at ]
with-scope ;

View File

@ -24,7 +24,7 @@ IN: 4DNav.deep
! } } ! } }
! ; ! ;
ARTICLE: "4DNav.deep" "4DNav.deep" ARTICLE: "4DNav.deep" "Deep"
{ $vocab-link "4DNav.deep" } { $vocab-link "4DNav.deep" }
; ;

View File

@ -1,4 +1,5 @@
USING: macros quotations math math.functions math.trig sequences.deep kernel make fry combinators grouping ; USING: macros quotations math math.functions math.trig
sequences.deep kernel make fry combinators grouping ;
IN: 4DNav.deep IN: 4DNav.deep
! USING: bake ; ! USING: bake ;
@ -7,5 +8,6 @@ IN: 4DNav.deep
! [ [ dup quotation? [ drop , ] when ] deep-map ] ! [ [ dup quotation? [ drop , ] when ] deep-map ]
! bi '[ _ cleave _ bake ] ; ! bi '[ _ cleave _ bake ] ;
: make-matrix ( quot width -- matrix ) [ { } make ] dip group ; inline : make-matrix ( quot width -- matrix )
[ { } make ] dip group ; inline

View File

@ -45,18 +45,26 @@ TUPLE: file-chooser < track
[ file-chooser? ] find-parent list>> ; [ file-chooser? ] find-parent list>> ;
file-chooser H{ file-chooser H{
{ T{ key-down f f "UP" } [ find-file-list select-previous ] } { T{ key-down f f "UP" }
{ T{ key-down f f "DOWN" } [ find-file-list select-next ] } [ find-file-list select-previous ] }
{ T{ key-down f f "PAGE_UP" } [ find-file-list list-page-up ] } { T{ key-down f f "DOWN" }
{ T{ key-down f f "PAGE_DOWN" } [ find-file-list list-page-down ] } [ find-file-list select-next ] }
{ T{ key-down f f "RET" } [ find-file-list invoke-value-action ] } { T{ key-down f f "PAGE_UP" }
{ T{ button-down } request-focus } [ find-file-list list-page-up ] }
{ T{ button-down f 1 } [ find-file-list invoke-value-action ] } { T{ key-down f f "PAGE_DOWN" }
[ find-file-list list-page-down ] }
{ T{ key-down f f "RET" }
[ find-file-list invoke-value-action ] }
{ T{ button-down }
request-focus }
{ T{ button-down f 1 }
[ find-file-list invoke-value-action ] }
} set-gestures } set-gestures
: list-of-files ( file-chooser -- seq ) : list-of-files ( file-chooser -- seq )
[ path>> value>> directory-entries ] [ extension>> ] bi [ path>> value>> directory-entries ] [ extension>> ] bi
'[ [ name>> _ [ tail? ] with contains? ] [ directory? ] bi or ] filter '[ [ name>> _ [ tail? ] with any? ]
[ directory? ] bi or ] filter
; ;
: update-filelist-model ( file-chooser -- file-chooser ) : update-filelist-model ( file-chooser -- file-chooser )
@ -123,15 +131,19 @@ file-chooser H{
dup <file-list> >>list dup <file-list> >>list
"choose a file in directory " <label> f track-add "choose a file in directory " <label> f track-add
dup path>> <label-control> f track-add dup path>> <label-control> f track-add
dup extension>> ", " join "limited to : " prepend <label> f track-add dup extension>> ", " join "limited to : " prepend
<label> f track-add
<shelf> <shelf>
"selected file : " <label> add-gadget "selected file : " <label> add-gadget
over selected-file>> <label-control> add-gadget over selected-file>> <label-control> add-gadget
f track-add f track-add
<shelf> <shelf>
over [ swap fc-go-parent ] curry "go up" swap <bevel-button> add-gadget over [ swap fc-go-parent ] curry "go up"
over [ swap fc-go-home ] curry "go home" swap <bevel-button> add-gadget swap <bevel-button> add-gadget
! over [ swap fc-ok-action ] curry "OK" swap <bevel-button> add-gadget over [ swap fc-go-home ] curry "go home"
swap <bevel-button> add-gadget
! over [ swap fc-ok-action ] curry "OK"
! swap <bevel-button> add-gadget
! [ drop ] "Cancel" swap <bevel-button> add-gadget ! [ drop ] "Cancel" swap <bevel-button> add-gadget
f track-add f track-add
dup list>> <scroller> 1 track-add dup list>> <scroller> 1 track-add
@ -140,5 +152,6 @@ file-chooser H{
M: file-chooser pref-dim* drop { 400 200 } ; M: file-chooser pref-dim* drop { 400 200 } ;
: file-chooser-window ( -- ) : file-chooser-window ( -- )
[ . ] home { "xml" "txt" } <file-chooser> "Choose a file" open-window ; [ . ] home { "xml" "txt" } <file-chooser>
"Choose a file" open-window ;

View File

@ -3,28 +3,17 @@
USING: help.markup help.syntax kernel ; USING: help.markup help.syntax kernel ;
IN: 4DNav.space-file-decoder IN: 4DNav.space-file-decoder
HELP: adsoda-read-model
{ $values
{ "tag" null }
}
{ $description "" } ;
HELP: decode-number-array
{ $values
{ "x" null }
{ "y" null }
}
{ $description "" } ;
HELP: read-model-file HELP: read-model-file
{ $values { $values
{ "path" "path to the file to read" } { "path" "path to the file to read" }
{ "x" null } { "x" "value" }
} }
{ $description "" } ; { $description "Read a file containing the xml description of the model" } ;
ARTICLE: "4DNav.space-file-decoder" "4DNav.space-file-decoder" ARTICLE: "4DNav.space-file-decoder" "Space XMLfile decoder"
{ $vocab-link "4DNav.space-file-decoder" } { $vocab-link "4DNav.space-file-decoder" }
; ;

View File

@ -1,26 +1,34 @@
! Copyright (C) 2008 Jeff Bigot ! Copyright (C) 2008 Jeff Bigot
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: adsoda xml xml.utilities xml.dispatch accessors combinators USING: adsoda xml xml.utilities xml.dispatch accessors
sequences math.parser kernel splitting values continuations ; combinators sequences math.parser kernel splitting values
continuations ;
IN: 4DNav.space-file-decoder IN: 4DNav.space-file-decoder
: decode-number-array ( x -- y ) "," split [ string>number ] map ; : decode-number-array ( x -- y )
"," split [ string>number ] map ;
PROCESS: adsoda-read-model ( tag -- ) PROCESS: adsoda-read-model ( tag -- )
TAG: dimension adsoda-read-model children>> first string>number ; TAG: dimension adsoda-read-model
TAG: direction adsoda-read-model children>> first decode-number-array ; children>> first string>number ;
TAG: color adsoda-read-model children>> first decode-number-array ; TAG: direction adsoda-read-model
TAG: name adsoda-read-model children>> first ; children>> first decode-number-array ;
TAG: face adsoda-read-model children>> first decode-number-array ; TAG: color adsoda-read-model
children>> first decode-number-array ;
TAG: name adsoda-read-model
children>> first ;
TAG: face adsoda-read-model
children>> first decode-number-array ;
TAG: solid adsoda-read-model TAG: solid adsoda-read-model
<solid> swap <solid> swap
{ {
[ "dimension" tag-named adsoda-read-model >>dimension ] [ "dimension" tag-named adsoda-read-model >>dimension ]
[ "name" tag-named adsoda-read-model >>name ] [ "name" tag-named adsoda-read-model >>name ]
[ "color" tag-named adsoda-read-model >>color ] [ "color" tag-named adsoda-read-model >>color ]
[ "face" tags-named [ adsoda-read-model cut-solid ] each ] [ "face"
tags-named [ adsoda-read-model cut-solid ] each ]
} cleave } cleave
ensure-adjacencies ensure-adjacencies
; ;
@ -28,7 +36,7 @@ TAG: solid adsoda-read-model
TAG: light adsoda-read-model TAG: light adsoda-read-model
<light> swap <light> swap
{ {
[ "direction" tag-named adsoda-read-model >>direction ] [ "direction" tag-named adsoda-read-model >>direction ]
[ "color" tag-named adsoda-read-model >>color ] [ "color" tag-named adsoda-read-model >>color ]
} cleave } cleave
; ;
@ -36,11 +44,14 @@ TAG: light adsoda-read-model
TAG: space adsoda-read-model TAG: space adsoda-read-model
<space> swap <space> swap
{ {
[ "dimension" tag-named adsoda-read-model >>dimension ] [ "dimension" tag-named adsoda-read-model >>dimension ]
[ "name" tag-named adsoda-read-model >>name ] [ "name" tag-named adsoda-read-model >>name ]
[ "color" tag-named adsoda-read-model >>ambient-color ] [ "color" tag-named
[ "solid" tags-named [ adsoda-read-model suffix-solids ] each ] adsoda-read-model >>ambient-color ]
[ "light" tags-named [ adsoda-read-model suffix-lights ] each ] [ "solid" tags-named
[ adsoda-read-model suffix-solids ] each ]
[ "light" tags-named
[ adsoda-read-model suffix-lights ] each ]
} cleave } cleave
; ;

View File

@ -3,226 +3,8 @@
USING: arrays help.markup help.syntax kernel sequences ; USING: arrays help.markup help.syntax kernel sequences ;
IN: 4DNav.turtle IN: 4DNav.turtle
HELP: <turtle>
{ $values
{ "turtle" null }
}
{ $description "" } ;
HELP: >turtle-ori ARTICLE: "4DNav.turtle" "Turtle"
{ $values
{ "val" null }
}
{ $description "" } ;
HELP: >turtle-pos
{ $values
{ "val" null }
}
{ $description "" } ;
HELP: Rx
{ $values
{ "angle" null }
{ "Rz" null }
}
{ $description "" } ;
HELP: Ry
{ $values
{ "angle" null }
{ "Ry" null }
}
{ $description "" } ;
HELP: Rz
{ $values
{ "angle" null }
{ "Rx" null }
}
{ $description "" } ;
HELP: V
{ $values
{ "V" null }
}
{ $description "" } ;
HELP: X
{ $values
{ "3array" null }
}
{ $description "" } ;
HELP: Y
{ $values
{ "3array" null }
}
{ $description "" } ;
HELP: Z
{ $values
{ "3array" null }
}
{ $description "" } ;
HELP: apply-rotation
{ $values
{ "rotation" null }
}
{ $description "" } ;
HELP: distance
{ $values
{ "turtle" null } { "turtle" null }
{ "n" null }
}
{ $description "" } ;
HELP: move-by
{ $values
{ "point" null }
}
{ $description "" } ;
HELP: pitch-down
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: pitch-up
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: reset-turtle
{ $description "" } ;
HELP: roll-left
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: roll-right
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: roll-until-horizontal
{ $description "" } ;
HELP: rotate-x
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: rotate-y
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: rotate-z
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: set-X
{ $values
{ "seq" sequence }
}
{ $description "" } ;
HELP: set-Y
{ $values
{ "seq" sequence }
}
{ $description "" } ;
HELP: set-Z
{ $values
{ "seq" sequence }
}
{ $description "" } ;
HELP: step-turtle
{ $values
{ "length" null }
}
{ $description "" } ;
HELP: step-vector
{ $values
{ "length" null }
{ "array" array }
}
{ $description "" } ;
HELP: strafe-down
{ $values
{ "length" null }
}
{ $description "" } ;
HELP: strafe-left
{ $values
{ "length" null }
}
{ $description "" } ;
HELP: strafe-right
{ $values
{ "length" null }
}
{ $description "" } ;
HELP: strafe-up
{ $values
{ "length" null }
}
{ $description "" } ;
HELP: turn-left
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: turn-right
{ $values
{ "angle" null }
}
{ $description "" } ;
HELP: turtle
{ $description "" } ;
HELP: turtle-ori>
{ $values
{ "val" null }
}
{ $description "" } ;
HELP: turtle-pos>
{ $values
{ "val" null }
}
{ $description "" } ;
ARTICLE: "4DNav.turtle" "4DNav.turtle"
{ $vocab-link "4DNav.turtle" } { $vocab-link "4DNav.turtle" }
; ;

View File

@ -6,7 +6,7 @@ splitting grouping self math.trig
sequences accessors 4DNav.deep models ; sequences accessors 4DNav.deep models ;
IN: 4DNav.turtle IN: 4DNav.turtle
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TUPLE: turtle pos ori ; TUPLE: turtle pos ori ;
@ -32,7 +32,7 @@ TUPLE: observer < turtle projection-mode collision-mode ;
: turtle-ori> ( -- val ) self> ori>> ; : turtle-ori> ( -- val ) self> ori>> ;
: >turtle-ori ( val -- ) self> (>>ori) ; : >turtle-ori ( val -- ) self> (>>ori) ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! These rotation matrices are from ! These rotation matrices are from
! `Computer Graphics: Principles and Practice' ! `Computer Graphics: Principles and Practice'
@ -74,15 +74,15 @@ TUPLE: observer < turtle projection-mode collision-mode ;
0 , dup sin , dup cos , ] 3 make-matrix nip ; 0 , dup sin , dup cos , ] 3 make-matrix nip ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: apply-rotation ( rotation -- ) turtle-ori> swap m. >turtle-ori ;
: apply-rotation ( rotation -- )
turtle-ori> swap m. >turtle-ori ;
: rotate-x ( angle -- ) Rx apply-rotation ; : rotate-x ( angle -- ) Rx apply-rotation ;
: rotate-y ( angle -- ) Ry apply-rotation ; : rotate-y ( angle -- ) Ry apply-rotation ;
: rotate-z ( angle -- ) Rz apply-rotation ; : rotate-z ( angle -- ) Rz apply-rotation ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: pitch-up ( angle -- ) neg rotate-x ; : pitch-up ( angle -- ) neg rotate-x ;
: pitch-down ( angle -- ) rotate-x ; : pitch-down ( angle -- ) rotate-x ;
@ -93,9 +93,9 @@ TUPLE: observer < turtle projection-mode collision-mode ;
: roll-left ( angle -- ) neg rotate-z ; : roll-left ( angle -- ) neg rotate-z ;
: roll-right ( angle -- ) rotate-z ; : roll-right ( angle -- ) rotate-z ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! roll-until-horizontal ! roll-until-horizontal
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: V ( -- V ) { 0 1 0 } ; : V ( -- V ) { 0 1 0 } ;
@ -111,25 +111,27 @@ TUPLE: observer < turtle projection-mode collision-mode ;
V Z cross normalize set-X V Z cross normalize set-X
Z X cross normalize set-Y ; Z X cross normalize set-Y ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: distance ( turtle turtle -- n ) pos>> swap pos>> v- [ sq ] map sum sqrt ; : distance ( turtle turtle -- n )
pos>> swap pos>> v- [ sq ] map sum sqrt ;
: move-by ( point -- ) turtle-pos> v+ >turtle-pos ; : move-by ( point -- ) turtle-pos> v+ >turtle-pos ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: reset-turtle ( -- ) : reset-turtle ( -- )
{ 0 0 0 } clone >turtle-pos 3 identity-matrix >turtle-ori ; { 0 0 0 } clone >turtle-pos 3 identity-matrix >turtle-ori ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: step-vector ( length -- array ) { 0 0 1 } n*v ; : step-vector ( length -- array ) { 0 0 1 } n*v ;
: step-turtle ( length -- ) : step-turtle ( length -- )
step-vector turtle-ori> swap m.v turtle-pos> v+ >turtle-pos ; step-vector turtle-ori> swap m.v
turtle-pos> v+ >turtle-pos ;
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
: strafe-up ( length -- ) : strafe-up ( length -- )
90 pitch-up 90 pitch-up

View File

@ -3,17 +3,9 @@
USING: help.markup help.syntax kernel ; USING: help.markup help.syntax kernel ;
IN: 4DNav.window3D IN: 4DNav.window3D
HELP: <window3D>
{ $values
{ "model" null } { "observer" null }
{ "gadget" null }
}
{ $description "" } ;
HELP: window3D
{ $description "" } ;
ARTICLE: "4DNav.window3D" "4DNav.window3D" ARTICLE: "4DNav.window3D" "Window3D"
{ $vocab-link "4DNav.window3D" } { $vocab-link "4DNav.window3D" }
; ;

View File

@ -21,9 +21,9 @@ prettyprint
IN: 4DNav.window3D IN: 4DNav.window3D
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! drawing functions ! drawing functions
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TUPLE: window3D < gadget observer ; TUPLE: window3D < gadget observer ;
@ -63,7 +63,8 @@ M: window3D draw-gadget* ( gadget -- )
GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
GL_LINE_SMOOTH_HINT GL_NICEST glHint GL_LINE_SMOOTH_HINT GL_NICEST glHint
1.25 glLineWidth 1.25 glLineWidth
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor
glClear
glLoadIdentity glLoadIdentity
GL_LIGHTING glEnable GL_LIGHTING glEnable
GL_LIGHT0 glEnable GL_LIGHT0 glEnable

View File

@ -9,7 +9,7 @@ IN: adsoda
! -------------------------------------------------------------- ! --------------------------------------------------------------
! faces ! faces
! -------------------------------------------------------------- ! --------------------------------------------------------------
ARTICLE: "face-page" "face in ADSODA" ARTICLE: "face-page" "Face in ADSODA"
"explanation of faces" "explanation of faces"
$nl $nl
"link to functions" "link to functions"
@ -65,7 +65,7 @@ HELP: face-transform
! -------------------------------- ! --------------------------------
! solid ! solid
! -------------------------------------------------------------- ! --------------------------------------------------------------
ARTICLE: "solid-page" "solid in ADSODA" ARTICLE: "solid-page" "Solid in ADSODA"
"explanation of solids" "explanation of solids"
$nl $nl
"link to functions" "link to functions"
@ -133,13 +133,13 @@ $nl
HELP: subtract HELP: subtract
{ $values { "solid1" "initial shape" } { "solid2" "shape to remove" } { "solids" "resulting shape" } } { $values { "solid1" "initial shape" } { "solid2" "shape to remove" } { "solids" "resulting shape" } }
{ $description " " } ; { $description "Substract solid2 from solid1" } ;
! -------------------------------------------------------------- ! --------------------------------------------------------------
! space ! space
! -------------------------------------------------------------- ! --------------------------------------------------------------
ARTICLE: "space-page" "space in ADSODA" ARTICLE: "space-page" "Space in ADSODA"
"A space is a collection of solids and lights." "A space is a collection of solids and lights."
$nl $nl
"link to functions" "link to functions"
@ -211,7 +211,7 @@ HELP: space-project
! -------------------------------------------------------------- ! --------------------------------------------------------------
! 3D rendering ! 3D rendering
! -------------------------------------------------------------- ! --------------------------------------------------------------
ARTICLE: "3D-rendering-page" "3D rendering in ADSODA" ARTICLE: "3D-rendering-page" "The 3D rendering in ADSODA"
"explanation of 3D rendering" "explanation of 3D rendering"
$nl $nl
"link to functions" "link to functions"
@ -223,21 +223,21 @@ $nl
HELP: face->GL HELP: face->GL
{ $values { "face" "a face" } { "color" "3 3 values array" } } { $values { "face" "a face" } { "color" "3 3 values array" } }
{ $description "" } ; { $description "display a face" } ;
HELP: solid->GL HELP: solid->GL
{ $values { "solid" "a solid" } } { $values { "solid" "a solid" } }
{ $description "" } ; { $description "display a solid" } ;
HELP: space->GL HELP: space->GL
{ $values { "space" "a space" } } { $values { "space" "a space" } }
{ $description "" } ; { $description "display a space" } ;
! -------------------------------------------------------------- ! --------------------------------------------------------------
! light ! light
! -------------------------------------------------------------- ! --------------------------------------------------------------
ARTICLE: "light-page" "light in ADSODA" ARTICLE: "light-page" "Light in ADSODA"
"explanation of light" "explanation of light"
$nl $nl
"link to functions" "link to functions"
@ -274,7 +274,6 @@ ARTICLE: { "adsoda" "light" } "ADSODA : lights"
ARTICLE: { "adsoda" "halfspace" } "ADSODA : halfspace" ARTICLE: { "adsoda" "halfspace" } "ADSODA : halfspace"
"! demi espace défini par un vecteur normal et une constante"
" defined by the concatenation of the normal vector and a constant" " defined by the concatenation of the normal vector and a constant"
; ;

View File

@ -41,7 +41,7 @@ DEFER: combinations
VAR: pv VAR: pv
! --------------------------------------------------------------------- ! -------------------------------------------------------------
! global values ! global values
VALUE: remove-hidden-solids? VALUE: remove-hidden-solids?
VALUE: VERY-SMALL-NUM VALUE: VERY-SMALL-NUM
@ -52,25 +52,26 @@ t to: remove-hidden-solids?
0.0000001 to: VERY-SMALL-NUM 0.0000001 to: VERY-SMALL-NUM
0.0000001 to: ZERO-VALUE 0.0000001 to: ZERO-VALUE
4 to: MAX-FACE-PER-CORNER 4 to: MAX-FACE-PER-CORNER
! --------------------------------------------------------------------- ! -------------------------------------------------------------
! sequence complement ! sequence complement
: with-pv ( i quot -- ) [ swap >pv call ] with-scope ; inline : with-pv ( i quot -- ) [ swap >pv call ] with-scope ; inline
: dimension ( array -- x ) length 1- ; inline : dimension ( array -- x ) length 1- ; inline
: last ( seq -- x ) [ dimension ] [ nth ] bi ; inline : last ( seq -- x ) [ dimension ] [ nth ] bi ; inline
: change-last ( seq quot -- ) [ [ dimension ] keep ] dip change-nth ; : change-last ( seq quot -- )
[ [ dimension ] keep ] dip change-nth ;
! -------------------------------------------------------------- ! -------------------------------------------------------------
! light ! light
! -------------------------------------------------------------- ! -------------------------------------------------------------
TUPLE: light name { direction array } color ; TUPLE: light name { direction array } color ;
: <light> ( -- tuple ) light new ; : <light> ( -- tuple ) light new ;
! ----------------------------------------------------------------------- ! -------------------------------------------------------------
! halfspace manipulation ! halfspace manipulation
! ----------------------------------------------------------------------- ! -------------------------------------------------------------
: constant+ ( v x -- w ) '[ [ _ + ] change-last ] keep ; : constant+ ( v x -- w ) '[ [ _ + ] change-last ] keep ;
: translate ( u v -- w ) dupd v* sum constant+ ; : translate ( u v -- w ) dupd v* sum constant+ ;
@ -78,7 +79,8 @@ TUPLE: light name { direction array } color ;
: transform ( u matrix -- w ) : transform ( u matrix -- w )
[ swap m.v ] 2keep ! compute new normal vector [ swap m.v ] 2keep ! compute new normal vector
[ [
[ [ abs ZERO-VALUE > ] find ] keep ! find a point on the frontier [ [ abs ZERO-VALUE > ] find ] keep
! find a point on the frontier
! be sure it's not null vector ! be sure it's not null vector
last ! get constant last ! get constant
swap /f neg swap ! intercept value swap /f neg swap ! intercept value
@ -97,8 +99,10 @@ TUPLE: light name { direction array } color ;
position-point VERY-SMALL-NUM > ; position-point VERY-SMALL-NUM > ;
: point-inside-or-on-halfspace? ( halfspace v -- ? ) : point-inside-or-on-halfspace? ( halfspace v -- ? )
position-point VERY-SMALL-NUM neg > ; position-point VERY-SMALL-NUM neg > ;
: project-vector ( seq -- seq ) pv> [ head ] [ 1+ tail ] 2bi append ; : project-vector ( seq -- seq )
: get-intersection ( matrice -- seq ) [ 1 tail* ] map flip first ; pv> [ head ] [ 1+ tail ] 2bi append ;
: get-intersection ( matrice -- seq )
[ 1 tail* ] map flip first ;
: islenght=? ( seq n -- seq n ? ) 2dup [ length ] [ = ] bi* ; : islenght=? ( seq n -- seq n ? ) 2dup [ length ] [ = ] bi* ;
@ -117,29 +121,33 @@ TUPLE: light name { direction array } color ;
[ solution dup ] [ first dimension ] bi [ solution dup ] [ first dimension ] bi
valid-solution? [ get-intersection ] [ drop f ] if ; valid-solution? [ get-intersection ] [ drop f ] if ;
! -------------------------------------------------------------- ! -------------------------------------------------------------
! faces ! faces
! -------------------------------------------------------------- ! -------------------------------------------------------------
TUPLE: face { halfspace array } touching-corners adjacent-faces ; TUPLE: face { halfspace array }
touching-corners adjacent-faces ;
: <face> ( v -- tuple ) face new swap >>halfspace ; : <face> ( v -- tuple ) face new swap >>halfspace ;
: flip-face ( face -- face ) [ vneg ] change-halfspace ; : flip-face ( face -- face ) [ vneg ] change-halfspace ;
: erase-face-touching-corners ( face -- face ) f >>touching-corners ; : erase-face-touching-corners ( face -- face )
: erase-face-adjacent-faces ( face -- face ) f >>adjacent-faces ; f >>touching-corners ;
: erase-face-adjacent-faces ( face -- face )
f >>adjacent-faces ;
: faces-intersection ( faces -- v ) : faces-intersection ( faces -- v )
[ halfspace>> ] map intersect-hyperplanes ; [ halfspace>> ] map intersect-hyperplanes ;
: face-translate ( face v -- face ) : face-translate ( face v -- face )
[ translate ] curry change-halfspace ; inline [ translate ] curry change-halfspace ; inline
: face-transform ( face m -- face ) : face-transform ( face m -- face )
[ transform ] curry change-halfspace ; inline [ transform ] curry change-halfspace ; inline
: face-orientation ( face -- x ) pv> swap halfspace>> nth sgn ; : face-orientation ( face -- x ) pv> swap halfspace>> nth sgn ;
: backface? ( face -- face ? ) dup face-orientation 0 <= ; : backface? ( face -- face ? ) dup face-orientation 0 <= ;
: pv-factor ( face -- f face ) : pv-factor ( face -- f face )
halfspace>> [ pv> swap nth [ * ] curry ] keep ; inline halfspace>> [ pv> swap nth [ * ] curry ] keep ; inline
: suffix-touching-corner ( face corner -- face ) : suffix-touching-corner ( face corner -- face )
[ suffix ] curry change-touching-corners ; inline [ suffix ] curry change-touching-corners ; inline
: real-face? ( face -- ? ) : real-face? ( face -- ? )
[ touching-corners>> length ] [ halfspace>> dimension ] bi >= ; [ touching-corners>> length ]
[ halfspace>> dimension ] bi >= ;
: (add-to-adjacent-faces) ( face face -- face ) : (add-to-adjacent-faces) ( face face -- face )
over adjacent-faces>> 2dup member? over adjacent-faces>> 2dup member?
@ -203,7 +211,8 @@ TUPLE: face { halfspace array } touching-corners adjacent-faces ;
[ ] (intersection-into-face) ; [ ] (intersection-into-face) ;
: intersections-into-faces ( face -- faces ) : intersections-into-faces ( face -- faces )
clone dup adjacent-faces>> [ intersection-into-face ] with map clone dup
adjacent-faces>> [ intersection-into-face ] with map
[ ] filter ; [ ] filter ;
: (face-silhouette) ( face -- faces ) : (face-silhouette) ( face -- faces )
@ -219,30 +228,32 @@ TUPLE: face { halfspace array } touching-corners adjacent-faces ;
! -------------------------------- ! --------------------------------
! solid ! solid
! -------------------------------------------------------------- ! -------------------------------------------------------------
TUPLE: solid dimension silhouettes faces corners adjacencies-valid color name ; TUPLE: solid dimension silhouettes
faces corners adjacencies-valid color name ;
: <solid> ( -- tuple ) solid new ; : <solid> ( -- tuple ) solid new ;
: suffix-silhouettes ( solid silhouette -- solid ) : suffix-silhouettes ( solid silhouette -- solid )
[ suffix ] curry change-silhouettes ; [ suffix ] curry change-silhouettes ;
: suffix-face ( solid face -- solid ) [ suffix ] curry change-faces ; : suffix-face ( solid face -- solid )
[ suffix ] curry change-faces ;
: suffix-corner ( solid corner -- solid ) [ suffix ] curry change-corners ; : suffix-corner ( solid corner -- solid )
[ suffix ] curry change-corners ;
: erase-solid-corners ( solid -- solid ) f >>corners ; : erase-solid-corners ( solid -- solid ) f >>corners ;
: erase-silhouettes ( solid -- solid ) dup dimension>> f <array> >>silhouettes ; : erase-silhouettes ( solid -- solid )
dup dimension>> f <array> >>silhouettes ;
: filter-real-faces ( solid -- solid ) [ [ real-face? ] filter ] change-faces ; : filter-real-faces ( solid -- solid )
[ [ real-face? ] filter ] change-faces ;
: initiate-solid-from-face ( face -- solid ) : initiate-solid-from-face ( face -- solid )
face-project-dim <solid> swap >>dimension ; face-project-dim <solid> swap >>dimension ;
: erase-old-adjacencies ( solid -- solid ) : erase-old-adjacencies ( solid -- solid )
erase-solid-corners erase-solid-corners
[ dup [ erase-face-touching-corners erase-face-adjacent-faces drop ] each ] [ dup [ erase-face-touching-corners
erase-face-adjacent-faces drop ] each ]
change-faces ; change-faces ;
: point-inside-or-on-face? ( face v -- ? ) : point-inside-or-on-face? ( face v -- ? )
@ -252,13 +263,15 @@ TUPLE: solid dimension silhouettes faces corners adjacencies-valid color name ;
[ halfspace>> ] dip point-inside-halfspace? ; [ halfspace>> ] dip point-inside-halfspace? ;
: point-inside-solid? ( solid point -- ? ) : point-inside-solid? ( solid point -- ? )
[ faces>> ] dip [ point-inside-face? ] curry all? ; inline [ faces>> ] dip [ point-inside-face? ] curry all? ; inline
: point-inside-or-on-solid? ( solid point -- ? ) : point-inside-or-on-solid? ( solid point -- ? )
[ faces>> ] dip [ point-inside-or-on-face? ] curry all? ; inline [ faces>> ] dip
[ point-inside-or-on-face? ] curry all? ; inline
: unvalid-adjacencies ( solid -- solid ) : unvalid-adjacencies ( solid -- solid )
erase-old-adjacencies f >>adjacencies-valid erase-silhouettes ; erase-old-adjacencies f >>adjacencies-valid
erase-silhouettes ;
: add-face ( solid face -- solid ) : add-face ( solid face -- solid )
suffix-face unvalid-adjacencies ; suffix-face unvalid-adjacencies ;
@ -338,8 +351,10 @@ TUPLE: solid dimension silhouettes faces corners adjacencies-valid color name ;
ensure-silhouettes ensure-silhouettes
; ;
: (non-empty-solid?) ( solid -- ? ) [ dimension>> ] [ corners>> length ] bi < ; : (non-empty-solid?) ( solid -- ? )
: non-empty-solid? ( solid -- ? ) ensure-adjacencies (non-empty-solid?) ; [ dimension>> ] [ corners>> length ] bi < ;
: non-empty-solid? ( solid -- ? )
ensure-adjacencies (non-empty-solid?) ;
: compare-corners-roughly ( corner corner -- ? ) : compare-corners-roughly ( corner corner -- ? )
2drop t ; 2drop t ;
@ -367,8 +382,10 @@ TUPLE: solid dimension silhouettes faces corners adjacencies-valid color name ;
[ dup faces>> ] dip call drop [ dup faces>> ] dip call drop
unvalid-adjacencies ; inline unvalid-adjacencies ; inline
: solid-translate ( solid v -- solid ) [ face-translate ] (solid-move) ; : solid-translate ( solid v -- solid )
: solid-transform ( solid m -- solid ) [ face-transform ] (solid-move) ; [ face-translate ] (solid-move) ;
: solid-transform ( solid m -- solid )
[ face-transform ] (solid-move) ;
: find-corner-in-silhouette ( s1 s2 -- elt bool ) : find-corner-in-silhouette ( s1 s2 -- elt bool )
pv> swap silhouettes>> nth pv> swap silhouettes>> nth
@ -402,13 +419,15 @@ TUPLE: solid dimension silhouettes faces corners adjacencies-valid color name ;
[ ensure-adjacencies ] map [ ensure-adjacencies ] map
; inline ; inline
! -------------------------------------------------------------- ! -------------------------------------------------------------
! space ! space
! -------------------------------------------------------------- ! -------------------------------------------------------------
TUPLE: space name dimension solids ambient-color lights ; TUPLE: space name dimension solids ambient-color lights ;
: <space> ( -- space ) space new ; : <space> ( -- space ) space new ;
: suffix-solids ( space solid -- space ) [ suffix ] curry change-solids ; inline : suffix-solids ( space solid -- space )
: suffix-lights ( space light -- space ) [ suffix ] curry change-lights ; inline [ suffix ] curry change-solids ; inline
: suffix-lights ( space light -- space )
[ suffix ] curry change-lights ; inline
: clear-space-solids ( space -- space ) f >>solids ; : clear-space-solids ( space -- space ) f >>solids ;
: space-ensure-solids ( space -- space ) : space-ensure-solids ( space -- space )
@ -417,19 +436,24 @@ TUPLE: space name dimension solids ambient-color lights ;
[ [ non-empty-solid? ] filter ] change-solids ; [ [ non-empty-solid? ] filter ] change-solids ;
: projected-space ( space solids -- space ) : projected-space ( space solids -- space )
swap dimension>> 1- <space> swap >>dimension swap >>solids ; swap dimension>> 1- <space>
swap >>dimension swap >>solids ;
: get-silhouette ( solid -- silhouette ) silhouettes>> pv> swap nth ; : get-silhouette ( solid -- silhouette )
: solid= ( solid solid -- ? ) [ corners>> ] bi@ = ; silhouettes>> pv> swap nth ;
: solid= ( solid solid -- ? ) [ corners>> ] bi@ = ;
: space-apply ( space m quot -- space ) : space-apply ( space m quot -- space )
curry [ map ] curry [ dup solids>> ] dip curry [ map ] curry [ dup solids>> ] dip
[ call ] [ drop ] recover drop ; [ call ] [ drop ] recover drop ;
: space-transform ( space m -- space ) [ solid-transform ] space-apply ; : space-transform ( space m -- space )
: space-translate ( space v -- space ) [ solid-translate ] space-apply ; [ solid-transform ] space-apply ;
: space-translate ( space v -- space )
[ solid-translate ] space-apply ;
: describe-space ( space -- ) : describe-space ( space -- )
solids>> [ [ corners>> [ pprint ] each ] [ name>> . ] bi ] each ; solids>>
[ [ corners>> [ pprint ] each ] [ name>> . ] bi ] each ;
: clip-solid ( solid solid -- solids ) : clip-solid ( solid solid -- solids )
[ ] [ ]
@ -451,7 +475,8 @@ TUPLE: space name dimension solids ambient-color lights ;
; inline ; inline
: remove-hidden-solids ( space -- space ) : remove-hidden-solids ( space -- space )
! We must include each solid in a sequence because during substration ! We must include each solid in a sequence because
! during substration
! a solid can be divided in more than on solid ! a solid can be divided in more than on solid
[ [
[ [ 1array ] map ] [ [ 1array ] map ]
@ -489,9 +514,9 @@ TUPLE: space name dimension solids ambient-color lights ;
[ [ ] [ v+ ] map-reduce ] [ length ] bi v/n [ [ ] [ v+ ] map-reduce ] [ length ] bi v/n
; ;
! -------------------------------------------------------------- ! -------------------------------------------------------------
! 3D rendering ! 3D rendering
! -------------------------------------------------------------- ! -------------------------------------------------------------
: face-reference ( face -- halfspace point vect ) : face-reference ( face -- halfspace point vect )
[ halfspace>> ] [ halfspace>> ]
@ -523,8 +548,10 @@ TUPLE: space name dimension solids ambient-color lights ;
: face->GL ( face color -- ) : face->GL ( face color -- )
[ ordered-face-points ] dip [ ordered-face-points ] dip
[ first3 1.0 glColor4d GL_POLYGON [ [ point->GL ] each ] do-state ] curry [ first3 1.0 glColor4d GL_POLYGON
[ 0 0 0 1 glColor4d GL_LINE_LOOP [ [ point->GL ] each ] do-state ] [ [ point->GL ] each ] do-state ] curry
[ 0 0 0 1 glColor4d GL_LINE_LOOP
[ [ point->GL ] each ] do-state ]
bi bi
; inline ; inline

View File

@ -5,7 +5,7 @@ IN: adsoda.combinators
HELP: among HELP: among
{ $values { $values
{ "array" array } { "n" null } { "array" array } { "n" "number of value to select" }
{ "array" array } { "array" array }
} }
{ $description "returns an array containings every possibilities of n choices among a given sequence" } ; { $description "returns an array containings every possibilities of n choices among a given sequence" } ;
@ -32,7 +32,7 @@ HELP: do-cycle
{ $description "Copy the first element at the end of the sequence in order to close the cycle." } ; { $description "Copy the first element at the end of the sequence in order to close the cycle." } ;
ARTICLE: "adsoda.combinators" "adsoda.combinators" ARTICLE: "adsoda.combinators" "Combinators"
{ $vocab-link "adsoda.combinators" } { $vocab-link "adsoda.combinators" }
; ;

View File

@ -4,7 +4,7 @@ USING: kernel arrays sequences fry math combinators ;
IN: adsoda.combinators IN: adsoda.combinators
! : (combinations) ( seq -- seq ) [ 1 tail ] dip combinations ; ! : (combinations) ( seq -- seq ) [ 1 tail ] dip combinations ;
! : prefix-each [ prefix ] curry map ; inline ! : prefix-each [ prefix ] curry map ; inline
@ -34,7 +34,8 @@ IN: adsoda.combinators
} cond } cond
; ;
: concat-nth ( seq1 seq2 -- seq ) [ nth append ] curry map-index ; : concat-nth ( seq1 seq2 -- seq )
[ nth append ] curry map-index ;
: do-cycle ( array -- array ) dup first suffix ; : do-cycle ( array -- array ) dup first suffix ;

View File

@ -9,7 +9,7 @@ HELP: 3cube
{ "solid" "solid" } { "solid" "solid" }
} }
{ $description "array : xmin xmax ymin ymax zmin zmax" { $description "array : xmin xmax ymin ymax zmin zmax"
"\n returns a 3D solid with given limits" "returns a 3D solid with given limits"
} ; } ;
HELP: 4cube HELP: 4cube
@ -18,24 +18,10 @@ HELP: 4cube
{ "solid" "solid" } { "solid" "solid" }
} }
{ $description "array : xmin xmax ymin ymax zmin zmax wmin wmax" { $description "array : xmin xmax ymin ymax zmin zmax wmin wmax"
"\n returns a 4D solid with given limits" "returns a 4D solid with given limits"
} ; } ;
HELP: coord-max
{ $values
{ "x" null } { "array" array }
{ "array" array }
}
{ $description "" } ;
HELP: coord-min
{ $values
{ "x" null } { "array" array }
{ "array" array }
}
{ $description "" } ;
HELP: equation-system-for-normal HELP: equation-system-for-normal
{ $values { $values
{ "points" "a list of n points" } { "points" "a list of n points" }
@ -51,8 +37,8 @@ HELP: normal-vector
{ "v" "a vector" } { "v" "a vector" }
} }
{ $description "From a list of points, returns the vector normal to the plan defined by the points" { $description "From a list of points, returns the vector normal to the plan defined by the points"
"\nWith n points, creates n-1 vectors and then find a vector orthogonal to every others" "With n points, creates n-1 vectors and then find a vector orthogonal to every others"
"\n returns { f } if a normal vector can not be found" } "returns { f } if a normal vector can not be found" }
; ;
HELP: points-to-hyperplane HELP: points-to-hyperplane
@ -61,14 +47,14 @@ HELP: points-to-hyperplane
{ "hyperplane" "an hyperplane equation" } { "hyperplane" "an hyperplane equation" }
} }
{ $description "From a list of points, returns the equation of the hyperplan" { $description "From a list of points, returns the equation of the hyperplan"
"\n Finds a normal vector and then translate it so that it includes one of the points" "Finds a normal vector and then translate it so that it includes one of the points"
} }
; ;
ARTICLE: "adsoda.tools" "adsoda.tools" ARTICLE: "adsoda.tools" "Tools"
{ $vocab-link "adsoda.tools" } { $vocab-link "adsoda.tools" }
"\nTools to help in building an " { $vocab-link "adsoda" } "-space" "Tools to help in building an " { $vocab-link "adsoda" } "-space"
; ;
ABOUT: "adsoda.tools" ABOUT: "adsoda.tools"

View File

@ -79,7 +79,8 @@ IN: adsoda.tools
translate ; translate ;
: refs-to-points ( points faces -- faces ) : refs-to-points ( points faces -- faces )
[ swap [ nth 10 v*n { 100 100 100 } v+ ] curry map ] with map [ 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{ { 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 } } } ! V{ { { 1.1 1.3 } { 0.1 0.2 } } { { 0.1 0.2 } { 1.1 1.3 } } }
@ -102,13 +103,15 @@ refs-to-points
; ;
: 2-faces-to-prism ( seq seq -- seq ) : 2-faces-to-prism ( seq seq -- seq )
2dup 2dup
[ do-cycle 2 clump ] bi@ concat-nth ! 3 faces rectangulaires [ do-cycle 2 clump ] bi@ concat-nth
! 3 faces rectangulaires
swap prefix swap prefix
swap prefix swap prefix
; ;
: Xpoints-to-prisme ( seq height -- cube ) : Xpoints-to-prisme ( seq height -- cube )
! from 3 points gives a list of faces representing a cube of height "height" ! from 3 points gives a list of faces representing
! a cube of height "height"
! and of based on the three points ! and of based on the three points
! a face is a group of 3 or mode points. ! a face is a group of 3 or mode points.
[ dup dup 3points-to-normal ] dip [ dup dup 3points-to-normal ] dip
@ -121,7 +124,8 @@ refs-to-points
: Xpoints-to-plane4D ( seq x y -- 4Dplane ) : Xpoints-to-plane4D ( seq x y -- 4Dplane )
! from 3 points gives a list of faces representing a cube in 4th dim ! from 3 points gives a list of faces representing
! a cube in 4th dim
! from x to y (height = y-x) ! from x to y (height = y-x)
! and of based on the X points ! and of based on the X points
! a face is a group of 3 or mode points. ! a face is a group of 3 or mode points.
@ -130,7 +134,8 @@ refs-to-points
; ;
: 3pointsfaces-to-3Dsolidfaces ( seq -- seq ) : 3pointsfaces-to-3Dsolidfaces ( seq -- seq )
[ 1 Xpoints-to-prisme [ 100 110 Xpoints-to-plane4D ] map concat ] map [ 1 Xpoints-to-prisme [ 100
110 Xpoints-to-plane4D ] map concat ] map
; ;