Re: Visualizing a geometric problem
- To: mathgroup at smc.vnet.net
- Subject: [mg113221] Re: Visualizing a geometric problem
- From: Maxim <m.r at inbox.ru>
- Date: Tue, 19 Oct 2010 05:56:08 -0400 (EDT)
- References: <i9ehon$6rh$1@smc.vnet.net>
On Oct 17, 5:05 am, Velina Veleva <vvvel... at gmail.com> wrote:
> I am trying to figure out a way to move two points, X and Y,
> independently of one another along the edges of an equilateral
> triangle with vertices A, B, and C. There are also some collision
> rules that need to be taken into account:
>
> (1) If X is at a vertex, say vertex A, then Y cannot be on A or on
> the edges adjacent to it. i.e., Y can only be on vertices B or C or
> the edge BC.
> (2) If X is on an edge, say AB, then Y cannot be on A, nor B, nor any
> of the edges adjacent to A and B. i.e., Y must be on vertex C
>
> I have figured out how to move the two points along the triangle using
> a pair of sliders, but I can't figure out how to implement the
> collision rules. I tried using the Exclusions option for Slider but
> the results are not what I expect. I would prefer to drag the points
> along the triangle rather than using sliders, so if someone knows how
> to do that instead it would be helpful. Ideally, I would be able to
> move the two points from a vertex to either one of the edges instead
> of coming to a stop at one of them. Here is my code so far.
>
> MyTriangle[t_] :=
> Piecewise[{{{-1, 0} + (t/100) {1, Sqrt[3]},
> 100 > t >= 0}, {{0, Sqrt[3]} + (t/100 - 1) {1, -Sqrt[3]},
> 200 > t >= 100},
> {{1, 0} + (t/100 - 2) {-2, 0}, 300 >= t >= 0}}]
> excluded[x_] := \[Piecewise] {
> {Range[0, 99]~Join~Range[201, 299], x == 0},
> {Range[0, 199], x == 100},
> {Range[101, 299], x == 200},
> {Range[0, 199]~Join~Range[201, 299], 0 < x < 100},
> {Range[1, 299], 100 < x < 200},
> {Range[0, 99]~Join~Range[101, 299], 200 < x < 300}
> }
> {Dynamic[t], Dynamic[x]}
> {Slider[Dynamic[t], {0, 299, 1}, Exclusions -> Dynamic[excluded[x]]],
> Dynamic[t]}
> {Slider[Dynamic[x], {0, 299, 1}, Exclusions -> Dynamic[excluded[t]]],
> Dynamic[x]}
> Dynamic[Graphics[{PointSize[Large], Point[MyTriangle[t]],
> Point[MyTriangle[x]],
> Line[{{-1, 0}, {1, 0}, {0, Sqrt[3]}, {-1, 0}}]},
> PlotRange -> {{-1.2, 4.2}, {-.2, 2}}]]
Here's how you can implement the collision rules using a custom
tracking function for the control variables:
DynamicModule[
{verts = {{-1., 0.}, {1., 0.}, {0., Sqrt[3.]}},
sides = {{2., 0.}, {-1., Sqrt[3.]}, {-1., -Sqrt[3.]}},
xy = {{0., 0.}, {0., Sqrt[3.]}},
lambdas, dists, sidei, verti, i, j},
LocatorPane[Dynamic[xy,
Function[newxy,
If[newxy == xy, Return[]];
{i, j} = If[newxy[[1]] == xy[[1]], {2, 1}, {1, 2}];
lambdas = MapThread[(newxy[[i]] - #).#2/#2.#2 &, {verts, sides}];
lambdas = Clip[lambdas, {.025, .975}, {0., 1.}];
dists =
MapThread[
Norm[newxy[[i]] - #3*#2 - #] &, {verts, sides, lambdas}];
sidei = First@Ordering@dists;
If[! lambdas[[sidei]] != 0. != 1.,
verti = Mod[sidei + Boole[lambdas[[sidei]] == 1.], 3, 1];
xy[[i]] = verts[[verti]];
If[xy[[j]] != Sequence @@ verts[[Delete[{1, 2, 3}, verti]]],
xy[[j]] = Mean@verts[[Delete[{1, 2, 3}, verti]]]],
xy[[i]] = lambdas[[#]]*sides[[#]] + verts[[#]] &@sidei;
xy[[j]] = verts[[Mod[sidei + 2, 3, 1]]];
]]],
Graphics[Line@verts[[{1, 2, 3, 1}]]],
LocatorAutoCreate -> False]]
Maxim Rytin
m.r at inbox.ru