|
[Date Index]
[Thread Index]
[Author Index]
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
Prev by Date:
Re: Plot axis length and size ratio (TwoPlot revive)
Next by Date:
Re: Compilation: Avoiding inlining
Previous by thread:
Re: "Traveling salesman on a hemisphere" problem
Next by thread:
Compilation: Avoiding inlining
|