Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TYPE vec2
- x AS SINGLE
- y AS SINGLE
- END TYPE
- DIM p(255) AS vec2
- DIM v(255) AS vec2
- DIM pmax AS INTEGER
- DIM Q AS vec2
- CONST pi = 3.141592
- Q.x = -4: Q.y = 2 'Your point goes here
- 'read in the polygon
- READ pmax
- FOR i = 0 TO pmax - 1
- READ p(i).x, p(i).y
- NEXT
- DO
- KEY$ = INKEY$
- IF KEY$ = CHR$(27) THEN EXIT DO
- SELECT CASE MID$(KEY$, 2)
- CASE "H": Q.y = Q.y - .1
- CASE "P": Q.y = Q.y + .1
- CASE "K": Q.x = Q.x - .1
- CASE "M": Q.x = Q.x + .1
- END SELECT
- 'compute vectors from Q
- FOR i = 0 TO pmax - 1
- v(i).x = p(i).x - Q.x
- v(i).y = p(i).y - Q.y
- NEXT
- 'draw
- SCREEN 12: CLS
- COLOR 13: PRINT "Point in Polygon Demo (c)2017, @_sorceress"
- COLOR 15: PRINT "Use arrow keys to move the point"
- FOR i = 0 TO pmax
- IF i = pmax THEN j = 0 ELSE j = i
- x = p(j).x: y = p(j).y: GOSUB project
- IF i = 0 THEN PSET (px, py), 10 ELSE LINE -(px, py), 10
- NEXT
- x = Q.x: y = Q.y: GOSUB project
- CIRCLE (px, py), 5, 13
- 'Compute inside/outside
- sum = 0
- FOR i = 0 TO pmax - 1
- IF i > 0 THEN j = i - 1 ELSE j = pmax - 1
- a = v(i).x * v(j).y - v(i).y * v(j).x
- b = v(i).x * v(j).x + v(i).y * v(j).y
- sum = sum + _ATAN2(a, b)
- NEXT
- COLOR 11: PRINT "Point is at: "; Q.x; Q.y
- IF ABS(sum) < pi THEN
- COLOR 12: PRINT "Point is OUTSIDE the polygon."
- ELSE
- COLOR 10: PRINT "Point is INSIDE the polygon."
- END IF
- COLOR 7: PRINT "Sum of angles = "; sum
- _DISPLAY
- SLEEP 0
- LOOP
- SYSTEM
- project:
- px = 320 + 20 * x: py = 200 + 20 * y
- RETURN
- 'Your polygon goes here
- DATA 9
- DATA -5,0
- DATA 0,5
- DATA 0,1
- DATA 5,5
- DATA 2,-5
- DATA 0,-5
- DATA -1,-1
- DATA -2,-5
- DATA -5,-5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement