Re: winding number
- To: mathgroup at smc.vnet.net
- Subject: [mg25449] Re: winding number
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 1 Oct 2000 02:44:31 -0400 (EDT)
- References: <8qho3l$j8s@smc.vnet.net> <8r19jr$hun@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Will, Here is complex number version of the angle adding method that you gave (Will Self) windingNumber[point_, vList_] := Module[ {g, angle}, g[t_] := Mod[t + Pi, 2Pi] - Pi; angle[p_, a1_, a2_] := g[ArcTan @@ (a2 - p) - ArcTan @@ (a1 - p)]; (Plus @@ MapThread [ angle[point, #1, #2] & , {vList, RotateLeft[vList]} ])/2/Pi] (using complex numbers) windingNumber2[point_, vList_] := (Plus @@ Arg[RotateLeft[#]/# &[vList.{1, I} - point.{1, I}]])/(2Pi) Timings: vList = Table[Random[Real, {-1, 1}], {1000}, {2}]; windingNumber[{.1, -.2}, vList] // Timing {3.41 Second, 6.} windingNumber2[{.1, -.2}, vList] // Timing {0.05 Second, 6.} We could add a preliminary test, using a determinant, to deal with points on the line. 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