导语
上学的时候经常会见到校门口卖有各种玩具,其中有一种玩具的玩法就和拿尺子画画一样,拿着笔在小齿轮的孔洞内带着小齿轮在大齿轮内旋转,画几圈就可以形成复杂而又美丽的图案。
这种简单的工具是如何绘制如此酷炫的图案呢?它的原理又是什么呢?接下来将带大家一起解密,结合算法和原理在未来板Lite上复现万花尺图案!
准备
材料准备
未来板Lite*1
软件编程使用
Kittenblock1.89
程序编写
1.原理
学习一门知识如同建筑房屋,必须先打好基础。想必很多人一开始接触这种玩具都凭感觉玩,但想要画出工整的图案那就必然离不开它的数学原理,只需要了解“内旋轮线”的概念就好了。说白了就是在大圆(半径R)内转动的小圆(半径r)上的一点(该点到小圆圆心距离为d)所形成的运动轨迹。
对于该点的运动轨迹,可以建立一个平面直角坐标系转化成坐标来表示,那么该点运动坐标的参数方程如下。
d为小圆圆心的距离;
R为大圆半径;
r为小圆半径;
t为大圆圆心和小圆圆心连线与X轴的夹角,模拟小圆在大圆内的运动情况。
x = (R-r) cost + d*cos((R-r)t/r)
y = (R-r) sint - d*sin((R-r)t/r)
(推导过程可以自行搜索)
有了这个运动坐标公式,我们就可以开始进行程序编写啦!
2.程序编写
随后参考给出的公式,编写内旋轮线轨迹的X坐标,由于公式比较长,我们可以先拆分成两部分编写:
随后再组合到一起并把值赋值给x坐标:
同样的方法把y坐标的公式也写出来:
但是到这里还没结束。根据内旋轮线公式建立的平面直角坐标系它的坐标原点在正中心。
而未来板Lite的屏幕坐标原点在左上方,屏幕的中心在(80,64)的位置上。
所以我们需要校准屏幕原点位置,把坐标原点从(0,0)挪到(80,64)的位置上。操作很简单,只需在原基础的x坐标和y坐标的变量上分别加上80和64即可完成坐标校准。
完成坐标后,现在开始利用坐标来绘制图案。使用未来板Lite屏幕显示像素图案的方法目前有两种,一种是使用全彩像素模式,通过输入像素坐标的方法进行图案绘制;另一种是通过海龟绘图积木,修改海龟的坐标进行绘制。这里我们选择第二种海龟绘图,并设置好相关积木,至于原因我们结尾会谈到。
由于使用内旋轮线绘画图案时,d,R,r这三个值是固定的,唯一改变的是大圆圆心和小圆圆心连线与X轴的夹角t,所以要提前设定好d,R,r的数值,比如R=34,r=57,d=35.5。t默认设为0。同时让海龟移动到设置的坐标位置上落笔(坐标位置需要取整数),落笔是为了形成海龟位置发生变化的轨迹。
最后模拟小圆在大圆转圈的运动,让角度t不断增加,同时不断更新海龟的x坐标和y坐标的值。当t到一定次数的时候,海龟就可以画出万花尺的图案了。
为了快速查看效果,请直接使用在线交互模式,直接点击小绿旗运行。
当然这个画图的速度是很慢的,因为坐标的变化非常慢。为了提升速度,我们可以在程序末尾处让每次t增加的角度多一些,比如每次增加10,这样就非常快了。
至于前面提到的为什么推荐用海龟绘图而不用像素坐标的方式是因为海龟绘图可以在移动的两点内生成线段,就算图像的坐标没有运算到也没有关系(t的变化较大时有些坐标没有计算到)。而用像素坐标的方式就只能一个点一个点的画了,如果每次角度增加的太多就会出现断点的情况。
至此,本篇内容全部完成了,如果想要画出其他图案可以自己尝试手动更改R,r,d的数值。
也可以尝试变化颜色画出变色图案~
功能演示
End

