Ray-casting algorithm: Difference between revisions
Content added Content deleted
m (whitespace) |
(Factor solution) |
||
Line 672: | Line 672: | ||
test-point |
test-point |
||
(point-in-polygon test-point polygon)))))</lang> |
(point-in-polygon test-point polygon)))))</lang> |
||
=={{header|Factor}}== |
|||
To test whether a ray intersects a line, we test that the starting point is between the endpoints in y value, and that it is to the left of the point on the segment with the same y value. Note that this implementation does not support polygons with horizontal edges. |
|||
<lang factor>USING: kernel prettyprint sequences arrays math math.vectors ; |
|||
IN: raycasting |
|||
: between ( a b x -- ? ) [ last ] tri@ [ < ] curry bi@ xor ; |
|||
: lincomb ( a b x -- w ) |
|||
3dup [ last ] tri@ |
|||
[ - ] curry bi@ |
|||
[ drop ] 2dip |
|||
neg 2dup + [ / ] curry bi@ |
|||
[ [ v*n ] curry ] bi@ bi* v+ ; |
|||
: leftof ( a b x -- ? ) dup [ lincomb ] dip [ first ] bi@ > ; |
|||
: ray ( a b x -- ? ) [ between ] [ leftof ] 3bi and ; |
|||
: raycast ( poly x -- ? ) |
|||
[ dup first suffix [ rest-slice ] [ but-last-slice ] bi ] dip |
|||
[ ray ] curry 2map |
|||
f [ xor ] reduce ;</lang> |
|||
Usage: |
|||
<lang factor>( scratchpad ) CONSTANT: square { { -2 -1 } { 1 -2 } { 2 1 } { -1 2 } } |
|||
( scratchpad ) square { 0 0 } raycast . |
|||
t |
|||
( scratchpad ) square { 5 5 } raycast . |
|||
f |
|||
( scratchpad ) square { 2 0 } raycast . |
|||
f</lang> |
|||
=={{header|Fortran}}== |
=={{header|Fortran}}== |