Well done mr. Boss! I supposed you ment to write PTS=: _1 + 2 * pts 3 such that the area covered is _1<x<1, _1<y<1 rather than 0<x<1, 0<y<1 . -Bo
--- Den fre 23/4/10 skrev R.E. Boss <[email protected]>: > Fra: R.E. Boss <[email protected]> > Emne: Re: [Jprogramming] Polygon containment > Til: "'Programming forum'" <[email protected]> > Dato: fredag 23. april 2010 11.41 > > Van: [email protected] > [mailto:programming- > > [email protected]] > Namens Devon McCormick > > Onderwerp: Re: [Jprogramming] Polygon containment > > > > All these good theoretical considerations aside, it > will be interesting to > > see how the winding number algorithm performs on > actual data. > > > > -- > > Devon McCormick, CFA > > > > What I have collected so far: > > pip=: 4 : 0 NB. Boss > NB. point in (convex) polygon, x is point > NB. y is polygon with 2 -: {:$y, such that 2[\(,{.)y are > edges > NB. 1 if in polygon, 0 if on edge or vertex, _1 if > outside > E=. _1 ,.~ (%."(2) 2[\(,{.)y) +/ . * 1 1 > s=. * E +/ . *"(1) _2|.y ,. 1 > t=. * E +/ . *"(1) x , 1 > <: (+: s -: t) + (0 e. t) > ) > > pinp=: 4 : 0 NB. Bantchev > s=. 2&(]\)@(],{.) > o=. ]/:/:@:({:"1) > ps=. o"2...@s y > as=. *-/ .* x,"1 2 ps > vs=. x -"1 ps > if. +/ (as=0) *. 0>:+/"1*/"2 vs do. > 0 > else. > > <:+:~:/(as>0)*.([:(0&<@{.*.1&>@{:)[:{.[:|.|:)"2 > vs > end. > ) > > W=:%&0j2p1@(+/)@:^.@(% _1&|.) NB. Winding number > program; Jacoby > R=:<.@(0.5&+)@(9&o.) NB. Rounding a complex > number into an integer > > wn=: 4 : 0 NB. Boss > NB. x is polygon with 2 -: {:$x, such > that 2[\(,{.)x are edges > NB. y are points with 2 -: {:$y > 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 > ) > > rou=: [:^ 0j2p1&% * i. NB. > regular polygon > plg=: 3 :'(,{.) +. rou 10^y' NB. regular > polygon with 10^y points > pts=: 3 :'0 ?...@$~ 2 ,~ 10^y' NB. 10^y > arbitrary points in the unit square > > PLG=: plg 1 > PTS=: 2 * pts 3 > > ts' PTS pip"1 _ }:PLG' > 0.19810665 12288 > > ts' PTS pip"1 _ }:PLG' > 0.20095689 12288 > > ts'PTS pinp"1 _ PLG' > 0.20642736 15808 > > ts' r...@w PLG -/&:(j./"1) PTS ' > 0.010154403 821760 > > ts'PLG wn PTS' > 0.031857189 2021632 > > It is obvious that (in J) the winding number is the > winner. > However, some results diverge. > > (PTS pip"1 _ }:PLG) -: PTS pinp"1 _ PLG > 0 > > (PTS pip"1 _ }:PLG) -: r...@w PLG > -/&:(j./"1)PTS > 0 > > (PTS pip"1 _ }:PLG) -: PLG wn PTS > 1 > > > R.E. Boss > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > __________________________________________________ Bruger du Yahoo!? Er du træt af spam? Yahoo!Mail har den bedste spambeskyttelse, der findes http://dk.mail.yahoo.com ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
