用BASIC语言编写代码,解决力学和解析几何中的一些问题。其中一个问题是模拟行星齿轮上的点的运动,并生成漂亮的形状。这些天,想起了这段代码,想发表一篇有用的文章,但不幸的是,发现网站上已经有了一个使用比之前推导出的方程更简单的版本。
方程是:
y(t) = A * Sin(n * t) (在极坐标中)
所以决定添加一些新的东西,而且不会花费太多时间,那就是添加了一个额外的第三个齿轮,放在第二个齿轮里面,第一个齿轮里面,看看结果如何,结果令人印象深刻。
这些形状并不是一些人可能认为的无意义的东西。有了简单的方程,游戏和图形设计师可以生成这样的复杂形状,装饰设计师也可以做到这一点。在一家大医院的入口处,看到其中的一个形状,由水射流切割机制成的曲线马赛克花岗岩瓷砖铺在地板上。如果想增加知识,请参考这些链接:
它也可以用来在织物上打印图案,设计标志等等。
还可以查看这些视频:
背景:
这是一张简单的行星齿轮与环齿轮啮合的图片,它的名字来自于与行星运动的相似性。现在想象一下,内部的红色臂被迫围绕环齿轮的中心旋转,这将使行星齿轮也围绕自己的中心旋转,两者之间的旋转比率是固定的:
seta_2 = seta_1 * R1 / R2 * slider4.Value;
这个比率可以通过滑块4的值来改变。
这个比率来自于旋转角度seta的弧度方程:
Ɵ = 这个角度前面的弧长 / 半径
由于两个齿轮是啮合的,所以两个被扫过的弧长是相同的,所以:
Arc1 = Arc2
Ɵ1 / R1 = Ɵ2 / R2
就像在代码中写的那样(seta_2/R2 = seta1/R1)。
检查下面的图表,让描述行星齿轮的蓝色中心点相对于环齿轮的黑色中心点的位置。
这个位置可以通过点P(x2,y2)在笛卡尔平面上的分量来描述,如下:
X2 = R1 * Math.Cos(seta_1) + R2 * Math.Cos(seta_2) + X1;
Y2 = R1 * Math.Sin(seta_1) + R2 * Math.Sin (seta_2) + Y1;
其中:
R1是第一个半径。
R2是第二个半径。
Ɵ1红色角度是臂的旋转角度。
Ɵ2绿色角度是行星齿轮的结果旋转角度,可以是(seta_2 = seta_1 * R1 / R2)。
绘制旋转的红色点相对于红色角度Ɵ1的位置,将给出这样的螺旋图形状:
现在让引入一个额外的新齿轮,如果把这个齿轮组件放入一个大的环齿轮中,将有两个旋转的齿轮在里面,如下所示:
红色点相对于新齿轮中心的位置可以通过向量R1, R2, R3的和来计算,或者可以这样计算:
X3 = R2 * Math.Cos(seta_2) + R3 * Math.Cos(seta_3) + X2;
Y3 = R2 * Math.Sin(seta_2) + R3 * Math.Sin(seta_3) + Y2;
绘制这个方程来计算点位置X3, Y3相对于seta1,并改变其参数,将给出这些新的令人惊叹的图表:
使用代码:
大部分代码都很容易理解,但让在这里强调这些行:
让让齿轮的牙齿变红,让行星齿轮旋转并滑动,seta1的比例给新的形状,所以重新计算如下:
seta_2 = seta_1 * R1 / R2 * slider4.Value;
seta_3 = seta_2 * R2 / R3 * slider5.Value;
这给以下效果:
添加了滑块来控制三个半径,但注意到一个非常小的变化可能在0.1的范围内可以改变形状,这里下一个有用的原理与这个问题有关。
有用的原理:
从物理上讲,很难在很大的范围内同时以非常高的精度控制任何物理量,通常精度限制在一定的范围内,例如,要控制一个质量在公里范围内的位置,不能指望在微米范围内有精度。
同样,不能用手在某个位置上很容易地控制滑块位置,以十分之一或更少的分数,所以在每个“参数控制滑块”旁边添加了另一个滑块,以提供分数值的控制。
在所有这些滑块下面,可以找到一个textBlock来显示滑块值(Silder.Value),这些textBlocks的文本都绑定到它的顶部滑块,如下所示的textBlock1的示例代码:
另一个想法是渐变色,它给图表带来阴影效果,因为从中心向外走,蓝色变得更暗,通过添加以下行:
double D = Math.Sqrt( Math.Pow(PtsX[n] - X1 , 2) + Math.Pow(PtsY[n] - Y1, 2) );
Byte LineColor = (Byte) (180-((D * Scale)/ (canvas2.Height/2 )) * 140);
myLine.Stroke = new SolidColorBrush(Color.FromRgb(00,LineColor,255));
添加了最右边的两个滑块,“比例滑块”来查看不同大小的形状,另一个是“历史滑块”,“历史滑块”来自于一个类似的想法,很久以前在设计一个简单的存储示波器电路时使用过,通过计算机的并行端口连接,让计算机收集数据,然后尽可能快地存储在数组中(不要让计算机忙于绘制数据),所以图表可以单独检查,以查看发生了什么历史,随着滑块的上下移动,可以回顾绘画的历史,可以回顾形状,当它被绘制时,挑选最好的一个。
最后,更喜欢用线条而不是曲线连接点,因为觉得这样更容易、更快地绘制,可以在以下绘图循环中找到它,它绘制了一系列有限的线条:
for (int n = 1; n < cnt; n += 1) { myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.Violet;
double D = Math.Sqrt( Math.Pow(PtsX[n] - X1 , 2) + Math.Pow(PtsY[n] - Y1, 2) );
Byte LineColor = (Byte) (180-((D * Scale)/ (canvas2.Height/2 )) * 140);
myLine.Stroke = new SolidColorBrush(Color.FromRgb(00,LineColor,255));
myLine.X1 = PtsX[n-1] * Scale + canvas2.Width/2;
myLine.Y1 = PtsY[n-1] * Scale + canvas2.Height/2;
myLine.X2 = PtsX[n] * Scale + canvas2.Width/2;
myLine.Y2 = PtsY[n] * Scale + canvas2.Height/2;
myLine.StrokeThickness = 1;
canvas2.Children.Add(myLine);
}
应用以下滑块值并检查图表:
可以添加许多想法来生成更多令人惊叹的形状,比如添加渐变色,使其更加生动和美妙,变化线条笔画等等。