齿轮曲线的探索与实现

齿轮曲线,也称为齿轮图,是一种基于圆周运动的数学曲线,可以通过不同的参数设置产生丰富多样的图案。本文将探讨如何使用R语言和JavaScript来生成和展示这些曲线。

在上一部分中,介绍了齿轮曲线的基本概念和基础方程。本文将继续讨论一些有趣的R脚本发现,并展示基于JavaScript的多齿轮曲线解决方案。

基础的齿轮曲线方程如下: x = R0 * cos(T0 * t) + R1 * cos(T1 * t), y = R0 * sin(T0 * t) - R1 * sin(T1 * t), 其中: R0, T0 - 第一个齿轮的半径和角度系数; R1, T1 - 第二个齿轮的半径和角度系数。 注意:允许所有系数为负值。

这些方程在R语言(用于两个齿轮)和JavaScript(用于多个齿轮)中都有应用。

在提供的GGCArtp2.zip文件中,可以找到所有与本文相关的R脚本和网页。

在R语言中生成和绘制齿轮曲线不需要做太多工作,实际上就是将JavaScript代码“翻译”成R语言。

下面的R代码展示了一个完整的函数,用于生成和绘制两个齿轮的齿轮曲线。同时,还有一些使用这个函数的示例。

GG2g <- function(n, r0, t0, r1, t1, fn, cfg="maroon", ttl="", psz=640, cbg="white") { pf = paste0(fn, ".png"); par(bg=cbg); it=pi*2/n; t=seq(0, n, it); x=(r0*cos(t0*t)+r1*cos(t1*t)); y=(r0*sin(t0*t)-r1*sin(t1*t)); if (ttl!="") { plot(x, y, type="l", main=ttl, axes=FALSE, xlab="", ylab="", col=cfg)} else { par(mar=rep(2, 4)); par(plt=c(0, 1, 0, 1)); par(xpd = NA); par(oma=rep(2, 4), xaxs='i', yaxs='i'); plot(x, y, type="l", axes=FALSE, col=cfg)}; dev.copy(png, filename=pf, width=psz, height=psz); dev.off(); graphics.off(); }

使用这个函数,可以生成和绘制出三种不同的齿轮曲线,分别是“花头”、“树木”和“雕刻环”。

如果要使用点而不是线段来绘制齿轮曲线,会怎么样呢?新的函数几乎是GG2g()函数的双胞胎(不完全相同)。只有三行R代码是不同的。在下面的代码片段中可以看到:

GG2gd <- function(n, r0, t0, r1, t1, fn, cfg="maroon", ttl="", psz=640, cbg="white") { plot(x, y, main=ttl, axes=FALSE, xlab="", ylab="", col=cfg, pch=20) }

使用这两个函数,可以生成并绘制出看起来像3D雕刻环的漂亮环,以及使用点绘制的“树木”曲线。

在R中绘制齿轮曲线的结论: - 在R中绘制齿轮曲线比使用[1]中的“生成器”页面需要更多的时间。 - 要测试许多曲线,需要准备带有不同参数的函数调用,但在“生成器”页面上,只需点击几下即可获得下一个曲线。 - 建议至少设置画布的双倍大小(例如,1280),因为R中的缩放工作方式不同。例如,要找到“森林”中的“树木”,用户应该查看图1中“树木”子图的全尺寸。

使用多个齿轮绘制齿轮曲线的想法在许多在线资源中都有介绍(例如,[3-5]等)。

在[3]中,发布了一段C#代码,这段代码很好,容易“翻译”成JavaScript,并转换为方程。下面“原样”展示了这段C#代码片段:

C# // each line in the grid is like adding a wheel to a spirograph toy, // we just add up where each "wheel" move the point for (i = 0; i < max; i++) { rx += radius[i] * Math.Cos(speed[i] * (angle + phase[i])); ry += radius[i] * Math.Sin(speed[i] * (angle + phase[i])); }

“翻译”成JavaScript并转换为方程的代码片段如下:

JavaScript // global vars var cvs, ctx, cw, cc; // canvas: context, width, center var cfg, cbg; // colors: FG & BG var pi2=Math.PI*2, gn, msro; // ***** // Plot loop for (var i = 0; i <= n; i++) { t = i * it; x = R[0] * Math.cos(T[0] * t); y = R[0] * Math.sin(T[0] * t); for (var g = 1; g < gn; g++) { x += R[g] * Math.cos(T[g] * t); y -= R[g] * Math.sin(T[g] * t); } x = x * sc + cc + sx; y = y * sc + cc + sy; ctx.lineTo(x, y); }

理论上,可以使用无限数量的齿轮,但实际上,测试起来会非常困难。

“多齿轮齿轮曲线生成器”网页(GGmgGenerator.html)包含在zip文件中,并在图3中部分显示。

如图3所示,该页面允许输入几乎所有控制齿轮曲线绘制的参数,并可以生成和显示所有可能的齿轮曲线(多个齿轮)。

应该指出,输入向量R和T的大小和语法都会被检查。如果出现错误,会在画布区域上方以红色显示适当的错误消息(有时可能会令人困惑)。参见图3中的示例消息。

首先,看看图4中的6个选定曲线。

图4子图如下: 子图1-3(2、3和4个齿轮) 子图4-6(5、6和9个齿轮)

现在,加载页面并按照“第1部分”[1]中的建议进行测试。

相当大的GGCmgTestSamples.txt文件包含在zip文件中。它肯定会帮助进行测试。

在测试“多齿轮生成器”页面时,用户肯定会发现以下特点/属性: - 如果齿轮数量超过3个,就很难预测曲线。 - 同时,最终发现了许多新的有趣的模式。 - 如果向量T的所有值都很大(例如,所有T[i]>200),那么曲线就会变得太乱。在极少数情况下,增加画布的大小可以帮助看到模式(如果有的话)。

从这个不太复杂的页面中学到的额外内容(希望)如下: - 如何检查输入向量的大小和语法 - 如何将曲线放入画布并将其置于画布中心 - “生成器”页面的测试策略。参见GGCmgTestSamples.txt文件中的示例

以下是一些即使是初学者也可以非常容易实现的传统练习!

练习#1:创建Demo3.html页面,生成并展示10-12个选定的多齿轮绘制的齿轮曲线。使用GGmgGenerator.html、GG2gDemo2.html和GGD2.js的原始代码。

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