Manipulate[
(*by Nasser M. Abbasi, version Dec 19, 2013*)
tick;
Module[{x0, y0, z0, point, d = 0.5},
If[state == "running" || state == "step",
t = t + speed;
phi = currentW1*t + 1/2 w1dot*t^2;
theta = currentW2*t + 1/2 w2dot*t^2;
currentW1 = currentW1 + w1dot*t;
currentW2 = currentW2 + w2dot*t;
currentRaoV = currentRaoV + raoAcc*t;
rr = currentRaoV*t + 1/2 raoAcc*t^2;
If[state == "running",
tick += del
],
If[state == "reset",
t = -speed; phi = 0; theta = 0; rr = 0; x = 0; y = 0; z = 0;
currentRaoV = raoV; currentW1 = w1; currentW2 = w2; phi = 0;
theta = 0; rr = 0; line = {LL}; tick = 0
]
];
x0 = L1 + r Cos[theta];
y0 = -L3 + r Sin[theta];
z0 = L4 + L2 + d;
x = L1 + rr Cos[theta];
y = -L3 + rr Sin[theta];
z = L4 + L2 + d;
point = {x, y, z};
AppendTo[line, point];
g = Text@Grid[{
{
Grid[
{
{Style[
"Simulation for problem 1, HW3, EMA 542, Fall 2013, Univ. \
Of Wisconsin, Madison", Small], SpanFromLeft},
{Style["ant coordinates", Bold], SpanFromLeft},
{Grid[
{
{"(w2) disk", "w1 (frame)", "inertial"},
{Grid[{
{"x", "y", "z"},
{padIt1[
If[Abs[#] > 1000, Sign[#]*1000, #] & /@ rr , {7, 3}],
0, 0}
}, Frame -> All, Spacings -> {.2, .4}
],
Grid[{
{"X", "Y", "Z"},
{padIt1[If[Abs[x] > 1000, 1000*Sign[x], x], {7, 3}],
padIt1[If[Abs[y] > 1000, Sign[y]*1000, y], {7, 3}],
padIt1[L2, {7, 3}]}
}, Frame -> All, Spacings -> {.2, .4}],
Grid[{
{Style["X", Bold], Style["Y", Bold], Style["Z", Bold]},
{padIt1[
L1 Cos[phi] + L2 Sin[phi] +
rr Cos[theta] Cos[phi], {7, 3}],
padIt1[-L3 + rr Sin[theta], {7, 3}],
padIt1[-L1 Sin[phi] + L2 Cos[phi], {7, 3}]}
}, Frame -> All, Spacings -> {.2, .4}]
}
}, Spacings -> {.2, .2}, Frame -> True,
FrameStyle -> Directive[Thickness[.001], Gray]
], SpanFromLeft
}
}, Frame -> True,
FrameStyle -> Directive[Thickness[.001], Gray],
Alignment -> Center
]
},
{
Graphics3D[
{
Text["inertial", {-r - 5, 0, 3}],
{Arrowheads[Medium],
Arrow[{{-r - 5, -2, 3}, {-r - 4, -2, 3}}]},
Text[Style["X", Bold, 12], {-r - 3.5, -2, 3}, {-1, 0}],
{Arrowheads[Medium],
Arrow[{{-r - 5, -2, 3}, {-r - 5, -1, 3}}]},
Text[Style["Y", Bold, 12], {-r - 5, -.8, 3}, {-1, 0}],
{Arrowheads[Medium],
Arrow[{{-r - 5, -2, 3}, {-r - 5, -2, 2}}]},
Text[Style["Z", Bold, 12], {-r - 5, -2, 1.8}, {-1, 0}],
GeometricTransformation[
{
If[showW2Coordinates,
{
{Arrowheads[Medium],
Arrow[{LL, LL + {r Cos[theta], r Sin[theta], 0}}]},
Text[Style["x", 12],
LL + {1.1 r Cos[theta], 1.1 r Sin[theta], 0}, {-1, 0}],
{Arrowheads[Medium],
Arrow[{LL,
LL + {r Cos[theta + Pi/2], r Sin[theta + Pi/2], 0}}]},
Text[Style["y",
12], {LL + {1.1 r Cos[theta + Pi/2],
1.1 r Sin[theta + Pi/2], 0}}, {-1, 0}],
{Arrowheads[Medium], Arrow[{LL, LL + {0, 0, r}}]},
Text[Style["z", 12], {1.1*(LL + {0, 0, r})}, {-1, 0}]
},
{}
],
{Red, Thin, Line[line]},
{Red, PointSize[Medium], Point[point]},
{Opacity[Dynamic@op],
Cylinder[{{L1, -L3, L4 + L2}, {L1, -L3, L4 + L2 + d}}, r]},
{Red, Cylinder[{{0, -0.2, 0}, {0, 0.2, 0}}, 0.2]},
{Blue, Cylinder[{{0, -0.8, 0}, {0, 2, 0}}, 0.1]},
Tube[{{0, 0, 0}, {L1, 0, 0}, {L1, 0, L2}, {L1, -L3,
L2}, {L1, -L3, L4 + L2}}, 0.06],
Cylinder[{{L1, -L3, L2}, {L1, -L3, L4 + L2}}, 0.2],
If[showW1Coordinates,
{
{Arrowheads[Medium], Arrow[{{0, 0, 0}, {1, 0, 0}}]},
Text[Style["X", 12], {1.1, 0, 0}, {-1, 0}],
{Arrowheads[Medium], Arrow[{{0, 0, 0}, {0, 3, 0}}]},
Text[Style["Y", 12], {0, 3.1, 0}, {-1, 0}],
{Arrowheads[Medium], Arrow[{{0, 0, 0}, {0, 0, 1}}]},
Text[Style["Z", 12], {0, 0, 1.1}, {-1, 0}]
},
{}
]
},
RotationTransform[phi, {0, 1, 0}]
]
}
, ImageSize -> {400, 400}, Boxed -> False,
AxesLabel -> {"x", "y", "z"}, ViewVertical -> {0, 1, 0},
ViewPoint -> {1, .5, 2}, SphericalRegion -> True,
PlotRange -> {{-r - 5, r + 3}, {-r - 3, r + 2}, {-r - 3,
r + 3}}, ImagePadding -> 1, Axes -> None,
ViewAngle -> Dynamic[zoom*Pi/180.0]
]
}}, Spacings -> {0, .1}, Alignment -> Center];
g
],
Text@Grid[{
{
Grid[{
{
Button[Text[Style["run", 11]], state = "running"; tick += del,
ImageSize -> {50, 35}],
Button[Text[Style["pause", 11]], state = "paused";
tick += del, ImageSize -> {50, 35}],
Button[Text[Style["step", 11]], state = "step"; tick += del,
ImageSize -> {50, 35}],
Button[Text[Style["reset", 11]], state = "reset";
tick = 0, ImageSize -> {50, 35}]
}
}, Spacings -> {0.4, .2}, Alignment -> Center
]
},
{
Grid[{
{
"slow",
Manipulator[
Dynamic[speed, {speed = #} &], {0.0001, 0.001, 0.0001},
ImageSize -> Tiny, ContinuousAction -> True],
"fast", SpanFromLeft
},
{
"disk r",
Manipulator[
Dynamic[r, {r = #; state = "paused"; tick += del} &], {0.5,
2.3, 0.1}, ImageSize -> Tiny, ContinuousAction -> True],
Dynamic[padIt2[r, {2, 1}]], "ft"
},
{
"w1",
Manipulator[Dynamic[w1, {w1 = #; state = "reset";
tick += del} &], {0.001, 10, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[w1, {4, 3}]], "rad/sec"
},
{
"w2",
Manipulator[Dynamic[w2, {w2 = #; state = "reset";
tick += del} &], {0.001, 30, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[w2, {5, 3}]], "rad/sec"
},
{
"d/dt(w1)",
Manipulator[Dynamic[w1dot, {w1dot = #; state = "reset";
tick += del} &], {0.001, 1, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[w1dot, {4, 3}]], "rad/sec^2"
},
{
"d/dt(w2)",
Manipulator[Dynamic[w2dot, {w2dot = #; state = "reset";
tick += del} &], {0.001, 1, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[w2dot, {4, 3}]], "rad/sec^2"
},
{
"ant speed",
Manipulator[Dynamic[raoV, {raoV = #; state = "reset";
tick += del} &], {0.001, 3, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[raoV, {4, 3}]], "ft/sec"
},
{
"ant acc",
Manipulator[Dynamic[raoAcc, {raoAcc = #; state = "reset";
tick += del} &], {0.001, 3, 0.001}, ImageSize -> Tiny,
ContinuousAction -> True],
Dynamic[padIt2[raoAcc, {4, 3}]], "ft/sec^2"
},
{
"disk opacity",
Manipulator[Dynamic[op, {op = #} &], {0.1, 1, 0.1},
ImageSize -> Tiny, ContinuousAction -> True],
Dynamic[padIt2[op, {1, 1}]], SpanFromLeft
},
{
"zoom",
Manipulator[Dynamic[zoom, {zoom = #} &], {10, 130, 1},
ImageSize -> Tiny, ContinuousAction -> True],
Dynamic[padIt2[zoom, 2]], SpanFromLeft
}
}, Alignment -> Left
]
},
{
Grid[
{
{"time", Dynamic@padIt2[t, {7, 5}], "sec"}
}, Spacings -> {.5, .2}]
},
{
Grid[{
{"show disk coordinates", Spacer[4],
Checkbox[
Dynamic[showW2Coordinates, {showW2Coordinates = #;
tick += del} &]]
},
{"show bar coordinates", Spacer[4],
Checkbox[
Dynamic[showW1Coordinates, {showW1Coordinates = #;
tick += del} &]]
}
}
]
}
}, Frame -> All, Alignment -> Left],
{{showW2Coordinates, True}, None},
{{showW1Coordinates, False}, None},
{{speed, 0.001}, None},
{{r, 2.3}, None},
{{tick, 0}, None},
{{del, $MachineEpsilon}, None},
{{state, "reset"}, None},
{{t, 0}, None},
{{x, 0}, None},
{{y, 0}, None},
{{z, 0}, None},
{{line, {{0, 0, 0}}}, None},
{{w1dot, 1}, None},
{{w2dot, 0.2}, None},
{{w1, 1}, None},
{{w2, 11}, None},
{{raoV, 0.5}, None},
{{raoAcc, 0.1}, None},
{{currentRaoV, 0.01}, None},
{{currentW1, 0.6}, None},
{{currentW2, 0.01}, None},
{{op, 0.1}, None},
{{phi, 0}, None},
{{theta, 0}, None},
{{rr, 0}, None},
{{zoom, 32}, None},
TrackedSymbols :> {tick},
ControlPlacement -> Left,
SynchronousUpdating -> False,
SynchronousInitialization -> False,
ContinuousAction -> False,
Alignment -> Center,
ImageMargins -> 0,
FrameMargins -> 0,
Paneled -> True,
Frame -> False,
AutorunSequencing -> {1},
Initialization :>
(
L1 = 2.5;
L2 = 0.7;
L3 = 1.4;
L4 = 1;
LL = {L1, -L3, L4 + L2 + 0.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];
(*--------------------------------------------*)
)
]