齿轮曲线,也称为齿轮图,是一种基于圆周运动的数学曲线,可以通过不同的参数设置产生丰富多样的图案。本文将探讨如何使用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的原始代码。