2010-10-18 13 views
1

J'essaie de trouver un moyen de déplacer deux points, X et Y, indépendamment les uns des autres le long des bords d'un triangle équilatéral avec les sommets A, B et C. Il y a aussi règles de collision à prendre en compte:Visualiser un puzzle géométrique avec mathematica

(1) Si X est à un sommet, disons sommet A, alors Y ne peut pas être sur A ou sur les bords adjacents. c'est-à-dire que Y ne peut être que sur les sommets B ou C ou sur le bord BC.

(2) Si X est sur un bord, par exemple AB, alors Y ne peut pas être sur A, ni B, ni aucun des bords adjacents à A et B. à savoir, Y doit être sur le sommet C

J'ai trouvé comment déplacer les deux points le long du triangle en utilisant une paire de curseurs, mais je n'arrive pas à comprendre comment implémenter les règles de collision. J'ai essayé d'utiliser l'option Exclusions pour Slider mais les résultats ne sont pas ce que je m'attendais. Je préférerais faire glisser les points le long du triangle plutôt que d'utiliser des curseurs, donc si quelqu'un sait comment faire cela, ce serait utile. Idéalement, je serais en mesure de déplacer les deux points d'un sommet à l'un des bords au lieu de s'arrêter à l'un d'entre eux. Voici mon code jusqu'à présent.

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}}]]

Mathematica graphics

Répondre

2

Que diriez-vous quelque chose comme:

MyTriangle[t_]:=Piecewise[{ 
    {{-1,0}+t {1,Sqrt[3]},1>t>=0}, 
    {{0,Sqrt[3]}+(t-1) {1,-Sqrt[3]},2>t>=1}, 
    {{1,0}+(t-2) {-2,0},3>=t>=0},{0,True}}] 

et

Column[{ 
    {Slider[Dynamic[x], {0, 3, .01}], Dynamic[x]}, 
    {Slider[Dynamic[y], {0, 3, .01}], Dynamic[y]}, 
    Dynamic[x = Mod[x, 3]; Which[ 
    x==0.,Which[0.<=y<1.,y=1.,2.<y<=3.,y=2.],0.<x<1.,y=2., 
    x==1.,Which[1.<=y<2.,y=2.,0.<y<=1.,y=0.],1.<x<2.,y=0., 
    x==2.,Which[2.<=y<3.,y=0.,1.<y<=2.,y=1.],2.<x<3.,y=1.]; 
    Graphics[{PointSize[Large], Point[MyTriangle /@ {x, y}], 
    Line[{{-1, 0}, {1, 0}, {0, Sqrt[3]}, {-1, 0}}]}]]}]