Ray-casting algorithm: Difference between revisions

m
m (note: it's one of the possible ways; not The Way.)
m (→‎{{header|Tcl}}: formatting)
Line 205:
set count 0
foreach side [sides $polygon] {
if [ray_intersects_line $point $side] {incr count}
incr count
}
}
expr {$count % 2} ;#-- 1 = odd = true, 0 = even = false
Line 212 ⟶ 214:
foreach {x0 y0} $polygon break
foreach {x y} [lrange [lappend polygon $x0 $y0] 2 end] {
lappend res [list $x0 $y0 $x $y]
set x0 $x
set y0 $y
}
return $res
Line 227 ⟶ 229:
foreach {xa ya xb yb} $line1 break
foreach {xc yc xd yd} $line2 break
 
set det [expr {($xb - $xa) * ($yd - $yc)
set det [expr {($xb - $xa) * ($yd - $yc) - ($xd - $xc) * ($yb - $ya)}]
if {$det == 0} {return 0} ;#-- parallel or collinear
 
set nump [expr {($xd - $xc) * ($yb + $ya)
set nump [expr {($xd - $xc) * ($yb + $ya) - ($xb + $xa) * ($yd - $yc) + 2. * ($xc * $yd - $xd * $yc)}]
+ 2. * ($xc * $yd - $xd * $yc)}]
if {abs($nump) > abs($det)} {return 0} ;#-- cross outside line1
 
set numq [expr {($xd + $xc) * ($yb - $ya)
set numq [expr {($xd + $xc) * ($yb - $ya) - ($xb - $xa) * ($yd + $yc) + 2. * ($xb * $ya - $xa * $yb)}]
+ 2. * ($xb * $ya - $xa * $yb)}]
if {abs($numq) > abs($det)} {return 0} ;#-- cross outside line2
 
return 1
}
 
foreach {point poly} {
{0 0} {-1 -1 -1 1 1 1 1 -1}
{2 2} {-1 -1 -1 1 1 1 1 -1}
{0 0} {-2 -2 -2 2 2 2 2 -2 2 -1 1 1 -1 1 -1 -1 1 -1 2 -1}
{1.5 1.5} {-2 -2 -2 2 2 2 2 -2 2 -1 1 1 -1 1 -1 -1 1 -1 2 -1}
{1.5 1.5} {-20 -20 -2.5 2.5 20 210 2.5 -27.5 7.5 7.5 10 10 10 0 7.5 0.1}
2 -1 1 1{5 8} -1 1 -1 -1{0 0 1 -12.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 -0.1}
{52 52} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
{50 80} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
{210 210} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
{0 0} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
{10 10} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
{2.5 2.5} {0 0 2.5 2.5 0 10 2.5 7.5 7.5 7.5 10 10 10 0 7.5 0.1}
} {
puts "$point in $poly = [point_in_polygon $point $poly]"
}</lang>
}
</lang>
Anonymous user