友情提示:680元/半年,儿童学编程,就上码丁实验室。
在本系列文章中,作者提出了对周围环境进行探测的“探测器”概念。给出了探测器的多种分类,对基于角色运动的“位置探测器”、基于大小的“尺寸探测器”、基于不同造型的“造型探测器”及基于颜色的“颜色探测器”进行了研究和说明。
本篇将研究一种有趣的探测器,
用于对碰到的边界的方向或角度进行检测。
这个探测器源于一个小球反弹的游戏。游戏的内容是一个小球在碰撞到其它物体时会反弹回来。这种情况下,关键是对移动方向变化的判断,在碰到边界时,可以使用现成的“碰到边缘反弹”积木进行处理。但如果需要判断碰撞到其它物体的反弹时,就需要进行自己的处理了。
根据物理原理,一个小球在碰撞到一个面时,入射路径与反射路径的中线就是碰撞点处面的法线。所以为了计算出反弹方向,首先需要得到法线的方向,也可以说是得到切线的方向(由于切线与法线垂直)。
那么在碰到边界时,如何得到切线的方向呢。
根据切线的数值计算方法,如果知道一个点左右两个点A、B的位置,可以近似使用两点连线AB的斜率代替切线的方向。
那么,主要的问题就是得到A与B的位置。如何得到呢?可以这样考虑:以碰撞点为圆心画一个圆,就与边界交于AB两点,这样就可以得到两个交点了。
但Scratch中没有提供直接的方法,我们还需要自己想办法。参考之前的造型探测器,可以制作一个SEEKER去探索圆周上的点。
制作方法
1先制作一个球,再制作一个SEEKER造型。
现在SEEKER的造型只是在中心点后(左侧)的一个小点。
那么如何使用这个SEEKER呢。
2看程序
这是球运动的主程序,其中通过findangle自定义积木寻找两个交叉点对应的角度,并计算出法线角度和切线角度。
FindAngle程序如下。
思路如下
将造型切换为SEEKER,面向球前进的方向(这时SEEKER的点在背后),先向右旋转,直到碰到黑色,记录为a1,再向左旋转,直到碰到黑色,记录为a2,则a1与a2的平均值就是法线的方向。这样就能够计算出反射的角度了。
应用这个方法,就能够制作出小球在不同表面上反弹的效果了。
在使用“角度探测器”时,需要
1 如果碰撞点正好处于一个折点,可能会发生误判。
2 由于有寻找交叉点的过程,所以会减慢运行的速度。上面的程序只在加速模式下运行才好一些。
3 如果使用不同位置,不同特性的探测器,还可能对此方法进行进一步的扩展。得到更好的效果。
总结
1 使用角度探测器,即旋转的探测点,可以对周围的环境进行检测。
2 探测器展示了一种自动探索的思路,类似于简单的人工智能。