1. Re: mathmatical question... to Jiri - Reply
- Posted by "BABOR, JIRI" <J.Babor at GNS.CRI.NZ> May 31, 1997
- 671 views
Hi everybody, I had a second (longer) look at my inside() function last night, and as a result I have to ingests a bit of a humble pie. While the simple version below works well for all interior points, it leaves the points on the polygon's periphery indeterminate. The longer version will include all such points. Jiri -- inpoly.ex ------------------------------------------------------------------- -- j.babor at gns.cri.nz -------------------------------------------------------------------------------- include graphics.e include get.e object junk sequence s,tp integer key function simple_inside(sequence p, sequence P) atom x integer count,n n=length(P) P=append(P,P[1]) count=0 for i=1 to n do if (P[i][2]<=p[2] and P[i+1][2]>p[2]) or (P[i][2]>p[2] and P[i+1][2]<=p[2] ) then x=P[i][1]+(p[2]-P[i][2])*(P[i+1][1]-P[i][1])/(P[i+1][2]-P[i][2]) if x<p[1] then count=count+1 end if end if end for return remainder(count,2) -- return 1 (true) if count is odd end function function inside(sequence p, sequence P) atom x integer count,n n=length(P) P=append(P,P[1]) count=0 for i=1 to n do if not compare(p,P[i]) then return 1 -- include all vertices elsif p[2]=P[i][2] and p[2]=P[i+1][2] and ((p[1]>P[i][1] and p[1]<P[i+1][1]) or (p[1]<P[i][1] and p[1]>P[i+1][1])) then return 1 -- include all points on horizontal polygon sides end if if (P[i][2]<=p[2] and P[i+1][2]>p[2]) or (P[i][2]>p[2] and P[i+1][2]<=p[2] ) then x=P[i][1]+(p[2]-P[i][2])*(P[i+1][1]-P[i][1])/(P[i+1][2]-P[i][2]) if x=p[1] then return 1 -- include all points on non-horizontal polygon sides elsif x<p[1] then count=count+1 end if end if end for return remainder(count,2) -- return 1 (true) if count is odd end function -- main ------------------------------------------------------------------------ junk=graphics_mode(18) {100,180},{205,190},{190,200},{40,240},{100,240},{200,240},{40,280}, {80,280},{160,280},{180,280},{60,320}} 0,180}} polygon(1,1,s) for i=1 to length(tp) do pixel(15,tp[i]) print(1,inside(tp[i],s)) if not remainder(i,4) then puts(1,"\n") end if end for key = wait_key() junk=graphics_mode(-1)