Re: "Traveling salesman on a hemisphere" problem
- To: mathgroup at smc.vnet.net
- Subject: [mg121597] Re: "Traveling salesman on a hemisphere" problem
- From: Dana DeLouis <dana01 at me.com>
- Date: Wed, 21 Sep 2011 05:35:19 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
> with the arcane from http://en.wikipedia.org/wiki/Great-circle_distance, > arclen[{_, {F1_, L1_}}, {_, {F2_, L2_}}] := > Module[{f1 = F1 Degree, l1 = L1 Degree, f2 = F2 Degree, l2 = L2 > Degree, dl = (L1 - L2) Degree}, > ArcTan[Sin[f1] Sin[f2] + Cos[f1] Cos[f2] Cos[dl], > Sqrt[(Cos[f2] Sin[dl])^2 + (Cos[f1] Sin[f2] - Sin[f1] > Cos[f2] Cos[dl])^2]]] Hi. I know the OP has a solution, but I thought the Vector form on the link Olaf provided was an interesting alternative. ArcLen[Pt1_,Pt2_]:=Module[ {fx,t}, fx[{Lat_,Long_}]:= { Cos[Lat]*Cos[Long], Cos[Lat]*Sin[Long], Sin[Lat] }; t={Pt1,Pt2}*Degree; Apply[Dot,Map[fx,t]]//ArcCos ] (* Some Examples *) ArcLen[{21,44.7},{57.3,7}] 0.7945159 ArcLen[{0,0},{90,0}] Pi/2 ArcLen[{0,0},{0,180}] Pi = = = The article mentions an ArcTan version... ArcLen2[Pt1_,Pt2_]:=Module[ {fx,t}, fx[{Lat_,Long_}]:={ Cos[Lat]*Cos[Long], Cos[Lat]*Sin[Long], Sin[Lat]}; t={Pt1,Pt2}*Degree; t=Map[fx,t]; ArcTan[Apply[Dot,t],Norm[Apply[Cross,t]]] ] ArcLen2[{21,44.7},{57.3,7}] 0.7945159 Anyway, I just thought it was interesting. I do not know of a way to get the built-in commands such as GeoPositionXYZ or any of the other commands to work with spherical objects. = = = Dana DeLouis $Version 8.0 for Mac OS X x86 (64-bit) (November 6, 2010) On Sep 16, 5:55 am, Olaf <olaf.rogal... at googlemail.com> wrote: > Hi Peter, > > with the arclen fromhttp://en.wikipedia.org/wiki/Great-circle_distance, > the following code will give you the shortest route. > > stars = { > {"M51", {21, 44.7}}, > {"NGC2721", {4, -17}}, > {"a funny comet", {57.3, 7}}, > {"absolutely must see", {23, -176.3}}}; > > arclen[{_, {F1_, L1_}}, {_, {F2_, L2_}}] := > Module[{f1 = F1 Degree, l1 = L1 Degree, f2 = F2 Degree, l2 = L2 > Degree, dl = (L1 - L2) Degree}, > ArcTan[Sin[f1] Sin[f2] + Cos[f1] Cos[f2] Cos[dl], > Sqrt[(Cos[f2] Sin[dl])^2 + (Cos[f1] Sin[f2] - Sin[f1] > Cos[f2] Cos[dl])^2]]] > > tour = FindShortestTour[stars, DistanceFunction -> arclen] > > sortedStars = starlist[[tour[[2]]]] > > And here some eye-candy: > > p2c[{_, {f_, l_}}] := {Cos[f Degree] Cos[l Degree], > Sin[f Degree] Cos[l Degree], Sin[l Degree]} > greatCircleArc[{q_, p_}] := > Module[{u = p2c[q], v = p2c[p], a}, a = VectorAngle[u, v]; > Table[Evaluate[RotationTransform[t, {u, v}][u]], {t, 0, a, > a/Ceiling[10 a]}]] > > Graphics3D[ > {Sphere[{0, 0, 0}, 0.97], > {Black, Thick, Arrow[{{0, 0, -1.3}, {0, 0, 1.3}}]}, > {Red, PointSize[Medium], Point[Map[p2c, sortedStars]]}, > {Blue, Thick, > Map[Line, Map[greatCircleArc, Partition[sortedStars, 2, 1]]]} > }, SphericalRegion -> True] > > Regards, Olaf