Ray-casting algorithm: Difference between revisions
Content added Content deleted
(Add rust langage) |
|||
Line 313: | Line 313: | ||
Point(8.0,5.0): TRUE |
Point(8.0,5.0): TRUE |
||
Point(10.0,10.0): FALSE</pre> |
Point(10.0,10.0): FALSE</pre> |
||
=={{header|ANSI BASIC}}== |
|||
Translated from FreeASIC: |
|||
<lang ANSI Standard BASIC>1000 PUBLIC NUMERIC x,y |
|||
1010 LET x=1 |
|||
1020 LET y=2 |
|||
1030 ! |
|||
1040 DEF isLeft2(L(,),p()) = -SGN( (L(1,x)-L(2,x))*(p(y)-L(2,y)) - (p(x)-L(2,x))*(L(1,y)-L(2,y))) |
|||
1050 ! |
|||
1060 FUNCTION inpolygon(p1(,),p2()) |
|||
1070 LET k=UBOUND(p1,1)+1 |
|||
1080 DIM send (1 TO 2,2) |
|||
1090 LET wn=0 |
|||
1100 FOR n=1 TO UBOUND(p1,1) |
|||
1110 LET index=MOD(n, k) |
|||
1120 LET nextindex=MOD(n+1, k) |
|||
1130 If nextindex=0 Then LET nextindex=1 |
|||
1140 LET send(1,x)=p1(index,x) |
|||
1150 LET send(2,x)=p1(nextindex,x) |
|||
1160 LET send(1,y)=p1(index,y) |
|||
1170 LET send(2,y)=p1(nextindex,y) |
|||
1180 IF p1(index,y)<=p2(y) THEN |
|||
1190 If p1(nextindex,y)>p2(y) Then |
|||
1200 If isleft2(send,p2)>=0 Then !'= |
|||
1210 LET wn=wn+1 |
|||
1220 END IF |
|||
1230 End If |
|||
1240 ELSE |
|||
1250 If p1(nextindex,y)<=p2(y) Then |
|||
1260 If isleft2(send,p2)<=0 Then !'= |
|||
1270 LET wn=wn-1 |
|||
1280 End If |
|||
1290 End If |
|||
1300 End If |
|||
1310 NEXT n |
|||
1320 LET inpolygon = wn |
|||
1330 END FUNCTION |
|||
1340 ! |
|||
1350 DIM type(1 TO 2) |
|||
1360 ! |
|||
1370 DIM square(4,2) |
|||
1380 MAT READ square |
|||
1390 DATA 0,0,10,0,10,10,0,10 |
|||
1400 ! |
|||
1410 DIM hole(4,2) |
|||
1420 MAT READ hole |
|||
1430 DATA 2.5,2.5,7.5,2.5,7.5,7.5,2.5,7.5 |
|||
1440 ! |
|||
1450 DIM strange(8,2) |
|||
1460 MAT READ strange |
|||
1470 DATA 0,0,2.5,2.5,0,10,2.5,7.5,7.5,7.5,10,10,10,0,2.5,2.5 |
|||
1480 ! |
|||
1490 DIM exagon(6,2) |
|||
1500 MAT READ exagon |
|||
1510 DATA 3,0,7,0,10,5,7,10,3,10,0,5 |
|||
1520 ! |
|||
1530 ! printouts |
|||
1540 FOR z=1 TO 4 |
|||
1550 Select Case z |
|||
1560 Case 1 |
|||
1570 Print "squared" |
|||
1580 PRINT "(5,5) ";TAB(12); |
|||
1590 MAT READ type |
|||
1600 DATA 5,5 |
|||
1610 IF inpolygon(square,type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1620 MAT READ type |
|||
1630 DATA 5,8 |
|||
1640 PRINT "(5,8) ";TAB(12); |
|||
1650 IF inpolygon(square,type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1660 PRINT "(-10,5) ";TAB(12); |
|||
1670 MAT READ type |
|||
1680 DATA -10,5 |
|||
1690 IF inpolygon(square,type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1700 Print "(0,5) ";Tab(12); |
|||
1710 MAT READ type |
|||
1720 DATA 0,5 |
|||
1730 IF inpolygon(square,type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1740 Print "(10,5) ";Tab(12); |
|||
1750 MAT READ type |
|||
1760 DATA 10,5 |
|||
1770 IF inpolygon(square,type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1780 PRINT "(8,5) ";TAB(12); |
|||
1790 MAT READ type |
|||
1800 DATA 8,5 |
|||
1810 IF inpolygon(square,Type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1820 PRINT "(10,10) ";TAB(12); |
|||
1830 MAT READ type |
|||
1840 DATA 10,10 |
|||
1850 IF inpolygon(square,Type) <> 0 THEN PRINT "in" ELSE PRINT "out" |
|||
1860 PRINT |
|||
1870 CASE 2 |
|||
1880 Print "squared hole" |
|||
1890 PRINT "(5,5) ";TAB(12); |
|||
1900 MAT READ type |
|||
1910 DATA 5,5 |
|||
1920 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
1930 Print "(5,8) ";Tab(12); |
|||
1940 MAT READ type |
|||
1950 DATA 5,8 |
|||
1960 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
1970 Print "(-10,5) ";Tab(12); |
|||
1980 MAT READ type |
|||
1990 DATA -10,5 |
|||
2000 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2010 Print "(0,5) ";Tab(12); |
|||
2020 MAT READ type |
|||
2030 DATA 0,5 |
|||
2040 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2050 Print "(10,5) ";Tab(12); |
|||
2060 MAT READ type |
|||
2070 DATA 10,5 |
|||
2080 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2090 Print "(8,5) ";Tab(12); |
|||
2100 MAT READ type |
|||
2110 DATA 8,5 |
|||
2120 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2130 Print "(10,10) ";Tab(12); |
|||
2140 MAT READ type |
|||
2150 DATA 10,10 |
|||
2160 IF NOT inpolygon(hole,Type)<>0 AND inpolygon(square,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2170 PRINT |
|||
2180 CASE 3 |
|||
2190 Print "strange" |
|||
2200 PRINT "(5,5) ";TAB(12); |
|||
2210 MAT READ type |
|||
2220 DATA 5,5 |
|||
2230 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2240 Print "(5,8) ";Tab(12); |
|||
2250 MAT READ type |
|||
2260 DATA 5,8 |
|||
2270 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2280 PRINT "(-10,5) ";TAB(12); |
|||
2290 MAT READ type |
|||
2300 DATA -10,5 |
|||
2310 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2320 Print "(0,5) ";Tab(12); |
|||
2330 MAT READ type |
|||
2340 DATA 0,5 |
|||
2350 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2360 Print "(10,5) ";Tab(12); |
|||
2370 MAT READ type |
|||
2380 DATA 10,5 |
|||
2390 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2400 Print "(8,5) ";Tab(12); |
|||
2410 MAT READ type |
|||
2420 DATA 8,5 |
|||
2430 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2440 PRINT "(10,10) ";TAB(12); |
|||
2450 MAT READ type |
|||
2460 DATA 10,10 |
|||
2470 IF inpolygon(strange,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2480 PRINT |
|||
2490 CASE 4 |
|||
2500 PRINT "exagon" |
|||
2510 PRINT "(5,5) ";TAB(12); |
|||
2520 MAT READ type |
|||
2530 DATA 5,5 |
|||
2540 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2550 Print "(5,8) ";Tab(12); |
|||
2560 MAT READ type |
|||
2570 DATA 5,8 |
|||
2580 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2590 PRINT "(-10,5) ";TAB(12); |
|||
2600 MAT READ type |
|||
2610 DATA -10,5 |
|||
2620 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2630 Print "(0,5) ";Tab(12); |
|||
2640 MAT READ type |
|||
2650 DATA 0,5 |
|||
2660 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2670 PRINT "(10,5) ";TAB(12); |
|||
2680 MAT READ type |
|||
2690 DATA 10,5 |
|||
2700 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2710 Print "(8,5) ";Tab(12); |
|||
2720 MAT READ type |
|||
2730 DATA 8,5 |
|||
2740 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2750 PRINT "(10,10) ";TAB(12); |
|||
2760 MAT READ type |
|||
2770 DATA 10,10 |
|||
2780 IF inpolygon(exagon,Type)<>0 THEN PRINT "in" ELSE PRINT "out" |
|||
2790 PRINT |
|||
2800 END SELECT |
|||
2810 NEXT z |
|||
2820 END</lang> |
|||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |