探索齿轮曲线的数学之美

齿轮曲线,一种源自于Spirograph曲线的几何图形,旨在简化并统一这些曲线,同时克服许多限制和约束。目标是生成和绘制更复杂且引人入胜的曲线。本文面向初级和中级编程爱好者,提供了网页和R脚本,用以展示齿轮曲线的不同方面。

齿轮曲线与Spirograph曲线的简要比较

Spirograph是一种几何绘图玩具,能够产生数学上的roulette曲线,这些曲线在技术上被称为hypotrochoids和epitrochoids。网络上有大量关于Spirograph及其相关曲线的文章。除了[1],还有许多在线动画器和生成器,以及许多用任何支持图形的语言实现的应用程序。

根据[1],描述笔尖(附着在齿轮上)轨迹的数学方程(以单一参数t为变量)如下:

x = (R-r)*cos(t) + rho*cos(((R-r)/r)*t), y = (R-r)*sin(t) - rho*sin(((R-r)/r)*t),

其中:

  • R - 固定外圈/齿轮(即定子)的半径;
  • r - 滚动的较小内圈/齿轮(即转子)的半径,r < R;
  • rho - 内圈/齿轮上的笔孔半径,rho < r。

需要注意的是,这些不是极坐标方程,因为角度t(theta)不是极坐标角度[1]。尽管它们看起来与[2,3]中的极坐标方程相似。

还应该提到的是,一些作者使用了略有不同的公式,例如:计算并使用齿轮的齿比;添加起始角度phi(即相位);计算每完整圆圈的循环数;添加一些其他系数。所有这些版本都是完全正确的,因为它们都试图精确地绘制出与“几何绘图玩具”产生的曲线相似的曲线。

齿轮曲线的方程

齿轮曲线使用的方程与上面显示的非常相似,但这些方程被修改和统一,以克服一些限制,现在更加灵活:

  • R和r的大小可以是任何合理的(或不合理的),即r > R是可以的;
  • 新的4个系数(见下文)可以有任何值,包括负数;
  • 缩放允许填满整个画布;
  • 支持前景和背景颜色。

因此,齿轮曲线方程版本如下:

x = R0*cos(T0*t) + R1*cos(T1*t), y = R0*sin(T0*t) - R1*sin(T1*t),

其中:

  • R0,T0 - 与第一个齿轮半径和角度t(theta)相关的系数;
  • R1,T1 - 与第二个齿轮半径和角度t(theta)相关的系数。

JavaScript代码片段

使用这些方程的JavaScript片段(几乎与下面显示的相同)包含在本项目中使用的每个页面中。

// global vars var cvs, ctx, cw; // canvas, context, width var n=2000, psc=1; // dots/segments, plot scale var pi=Math.PI, pi2=pi*2; // Plotting Gearographic curves (using 2 gears) // Coefficients related to: // R0,T0 - prime radius and theta scale; R1,T1 - 2nd radius and theta scale. function pGG2g(R0, T0, R1, T1){ var it=pi2/n, t; // it - initial theta, t - theta // Plot loop ctx.beginPath(); for (var i=0; i<=n; i++) { t=i*it; x = (R0*Math.cos(T0*t) + R1*Math.cos(T1*t))*psc; y = (R0*Math.sin(T0*t) - R1*Math.sin(T1*t))*psc; ctx.lineTo(x, y); // if(i<5) {console.log("t,x,y:", t, "/",x, "/", y)} } ctx.stroke(); }

使用Demo 1网页

"Demo 1: 9 Gearographic Curves (2 gears)"网页(GG2gDemo1.html)包含在zip文件中。它生成并显示9个简单的循环齿轮曲线(2个齿轮)绘制在一张图片中。

使用Demo 2网页

"Demo 2: Gearographic Curves (2 gears)"网页(GG2gDemo2.html)包含在zip文件中。它生成并显示几乎3打齿轮曲线(2个齿轮)。所需要做的就是点击"Plot next"按钮。

使用齿轮曲线生成器网页

"Gearographic Curve Generator (2 gears)"网页(GG2gGenerator.html)包含在zip文件中,并在图3中部分显示。

首先,让强调:所有的目标都实现了!也就是说,已经定义了一组新的齿轮曲线,这与众所周知的Spirograph曲线非常相似,但同时它产生了以前不可能用塑料玩具绘制的新曲线。

应该提到的是,有些Spirograph曲线不能通过齿轮曲线来复制,这是修改方程和绘制方法的可理解结果。

  • 如何将9个绘制的图片放入1个画布图形中(参见"Demo 1"页面的代码)。
  • 如何使用一个"懒惰"的点击每个图形来生成和显示许多选定的图形(参见"Demo 2"页面和GGD2.js的代码)。
  • 如何处理画布图形的前景和背景颜色(参见"Demo 2"和"Generator"页面的代码)。
  • 如何处理有许多输入参数的页面,例如,类似于"Generator"页面。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485