(*by Nasser M. Abbasi 5/6/14*)
Manipulate[
tick;
Module[{r, alpha, len, z, eq, f, x, y, E0},
If[state == "init" || state == "reset" || state == "paused",
{a, b, c, p, ellipse} = makeEllipse[e];
n = Sqrt[\[Mu]/a^3];
x = a;
y = 0
];
If[state == "running" || state == "step",
currentTime = Mod[currentTime + stepSize, 2 Pi Sqrt[a^3/\[Mu]]];
sol = E0 /. FindRoot[currentTime == Sqrt[a^3/\[Mu]] (E0 - e Sin[E0]), {E0, currentTime/(1 - e)}];
E0 = sol;
r = a*(1 - e*Cos[E0]);
x = a Cos[E0];
y = a Sqrt[1 - e^2] Sin[E0];
If[state == "running",
tick = Not[tick]
]
];
Graphics[
{
First@ellipse,
{LightGray, Line[{{c, 0}, {c, p}}]},
{Green, Disk[{c, 0}, 0.05]},
{Gray, Disk[{-c, 0}, 0.05]},
{Gray, Dashed, Line[{{0, -b}, {0, b}}]},
{Gray, Dashed, Line[{{-a, 0}, {a, 0}}]},
{Blue, Disk[{x + c, y}, 0.02]},
Arrow[{{c, 0}, {x, y}}]
}, PlotRange -> {{-1.1 a, 1.1 a}, {-1.1 a, 1.1 a}}, ImagePadding -> 30, ImageSize -> 300
]
],
Grid[{
{
Grid[{
{
Button[Text[Style["run", 12]], state = "running"; tick = Not[tick], ImageSize -> {80, 35}],
Button[Text[Style["pause", 12]], state = "paused"; tick = Not[tick], ImageSize -> {80, 35}],
Button[Text[Style["step", 12]], state = "step"; tick = Not[tick], ImageSize -> {80, 35}],
Button[Text[Style["reset", 12]], state = "reset"; currentTime = 0; tick = Not[tick], ImageSize -> {80, 35}]
}
}, Spacings -> {0.4, .2}, Alignment -> Center
], SpanFromLeft
},
{
"eccentricity e",
Manipulator[Dynamic[e, {e = #; {a, b, c, p, ellipse} = makeEllipse[e]; tick = Not[tick]} &], {0, 0.9, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[e, {4, 3}]]
},
{
"slow",
Manipulator[Dynamic[stepSize, {stepSize = #} &], {1, 60, 1}, ImageSize -> Tiny, ContinuousAction -> False],
"fast"
}
}, Spacings -> {0.4, .2}, Alignment -> Left],
{{tick, False}, None},
{{state, "init"}, None},
{{e, .9}, None},
{{stepSize, 60}, None},
{{currentTime, 0}, None},
{{currentE, 0}, None},
{{ellipse, 0}, None},
{{a, 0}, None},
{{c, 0}, None},
{{b, 0}, None},
{{p, 0}, None},
{{n, 0}, None},
TrackedSymbols :> {tick},
Initialization :>
(
\[Mu] = 3.986*10^5;
(*definitions used for parameter checking*)
integerStrictPositive = (IntegerQ[#] && # > 0 &);
integerPositive = (IntegerQ[#] && # >= 0 &);
numericStrictPositive = (Element[#, Reals] && # > 0 &);
numericPositive = (Element[#, Reals] && # >= 0 &);
numericStrictNegative = (Element[#, Reals] && # < 0 &);
numericNegative = (Element[#, Reals] && # <= 0 &);
bool = (Element[#, Booleans] &);
numeric = (Element[#, Reals] &);
integer = (Element[#, Integers] &);
(*--------------------------------------------*)
padIt1[v_?numeric, f_List] := AccountingForm[v,
f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt1[v_?numeric, f_Integer] := AccountingForm[Chop[v],
f, NumberSigns -> {"-", "+"}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt2[v_?numeric, f_List] := AccountingForm[v,
f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
padIt2[v_?numeric, f_Integer] := AccountingForm[Chop[v],
f, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}, SignPadding -> True];
(*--------------------------------------------*)
makeEllipse[e_] := Module[{a = (6378 + 300), c, b, x, y, p},
c = e a;
b = Sqrt[a^2 - c^2];
p = a (1 - e^2);
{a, b, c, p,
ContourPlot[(x/a)^2 + (y/b)^2 == 1, {x, -1.1 a, 1.1 a}, {y, -1.1 a, 1.1 a}, PlotPoints -> 100, AspectRatio -> Automatic]}
]
)
]