探索机械系统与编程的结合

用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); }

应用以下滑块值并检查图表:

  • 180 181 30 100 1 1
  • 180 181 40 100 1 1
  • 180 182 30 100 1 1
  • 180 182 30 40 1.91 1.4
  • 180 119.07 50.5 41 1.21 1.6
  • 180 181 30.27 100 1 1
  • 180 181 30.30 100 1 1
  • 180 181 30.35 100 1 1
  • 177 179 29.9 55.8 1 1
  • 99 176 0 100 1 1
  • 103 97 30 100 1 1
  • 183 150 13.4 50 1 1

可以添加许多想法来生成更多令人惊叹的形状,比如添加渐变色,使其更加生动和美妙,变化线条笔画等等。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485