友情提示:680元/半年,儿童学编程,就上码丁实验室。
在Scratch中开发时,常常需要将角色转向某个方向。上一篇文章讨论了如何使用目标角色法实现指向某个坐标位置的功能。但那个方法需要引入一个角色,用于在不同的位置作为目标。
本篇将介绍使用数学的计算方法。
提示:本篇涉及到较多的数学及三角函数知识,不一定在文章中讲解得很细,请自行百度或查找资料。
从一个坐标点指向另一个坐标点,实际上是一个从坐标差计算角度的方法。
如下图所示,假设两个点的坐标分别为(x1,y1)和(x2,y2),就是求与X轴之间夹角的问题。
设dx=x2-x1, dy=y2-y1,r为两点之间的距离,也就是根据dx、dy和r求出角度a。
在Scratch中,提供了一系列的函数:
注意,这里的角度都是数学体系中的角度。如下图所示:
三角函数是用来将角度变化为x、y、r之间比值的,反三角函数是用于根据x、y、r的值反求出角度值。
对应我们的需求,由于我们已经知道了dx和dy,看起来可以很容易地使用反正切函数atan得到角度。
实际上不像看起来那样简单。
这里涉及两个问题。
由于在不同象限可能得到相同的dy/dx,所以需要判断在哪个象限。从图中可以看到在第一象限中,dx>0,dy>0,所以dy/dx>0。但在第三象限中,dx<0,dy<0,同样可以得到dy/dx>0。所以函数只能返回0-90度的值,而不会返回180到270度的角度值。
在y轴上的问题。由于在dx=0时dy/dx为无穷大,所以无法直接进行计算。
这样就需要我们自己进行判断和处理了。
我们希望在输入dx和dy时,返回一个[0,360)度的角度值。
为了对所有可能出现的情况进行处理,将条件列表格如下:
根据上面的分析,我们就可以编写程序进行处理了。

实例:在两点之间绘制虚线。这次只需要一个角色。
生成坐标后调用绘制线的子程序。
下面是计算角度的子程序,就是实现了上面表格的判断。
还有画线的子程序,计算两个坐标点之间的差,并计算线段的长度。使用子程序计算面向方向后,进行虚线的绘制。注意中间仍然使用了从数学角度系向Scratch角度系的变换。
使用此程序绘制多条虚线,就能得到类似于如下的效果。
稍作调整,还可以绘制出有规律的图形(此程序略)
使用数学计算法:
优点:
不需要使用目标角色,可以直接得到任何两个坐标点之间的角度。
缺点:
使用了较多的计算,可能会对速度产生影响,而且程序与稍微复杂一些。
总结
1 本文章扩展了Scratch中提供的反正切函数,能够计算出任何两个坐标点之间的相对角度。
2 在条件组合比较多或比较复杂时,可以利用表格列出所有的条件组合,作为对设计程序的指导。
3 数学方法和使用目标角色的方法使用了两种不同的思路,从程序设计的角度,两种方法各有利弊,可以按需选用。