65.9K
CodeProject 正在变化。 阅读更多。
Home

齿轮图曲线 - 第一部分。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (10投票s)

2018年3月8日

CPOL

7分钟阅读

viewsIcon

13941

downloadIcon

335

定义并展示从最简单到最有趣的齿轮曲线。提供用于说明其不同方面的网页和 R 脚本。

引言

本文的目标是定义和展示齿轮曲线。这种曲线的灵感来自螺线曲线,但希望能简化和统一它们,并克服许多限制。希望生成和绘制更复杂和有趣的曲线。

本文面向初学者和中级程序员,并提供用于说明齿轮曲线不同方面的网页和 R 脚本。

让我们从这两种曲线的简要比较开始。

根据维基百科 [1]
 

万花尺是一种几何绘图玩具,它能产生技术上称为内旋轮线外旋轮线的数学轮转曲线。”

关于万花尺及其相关曲线的文章非常多。除了 [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(又称相位);
  • 计算每个完整圆的循环数;
  • 添加其他一些系数。

 

所有这些版本都是完全正确的,因为它们都试图精确地绘制出与“几何绘图玩具”所产生的曲线相似的曲线。

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

  • Rr 的大小可以是任何合理的(或不合理的),即 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 片段(与下面所示的几乎相同)包含在此项目中使用的每个页面中。

// 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();
}

如上所示,——绘制齿轮曲线的函数非常简单,与 [2] 中使用的函数相似。

使用 Demo 1 网页

“演示 1:9 条齿轮曲线(2 个齿轮)”网页(GG2gDemo1.html)包含在 zip 文件中。

它在一个图中生成并显示 9 条简单的循环齿轮曲线(2 个齿轮)。参见下面的图 1。
注:此处使用并显示了系数 (R0 / R1 / T1)

  • 子图 1-6:最简单的典型曲线(“万花尺”也如此)
    • (30 / 10 / 10); (30 / 10 / -10); (30 / 29 / 8).
    • (30 / 15 / 20); (30 / 7 / 30); (30 / 27 / 20).
  • 子图 7-9:稍微复杂一些的曲线(只是有更多的循环)。
    • (30 / 15 / 57); (10 / 31 / 30); (30 / 27 / 40).
  图 1:简单循环的齿轮曲线(2 个齿轮) 

9 Gearographic curves

使用 Demo 2 网页

“演示 2:齿轮曲线(2 个齿轮)”网页(GG2gDemo2.html)包含在 zip 文件中。

它生成并显示近三打齿轮曲线(2 个齿轮)。你所需要做的就是点击“绘制下一个”按钮。
注意 - 使用的输入参数显示在画布上方的消息中,格式如下:
   f(2000,200,1,40,20,1,'red').

请参见下面的图 2 中的 6 条选定曲线

  • 子图 1-3:漂亮的甜甜圈,中间有五边形和四边形的 2 个图形;
  • 子图 4-6:雨伞,带“雕刻”的 3D 环和不对称图形。
  图 2:选定的齿轮曲线(2 个齿轮) 

Demo 2: Donut Demo 2: Central 5-gon Demo 2: Central 4-gon

Demo 2: Umbrella Demo 2: 3D ring with carvings Demo 2: Not symmetrical figure

使用齿轮曲线生成器网页

“齿轮曲线生成器(2 个齿轮)”网页(GG2gGenerator.html)包含在 zip 文件中,并在下面的图 3 中(部分)显示。

  图 3:GG2gGenerator.html 页面。 

GG2gGenerator.html page.

它允许输入几乎所有控制齿轮曲线绘制的参数,并能生成和显示所有可能的齿轮曲线(2 个齿轮)。

 

首先,请参阅下面的图 4 中选定的曲线。注意 - 用于绘制子图的输入参数如下:
  n / R0 / T0 / R1 / T1 / scale.

  • 子图 1-3(第一个是不对称的)
    • 3047/300/1/299/434/0.5;
    • 3047/300/1/299/435/0.5;
    • 4000/240/1/235/400/1.
  • 子图 4-6(全部 3 个都是不对称的)
    • 3119/300/1/299/311/0.5;
    • 1031/240/1/235/411/0.6;
    • 4003/240/1/235/400.023/1.
  图 4:选定的齿轮曲线(2 个齿轮) 

1233760/GGF_01.png 1233760/GGF_02.png 1233760/GGF_03.png

GGF_04.png: GGF_05.png: GGF_06.png:

现在,重新加载页面并按以下方式进行测试

  • 将线条数更改为 200,并保持所有其他输入字段不变,即使用默认值。点击“绘制!”按钮。结果,将绘制出所谓的“五边形甜甜圈”。
  • 现在尝试:201-203,然后是 300-303,800,1000,2000,3000。你会发现 2000 足够使循环看起来平滑,即没有可见的线段。
  • 继续使用相同的测试策略与其他输入参数。另外,尝试负值。最终,您将需要使用“绘图比例”参数,这将有助于将图像完美地放入画布中,或者有意地填充整个画布。
  • 交换 R0 和 R1,因此参数为 2000/100/1/200/40。结果 - 一个不同的甜甜圈。
  • 享受发现的新图像!我敢打赌,其中许多以前从未见过。

结束语

在测试“生成器”页面时,用户肯定会发现关于输入参数的以下有用提示

  • 线条数(实际上是线段)使曲线看起来平滑,对于大多数曲线来说,2000 就足够了。
  • R0 和 R1 充当所绘图形的外圆和内圆。但如果 R0 和 R1 的值互换,图形看起来会有所不同。
  • T1 控制循环数或多边形数(通常,此数字 n=T1+1)。

结论

首先,让我们强调:我们所有的目标都实现了!也就是说,我们定义了新的一组齿轮曲线,它与众所周知的万花尺曲线非常相似,但同时,它生成了塑料玩具无法绘制的新曲线。

应该提到的是,一些万花尺曲线无法通过齿轮曲线重现,这是对方程和一般绘图进行修改的必然结果。

(我希望)从这些不那么复杂的页面中学到的东西如下:

  • 如何将 9 张绘制的图片放入 1 个画布图形中(参见“演示 1”页面的代码)。
  • 如何仅通过每次“懒惰”点击来生成和显示许多选定的图形(参见“演示 2”页面的代码和 GGD2.js)。
  • 如何处理画布图形的前景和背景颜色(参见“演示 2”和“生成器”页面的代码)。
  • 如何测试具有许多输入参数的页面,例如,类似于“生成器”页面。

在下一篇“齿轮曲线 - 第 2 部分”文章中,将讨论一些有趣的 R 脚本发现,还将介绍基于 JavaScript 的多齿轮曲线解决方案。

参考文献

  1. 万花尺,维基百科,自由的百科全书,网址:https://zh.wikipedia.org/wiki/Spirograph。
  2. Voevudko, A.E. (2017) Dancing with Spirals. Code Project, 网址:https://codeproject.org.cn/Articles/1213518/Dancing-with-Spirals。
  3. Voevudko, A.E. (2018) 螺旋扭曲多边形和玫瑰。Code Project,网址:https://codeproject.org.cn/Articles/1224773/Spiraling-Twisting-Polygons-and-Roses。
© . All rights reserved.