2010-10-18 31 views
1

我想要找出一种方法,沿顶点A,B和C的等边三角形的边缘彼此独立移动两个点X和Y.还有一些碰撞规则需要考虑:使用mathematica可视化几何拼图

(1)如果X位于顶点,比如说顶点A,那么Y不能位于A上或位于与其相邻的边上。即Y只能在顶点B或C或边缘BC上。

(2)如果X是在边缘上,说AB,则Y不能是在A,也不是B,也没有任何对A和B,即相邻的边缘的,Y必须是顶点Ç

我已经想出了如何使用一对滑块沿三角形移动这两个点,但我无法弄清楚如何实现碰撞规则。我尝试使用Slider的排除选项,但结果不符合我的预期。我宁愿拖动沿三角形的点,而不是使用滑块,所以如果有人知道如何做到这一点,这将是有益的。理想情况下,我可以将两个点从一个顶点移动到其中一个边,而不是停在其中一个边上。这是我的代码到目前为止。

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

回答

2

如何像:

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

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