【共享插件026】万花尺
小时候用来画花纹曲线的万花尺玩具,有了数字版了。
“万花尺”是个简单的机械玩具,利用齿轮啮合原理来画复杂的花纹曲线。
▼万花尺和它画出来的曲线

简单而有规律的图案最适合用程序实现。这类图案大致可归为generative art的范畴,它的曲线形态的定义方式不是用数学公式,而是用运动规则。一些简单的运动可以产生非常复杂奇妙的图案,甚至程序员在看到程序运行结果之前也猜不出它能画出什么——这才是代码艺术的最大魅力。
插件在附件内。
与先前发布的25个插件一样,这也是一个免费的CorelDraw插件。可参考以前的文章来获得安装指导(其实不用安装,但是在部分版本的CorelDraw上运行可能会遇到一些不知所措的情况,没用过宏的围观群众也需要了解下基本常识)。
1.基本原理
万花尺的基本原理是一个齿轮与另一个固定齿轮啮合,把笔尖放在动齿轮上的小孔里,齿轮运动时笔划过的轨迹可以形成美丽的曲线。
程序运行的原理也类似:让动齿轮每次滚过一个小的角度,计算小孔的坐标位置,然后记录下来。把所有记录下来的点坐标连缀成一条Bezier曲线就行了。
在这个插件中,固定齿轮、动齿轮、动齿轮上的小孔都是用户自己画的,当然,不用把一个个齿都画出来,用一个大圆代替固定齿轮、用一个小圆代替动齿轮(滚轮)就行了,程序可以保证两者准确啮合。

上图是一个滚轮(右下角)沿着一个圆(中间的粗黑线)滚动,滚轮中小孔的运动轨迹产生的两条曲线(红蓝线),其中红线是滚轮在圆外滚动,蓝线是滚轮在圆内滚动。为了方便理解,把不同位置上的滚轮都画了出来,可以清晰地看到小孔的运动轨迹。
2.使用说明
下图是插件界面,已经尽可能的简单了。

除了右下角的广告,这个插件总共有一个参数和四个按钮。
Select Path按钮要求用户先选择一个圆作为固定不动的大齿轮,即path。其实选任何曲线都可以,不一定是圆,甚至也可以选一条不封闭的曲线,这就是数字技术的优势了。
先选曲线,再点击Select Path,程序会“记住”用户选择图形。如果点按钮时忘了选曲线,程序会给出提醒。
Select Roller的功能类似,用来选择“滚轮”(Roller),就是万花尺里的动齿轮。
对所选的滚轮有几个要求:
1)必须是群组,把滚轮外圈(就是一个圆)和笔孔(小圆,可以有好几个)组合在一起作为一个对象来选中;
2)群组中最大的一个被当做外圈,其他物体统统当做笔孔;
3)滚轮外圈必须是圆的,否则程序会提示错误然后退出;除滚轮外圈外的其他物体可以不是圆的,它们的中心坐标提供了画曲线所需的控制点,它们的形状则不重要,可以是任意形态。
Rounds参数指示滚轮滚多少圈,默认是一圈,这个数字可以不是整数。
Select Path和Select Roller两个按钮都执行完后,下面的两个按钮才变得可用。
Roller Rounding按钮用于对滚子进行小幅缩放,使path的长度正好是滚子周长的整数倍,这样滚子在path上滚完后笔孔可以回到原位,笔孔扫过的轨迹可以形成一条封闭曲线。如果Rounds参数不是1,则不要点这个按钮,否则滚轮滚过的每一圈产生的曲线都是相同的,重叠在一起。玩过万花尺的人可能会注意到,大齿轮的齿数通常不会是滚轮齿数的整数倍,两个齿数一般是互质的,这样可以滚出很复杂的花纹出来。
Go!按钮是执行按钮,按下后开始制作花纹。
3.单曲线
先来看看最简单的path和最简单的滚轮合作的结果。

上图左path右滚轮,滚轮大小圆整过(即使用Roller Rounding按钮调整过),Rounds=1。得到的是一个五瓣梅花的形状(下图左)。如果滚轮没有圆整,将得到一个不封闭的图形(下图右)。

右图看起来很丑,不过把圈数加大就好看了,下图是Rounds=30的效果。

改变path大圆的直径,花纹会发生有趣的变化(并不是简单的等比例缩放)。以下几个图是path直径依次缩小的效果。





下面三个花纹来得不容易,滚轮与path长度的比例关系要求十分精确,只在一个很小的范围内才能做出这个效果。



上面几个图画出来的曲线都在path大圆的外面,也就是说,滚轮是在大圆外面滚。如果把path曲线的方向反过来,滚轮就会在里面滚。曲线反向可以进入曲线编辑状态右击曲线选择反向实现,如下图所示:

以下是path大圆逐渐放大的执行效果。








滚轮中的笔孔也可以设置在滚轮外面,如下图所示。实物万花尺这么做可是有点困难。

能产生什么效果可以自己试试看。
4.多曲线
如果需要同时画多条曲线,只要在滚轮上多画几个笔孔即可。程序准备了几个做好的滚轮,主要区别是上面笔孔的排列方式。

程序执行时,滚轮上的每一个笔孔都会画出一条单独的曲线。下面5个图依次是上述5个滚轮在椭圆path上产生的曲线组,Rounds=1。因为有多条曲线,就用不同的色彩标识出来以示区别,上面那些曲线虽然很复杂,但都只有一条。





第一个和第三个看起来很像,但又略有区别,比较一下笔孔和滚轮外圈的位置关系对曲线形态的影响。
5.非封闭的Path
开放曲线也可以做path,不过这样就不能一圈一圈没完没了的滚了,滚到头即停。所以如果所选的Path不是封闭图形,则Rounds参数会自动按1计算,不管用户填了多少圈。
下图是第三个滚轮在一条螺旋线上滚动的结果。

下面这条曲线的path是随手画的。

6.异形Path
程序允许用户使用任何形状的path。




最后一个略猥琐,可以无视。
7.关于“机械曲线”
前面提到的Generative Art是数字艺术中的一个大类,就这个插件而言,称其为机械曲线更合适些,因为这类曲线可以摆脱软件程序,制作真实的机械机构来实现。
其实所有平面机械机构的运动轨迹都可以用类似的方法做出来,并没有太多的技术难度。机械设计中有个经典的题目是在没有滑块(只有铰链)的条件下让运动机构中的某个点走直线,或走一段直线。如果让程序自动设计这类机构,虽然可以做,但是非常复杂,对问题本身和约束条件的定义就是一个很大的挑战。传统优化方法处理这类问题也会面临计算量和机构模拟运行方面的困难,设计师基本帮不上什么忙。本文的做法不失为一部分问题的解决之道,如果设计师能够自己写代码的话。这个插件只有200多行,有初中数学基础即可动手编写,完全在艺术家的能力可及范围之内。







































