Re: Urgent

• To: mathgroup at smc.vnet.net
• Subject: [mg27279] Re: Urgent
• From: "Allan Hayes" <hay at haystack.demon.co.uk>
• Date: Fri, 16 Feb 2001 03:58:31 -0500 (EST)
• References: <9686u0\$3qi@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Here are two possibilites for 2D polygons
Both will give the angles in the correct quadrant.
angles2c will give the angles in the range  (-Pi ,2Pi] and
angles2r will give them in the range (-2Pi,2Pi). To convert them to the
range (-Pi ,2Pi]  we could use Mod[ . , 2Pi, -Pi] but this will slow the
computation down markedly.

angles2c[verts_]:=
Arg[RotateLeft[#]/#&[RotateLeft[#]-#&[Complex@@@verts]]]

angles2r[verts_]:=(RotateLeft[#]-#)&[ArcTan@@@(RotateLeft[#]-#&[verts])]

The following will work for any dimensions, but it will give answers in the
range [0,Pi] and so leaves it ambiguous in 2D whether the true answer is for
example Pi/2 or -Pi/2.

angles[verts_] :=
{RotateLeft[#], #} &[{1, -1}.({ RotateLeft[#], #} &[verts])]]

Here are some timings

verts = Table[Random[Real, {-1, 1}], {100000}, {2}];

angles2c[verts];//Timing

{10.22 Second,Null}

angles2r[verts];//Timing

{8.08 Second,Null}

angles[verts];//Timing

{62.01 Second,Null}

--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"oda" <adj at ensm-douai.fr> wrote in message news:9686u0\$3qi at smc.vnet.net...
> Hi , all
>
> I'm currently use Mathematica 4.0 and I need to compute
> fastly the angle between  the vertices of a polygon.
> The statement of the problem is :
>
> Let be (P) a polygon with n vertices point, I want to calulate
> the angle (T) between all consecutif edge.
>
> (P) = {P1, P2, P3,.............,Pn}
> P1 is a 2 or 3 dimension point.
> angles between (PiPi+1, Pi+1Pi+2) i = 1, n-2;
>
> I have about (100000 points in polygon)
>