欢迎光临
我们一直在努力

scratch中画圆的几种方法

不知大家有没有注意,小八公众号的功能介绍是“介绍各种游戏攻略,主要对于scratch编程有深入的讲解”,但距离小八上一次讲scratch(其实是晒最新力作)还是去年10月份,整整大半年都中断掉了。为了弥补这一长段时间的空缺,小八这一次要重新回归scratch!

‘画笔’这一功能,很久以前就有在计算机上普及,大致可以追溯到20世纪60年代的logo语言,它支持移动、填色、擦除等基本命令来作图,甚至还能够绘制商标!在小学课本上,PC logo就被当作是一门“信息必修课”(可惜初中的课本没有衔接好,以前一系列的编程内容都被残忍地删去了),小八对当时期末考试要求画的螺旋桨还记忆犹新。只不过logo是使用命令行来编写的,学起来比较枯燥,还要记一大堆可以让脑袋积水的语句,起步会比较慢。

当然,我们神通广大的、全球编程语言知名度排名前十的scratch,怎么会没有这样一种可以画图的模块呢?早些关注我公众号的朋友应该都看过了scratch新手之路3, 学习了怎样画多边形。但由于scratch里没有像turtle库一样内置画圆的函数(插一句嘴:真不明白scratch发明者为什么不提前写一段画圆的代码,方便用户使用。唯一可能的原因是因为当时内存太贵,这么一段代码在全球数百万用户的屏幕上显示和占用,代价太高了,而且用已有的代码完全可以编写出画圆的函数,不必再单独添加在模块中。其次,scratch编程员太懒,记性也不太好,一恍惚过去就忘了。。。),想要画出一些以圆为基础的复合图形就成了一个令人困惑的问题。小八在下面会列举several种画圆的方法,其中还包括一两个很奇葩的解决方案!(在这过程中,你还会接触一些可怕的数学计算,不过,你仅需要放松心态阅读完全文就可以了^%^)

NO.1——画正多边形(边数最好>=100)

这是最普遍、最通用,也是很多编程教师都使用的方案。“圆滑的曲线”在电脑上是不存在的(屏幕毕竟有像素,是不?),我们只能通过小短线以很微小的角度旋转来绘制出曲线,让毛糙的棱角尽可能显得平滑。而圆呢,则是最特殊的一种——它边上任取一点到中心的距离都相等,所以看上去十分地匀称,我们将通过画正多边形来模拟真正意义上的‘圆’。

好,说了这么多,代码却没见着多少,现在我们进入实践时间!

因为小猫旋转一周需要360°,我们将会用360/边数来获取每一次旋转的角度:

为了避免一开始归位的时候会遗留下痕迹,我们在开头先抬笔,清除画布,再移到(0,0),接着就可以欣赏到小猫的杰出画作了!可是scratch的运行速度会比较慢,重复执行100次可能会消耗掉将近5秒时间。如果你等不及,可以在‘编辑’里选定‘加速模式’哦!

难度:蛋糕

优点:速度较快

缺点:不能有效控制圆的大小

综合评分:* * *

NO.2——缩放与图章

就在小八讲解的时候,你也许已经和画笔玩得不亦乐乎了——

呵呵,上面这个杰作,就是用一个伟大的函数——‘图章’来实现的,它可以将角色的图像印制在舞台上(和以后要将的克隆有一点区别,先别搞脑子了~~~)。那么,我们先新建一个角色:

我们待会儿将要以这个圆为模板来‘绘制’更多形形色色的圆形,包括色彩、大小和位置上的纷呈变化。

随机命令大家应该都熟悉吧,就是在两个数字框内填入最小值和最大值(x坐标是-240~240,y坐标是-180~180,这个在以后经常会用到),scratch会帮你从这个范围选取数字。

运用随机的不可预测,每一次的作画都会因位置、颜色和尺寸的变化而产生创新。语句最后,当然是简单粗暴的‘图章’。。。

难度:小白

优点:简单方便

缺点:边的粗细。。。

综合评分:* * * *

NO.3——方程遍历

过敏提示:这里可能会有一些关于数学的内容……

在笛卡尔坐标系中,x坐标和y坐标对应为(0,0)的位置是正中心(原点)。根据勾股定理a**2+b**2=c**2,我们以x:-50,radius=100为例子,在下面的图中,垂足的x位置是-50,原点到圆边上的距离为100,也就是半径。因此垂直于x轴的线段的距离为(10000-(-50)**2)**0.5。因为实数平方之后都是非负数,所以就不用abs函数转换了(下面的图是小八在scratch背景编辑器里手画的)

我们先设两个变量,就叫‘x’和‘y’,‘x’用来表示x坐标,‘y’用来表示y坐标,这样直截了当一些。

开始,我们把x设为-100,也就是说小猫的起点在原点左侧100个像素的位置。因为半径为100,所以y坐标为10000-(-100)**2=0。在图中,(-100,0)的确是正确的。因为x总共要从-100遍历到100,所以我们弄一个重复执行200次的循环:

这样下来,小猫就画了一个半圆。至于后面的步骤,大家也能自己想出来了吧,x还是设为-100,但两句蓝色的动作命令要变为x*-1和y*-1,因为x坐标是从正的逐渐变为负的,取相反数,而y坐标这次却是在下边,总是非正的。不过,小八还是要提醒一下,如果你一不小心把最后一句命令的“改变1”写成了“改变-1”,将会发生非常恐怖的后果,因为10000-(-101)**2<0,而scratch却要计算一个负数的平方根,并且转化为坐标(不过你要庆幸scratch只是不耐烦地把y显示成NaN,如果你用的是标准的编程语言或是电脑没有装热离子安全阀,那么问题就大了)!

下面是全部的代码——

难度:原始人

优点:可控制圆的半径大小

缺点:由于scratch处理数据精度的问题,画完之后的圆往往会有一个缺口。。。

综合评分:* *

NO.4——三角函数

这应该是小八认为最难,也是最好的一个解决方案了,它不仅运算快、精度高,还可以控制圆半径的大小。由于时间关系,小八就不多作解释了,唯一要提的是除了用勾股定理,还可以用x=cosθ*radius,y=sinθ*radius来获取坐标位置(其中θ从0~360按自然数顺序依次遍历)。小八还将这种方法写成了自定义函数,还提供滑轮控制。下面是脚本谍照:

以及效果图:

别忘了按照注释去做哦!

这一期的内容就全部结束了(小八写了3天,父母都在催——文章可真长啊!),希望小八的公众号能给你带来创作的灵感!

(注:离开scratch现场,可别忘了摘下安全帽!)

赞(40)
分享到: 更多

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址