
Rolling a square in a square
By:
Matthen on Jan 14th, 2012 | syntax:
None | size: 1.32 KB | hits: 228 | expires: Never
RollSub[p_, dir_, \[Theta]_] := Module[{sq, rp},
sq = {p, p + dir, p + dir + RotationMatrix[Pi/2].dir,
p + RotationMatrix[Pi/2].dir};
sq = Map[RotationMatrix[-\[Theta]].(# - (p + dir)) + (p + dir) &,
sq];
sq = Map[# &, sq]
];
Roll[p_, dir_, \[Theta]_] :=
Module[{n = Floor[2 \[Theta]/Pi], sq0, sq},
sq0 = RollSub[p, dir, 0];
sq = Nest[RotateLeft[RollSub[#[[1]], dir, Pi/2]] &, sq0, n];
RollSub[sq[[1]], dir, \[Theta] - n Pi/2]
];
RollAround[\[Theta]_] := Module[{p, dir, th, n, m},
n = Mod[Floor[\[Theta]/Pi], 4] + 1;
p = {{0, 0}, {3, 0}, {3, 3}, {0, 3}}[[n]];
dir = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}[[n]];
th = \[Theta] - Pi (n - 1);
m = Mod[Floor[2 \[Theta]/Pi], 4] + 1;
Nest[RotateRight, Roll[p, dir, th],
1/4 (-3 - (-1)^m + 6 m) + 2 Floor[(n + 1)/2]]
];
Manipulate[
Show[Graphics[{
EdgeForm[Directive[Thick, RGBColor[0.1, 0.2, 0.1]]], FaceForm[],
Rectangle[{0, 0}, {3, 3}],
EdgeForm[Thick],
Polygon[RollAround[Mod[\[Theta], 4 Pi]]]
}, PlotRange -> {{-0.1, 3.1}, {-0.1, 3.1}}],
ParametricPlot[
RollAround[t], {t, If[\[Theta] < 4 Pi, 0, Mod[\[Theta], 4 Pi]],
If[\[Theta] < 4 Pi, Max[\[Theta], 0.01], 4 Pi - 0.01]},
PlotStyle -> RGBColor[0.450385`, 0.157961`, 0.217975`]]
, ImageSize -> 320]
, {\[Theta], 0, 8 Pi - 0.01}]