> Van: [email protected] [mailto:programming-
> [email protected]] Namens Bo Jacoby
> Onderwerp: Re: [Jprogramming] Polygon containment
> 
> Dan wrote: I need to check whether a point falls within an arbitrary
> polygon.
> 
> The winding number formula is: W=.9&o.@(%&0j2p1)@(+/)@:^.@(% _1&|.) . To
> test if (0,0) is within the square ((1,0),(0,1),(-1,0),(0,-1)), type W 1
> 0j1 _1 0j_1 and get the result 1, indicating YES. To test if (4,0) is
> within the square, type W 1 0j1 _1 0j_1 - 4 and get the result 0,
> indicating NO.
> 
> (see
> http://en.wikipedia.org/wiki/Wikipedia:Reference_desk/Archives/Mathematics
> /2009_December_17#Easiest_way_to_decide_if_a_point_is_within_a_polygon.3F)
> 
> -Bo
> 


The basic idea of winding number is brilliant, but the J-implementation
needs some improvement.
First of all W ues log (^.)to determine the angle of a complex number where
J has a primitive to do that.
Furthermore for a point on a vertex you get a problem,

   W 1 0j1 _1 0j_1 -1
|NaN error: W
|       W 1 0j1 _1 0j_1-1

whereas the edges seems to be inside the polygon

   W 1 0j1 _1 0j_1 - 2%~ 1j1
1

At last but certainly not at least, W has rank 0 which, for the " gazillion
points" of Bron, will give a worse performance then necessary.

So I constructed wn which is a dyad, accepting a polygon as x and the (2D)
points as y.

wn=: 4 : 0      NB. x is polygon such that 2[\(,{.)x are edges; y are points
                NB. 1 if in polygon, 0 if on edge or vertex, _1 if outside
 y=. ,:^:((2 > #...@$)`]) y
 ov=. y e. x                    NB. on vertex
 dv=. (,{.) j./"1 x -"1/ y      NB. difference vectors
 oe=. +./ 1e_14 ((<|)*]) (}. (= -) }:) dv       NB. on edge
 dv1=. dv #"1~ t=. -. ov +. oe
 in=. t #^:_1 [0 ~: 1e_14 ((< |) * ]) (2*pi) %~ +/ {:"1 *. (}. % }:) dv1
 <: (+: in) + ov +. oe
)

   (1 0, 0 1, _1 0,: 0 _1) wn 2 %~ 1 1*/~i:2
_1 0 1 0 _1

   (1 0, 0 1, _1 0,: 0 _1) wn  1 0*/~i:2
_1 0 1 0 _1

I estimate that this solution performs better than others.
Apart from that it works for a large(r) collection of polygons.


R.E. Boss


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to