带孩子玩Scratch编程:坐标(中)

“距离”是一个小朋友并不陌生的概念。我们在生活中经常说一个地方距离家远或距离家近,一般来说,去远的地方花的时间长,去近的地方花的时间短。

在几何学中,距离一般是指直线距离,也就是两点之间直线段的长度。比如想知道你家到幼儿园操场的距离,如果能用一根风筝线一头系在你家窗口,另一头拉到幼儿园操场上,用力把风筝线绷紧拉直,然后把两端多余的线剪掉,剩下中间这段绷直的风筝线,它的长度就是你家到幼儿园操场的直线距离。它比你坐电梯下楼,经过小区道路、大门走到幼儿园的步行距离肯定更短。

距离

下面,我们来看一些距离的数字,感受一下远近的差异。注意,随着距离变大,距离的单位也在变化。我们按越来越大的顺序来排列:

晚上睡觉时你和妈妈的距离:1米;
一辆中型公交车前后门之间的距离:10米
地铁站台的长度:100米
相邻两座地铁站之间的距离:1公里 = 10个100米

天安门到东、西五环的距离:10公里
北京到天津的距离:100公里
北京到上海的距离:1000公里
北京到美国洛杉矶的距离:10000公里(1万公里)

地球到月球的距离:38万公里
地球到太阳的距离:1.5亿公里(15000万公里)
土星到太阳的距离:14亿公里
海王星到太阳的距离:45亿公里

以光的速度走1年的距离:1光年 = 94607亿公里
太阳到比邻星的距离:4光年
太阳到猎户座大星云的距离:500光年

太阳到银河系中心的距离:2万光年(20000光年)
太阳到仙女座星系的距离:220万光年

LIGO引力波天文台2017年探测到的一次黑洞合并事件,其碰撞地点到我们地球的距离:90亿光年(900000万光年)

目前能观测到的宇宙最远处距地球:130亿光年(你和妈妈睡觉时距离的100000000000000000000000000倍)

要知道两个点之间的距离,需要用到测距工具。如直尺、卷尺、测距仪、全站仪、GPS卫星等。但如果我们有了一个很好的坐标系,又知道两个位置的坐标值,距离其实也可以计算出来。

例如,在Scratch中,可以用以下公式计算两个卡通角色之间的距离:

Scratch勾股定理计算距离

Scratch计算距离截图

上边公式中的“Skeleton的x坐标”和“Skeleton的y坐标”是另一个角色——骷髅(Skeleton)的横坐标和纵坐标。关于怎么给画布上增加一只骷髅,并找到它的x、y坐标,可以在后面的例程中学到。我们先说说这段长长的公式,它叫做毕达哥拉斯定理,也叫勾股定理。

通过刚才的练习题【原书中有一个练习】我们知道,如果两个点纵坐标差3、横坐标差4,它们的距离就是5。纵坐标差6、横坐标差8,它们的距离就是10。2000多年前的古希腊数学家毕达哥拉斯从中发现一个规律,就是:

5 x 5   = 3 x 3  +  4 x 4  = 25
10 x 10 = 6 x 6  +  8 x 8  = 100
斜边长度 x 斜边长度 = 水平距离 x 水平距离 + 竖向距离 x 竖向距离

知道(斜边长度 x 斜边长度)的乘积是多少,再使用一个平方根函数,就能知道写斜边长度本身是多少。这就是上页的笛卡尔坐标系“距离公式”的由来。

在Scratch中,由于距离是经常用到的概念,所以系统提供了一个更快捷的积木,方便你获取两个角色之间的距离。这个距离积木就在“侦测”栏目中,原型是“到(鼠标指针)的距离”。你可以把圆括号里的“鼠标指针”改成屏幕上的任何一个角色。

Scratch侦测距离

这样查询2个角色的距离就简单多了。实际上是Scratch在后台帮你用2个坐标和毕达哥拉斯定理进行了计算。

除了直角坐标系之外,在后面你还会看到一些其他类型的坐标系,每种坐标系有自己的距离、夹角计算公式。有些很复杂,留到小朋友们在上学后学习吧。

现在我们看看如何在Scratch中创建第2个角色,并利用“距离”积木编写一个小游戏。

示例程序6:躲骷髅的猫,看你能不能撑20秒

Scratch躲骷髅的猫

小猫有100滴血(blood变量),它会跟着你的鼠标指针移动,骷髅在屏幕上随机漂移,如果漂到小猫身边、距离不足一个身长的范围内,小猫就减25滴血,同时骷髅长大20。看看最终你能撑几秒。

首先在Scratch的右下角找到添加角色的按钮。

Scratch添加角色

在弹出的窗口中选择骷髅Skeleton。

然后,在“变量”栏目里,点击“创建一个变量”。

Scratch躲骷髅的猫第1步

新变量名下面写入“blood”,下边有2个选项,我们选择“适用于所有角色”,这表明小猫的程序里也可以用到这个变量。

再用同样方法建立一个“Time”。

Scratch躲骷髅的猫第2步

在角色栏里点一下骷髅,这样代码窗口就切换为骷髅的程序。按下图建立骷髅的程序。

骷髅的程序主要分2条流线。

第一条流线是每1秒钟都做以下4件事:(1)随机换一个新位置;(2)发出沙沙声;(3)变换一个造型姿势;(4)更新界面上显示的秒数。

第二条流线是每时每刻都检查与小猫的距离,如果不到一个身长(大小)了,就触发消息1,并将自己的身长(大小)再增大20。

Scratch躲骷髅的猫第3步

这2条流线各有1段独立的代码,都以“当⚑被点击”积木开始,说明当点击绿色旗子后,会同时执行这2段代码。在上边的代码中,你不熟悉的积木可能不少:“播放声音(  )”在“声音”栏目中;“下一个造型”、“大小”、“将大小增加(  )”都在“外观”栏目中;“将[Time▼]设为(  )”在“变量”栏目中,原型是“将[我的变量▼]设为(  )”,需要点▼选择我们刚才创建的变量Time;“四舍五入(  )”和“(  )<(  )”在“运算”栏目中;“如果<   >那么”在“控制”栏目中,它是一个条件判断积木,如果尖括号里的条件成立,将会执行积木里包着的内容,不成立就直接跳过,执行后面的积木;“广播(消息1)并等待”在“事件”栏目中。

然后在角色栏里点一下小猫,切换为小猫程序的代码窗口。搭起以下程序:

Scratch躲骷髅的猫第4步

“当接收到(消息1)”积木在“事件”里,这块积木也叫“消息1的监听器”。当骷髅的程序执行到“广播(消息1)并等待”时,由于小猫的程序里有“消息1的监听器”,所以小猫就会立即执行“监听器”积木下方的程序——惨叫一声、减25滴血、身上颜色改变。小猫这段程序执行完之后,骷髅的程序结束等待,继续往下执行。

“清除图形特效”、“将[颜色▼]特效增加(  )”、“说(  )(2)秒”都在“外观”栏目中;“鼠标的x坐标”、“鼠标的y坐标”在“侦测”栏目中;“停止[全部脚本▼]”在“控制”栏目中,它是在小猫的血不足10之后被调用,用来结束本次程序的运行。

Scratch躲骷髅的猫运行截屏

检查一遍代码,运行游戏,看看你和爸爸谁撑的时间长吧。

—————-

“方向”也是一个生活中常用的概念,表示方向的词有“上下左右、前后、东南西北、里外”等等,这些小朋友都不陌生。在几何学里,方向是从空间中的一个基准点,向远处延伸的路线。我们常用箭头来表示方向,比如公园里的指路牌,户外用的指南针等等。在表示方向时,箭头、指针的长短不重要,只要它们延伸后是相同的路线,就是同一个方向。

Scratch方向

前几节我们已经知道了,位置是可以用数字表示的。同样,方向也可以用数字表示,这会比只说“东南西北”更加精确。我们还是先不纠缠概念,直接看实例:在Scratch里,角色的方向就是用数字表示的。如上图所示,你可以找到调整角色方向的转盘,拖动蓝色箭头,角色随之转向,同时,显示在方向括号内的数字也跟着变化了。

在上边这个Scratch的例子里,如果箭头竖直向上指,方向值是0;随着箭头顺时针转动,方向值会变大,最大可以增大到350多。转过一圈之后,箭头回到竖直向上指的方向,方向值就又变回0。

这有点像钟表的时针,时针是从12点顺时针转,经过1、2、3点…最后回到12点。所以有些飞行员在无线电联络时,会使用几点钟代表一个方位。比如乐迪在天空中通过无线电呼叫机场,询问机场在哪里,塔台可能这样回答:“乐迪,机场在你的11点钟方向”,其实就是说,机场在前方稍偏左一些的方位。

飞机的方向

所以我们看到,Scratch的从0-359的方向值,和飞行员使用的1点钟-12点钟方向,都是用数字表示方向的方法,区别只是二者精度不太一样。Scratch的这种方向值,实际是箭头从竖直向上方位起算、顺时针转动的“转角”。转角的单位是°,转动一整圈是360°,它和0°是同一个方向。转动半圈是180°,东、南、西、北四个方位之间转角相差90°,下图给出了一些典型的转角大小。

极坐标中的角度定义

明白了方向值的意义之后,下面,我们一起来用Scratch做一个能转动的钟表吧。

示例程序7:转动的钟表

首先,创建一个空白项目,并在“角色”栏里删除小猫。

然后,添加一个“Pufferfish”角色(圆圆的河豚),拿它当作我们的表盘。在角色栏上方,把这个角色的x、y都设为0,大小设为200。

再添加一个“Arrow”角色,作为较短的时针,x设为25,y设为0;

最后添加一个“Wand”角色,作为较长的分针,x设为0,y设为35。三个角色添加完成后,效果如下图所示:

Scratch转动钟表

按下图搭建河豚的程序,“按下(空格)键?”在“侦测”栏目里。

Scratch转动钟表第1步

另外,我们这个程序将使用到一个比较特殊的变量:在“侦测”栏目里,有一个叫“计时器”的圆块,它也是一个变量,给它的勾挑上,可以发现这个“计时器”变量的数值是在动态增大的。这个数值其实是程序已运行的秒数,每点一次绿旗子“⚑”启动程序,计时器会自动归零。它的数字是计算机系统告诉我们的,所以这种变量也叫“系统变量”。

之后,拼出魔棒“Wand”角色、箭头“Arrow”角色的程序:

Scratch转动钟表第2步

Scratch转动钟表第3步

在这个程序中,“面向( )”块在“运动”栏目中,它就是修改角色旋转方向值的语句。点击绿旗子“⚑”,看看你的表是不是快速旋转起来了呢。

提高:如果你想让表转的慢一些,或者快一些,可以调整所有“计时器*( )”括弧里的数字,数字越大表转得越快。但为了让分针转1圈,时针转1个小时,需要让“魔棒”程序里的这个数字是“箭头”程序里数字的12倍。如12:1、24:2、30:2.5、48:4、60:5都是可以的。

明白了方向值的意义之后,我们再介绍一下“角度”。

角度

先来说什么是“角”,一个顶点发出两条射线,就形成了一个角。上图中的三角形有3个角,分别用蓝色、绿色和红色画了出来。可以看到,角的形状像一个夹子,因此我们有时也说两条线的“夹角”。

那么“角度”是什么呢,角度就是角张开的大小。如果我们知道顶点发出的这两条射线的方向值,用大数减去小数,得到的就是这个角的角度,就像上图那样。

但是现实世界不像Scratch,确定每条边的方向值比测角更啰嗦,在现实中测量角度只需要用一个量角器就可以了。

量角器

如果你有量角器的话,将量角器底边中心对准角的顶点,让底边的0°方向对齐角的一条边,看另一条边的刻度是几,角度就是多少。

另外,前一节课我们提到过,在“好”的坐标系中,只要知道图形的坐标值,距离和夹角是可以用公式计算出来的。在Scratch的坐标系中计算距离的公式,我们已经通过例程6接触过了。那么如何通过坐标值计算夹角,似乎也应该有一个例程。不过这个例程比较复杂,用到2次距离计算公式,1次内积公式,1个反三角函数。这么复杂的公式对小朋友来说难度太大,因此就不详细介绍它背后的数学含义了。只是为了证明我们没有敷衍你,在下面贴出例程8,该程序依据坐标值计算地球——太阳——土星这3个角色的夹角。

示例程序8:用坐标计算夹角的公式

Scratch计算内积

Scratch计算内积截屏

其中,“(Earth▼)的[x坐标▼]”等积木在“侦测”栏目中,原型是“(舞台▼)的[背景编号▼]”,它是获取另外一个角色状态信息的重要途径。

————-

更多种类的坐标系

第一节提到过,除了之前我们一直在用的直角坐标系之外,还有一些其他类型的坐标系,也是人们常用的好坐标系。在学习了距离、方向和角度之后,这节我们就可以介绍2种特殊的坐标系。

极坐标系

上图是一个常见的雷达图,图中A~F是雷达探测到的6架飞机,雷达基站在图的中心处。雷达通过无线电扫描,能够测量出它到每架飞机的距离,以及每架飞机相对它的方向。这两个数字——距离和方向,也能组成一个坐标系。我们把这类坐标系称为“极坐标系”。

上图中,飞机A距离雷达100公里,在雷达的135°方向,因此坐标可以写为(100,135°)。在雷达图上,与A在同一个圆环上的所有点,如D点,都是距离雷达站100公里。它内侧那个圆环,也就是C、F点所在的圆,距离雷达站是50公里。外侧那个大圆环,也就是B、E点所在的圆,距离雷达站是150公里。这些红色的同心圆实际上是距离的刻度线。

蓝色的放射线更容易理解,它们是方向的刻度线。

最后我们再介绍一种“地理坐标系”,它是我们在旅行、导航时可能会接触到的坐标系。下图是Google Earth中显示网格的地球:

地球的经度纬度

地球上的这种网格,术语叫“经纬线”,竖线叫做经线,横线叫做纬线。每一根经线、纬线都有度数值,称为经度、纬度。例如横穿北京的横线,是北纬40°线,东京所在的竖线,是东经140°线。用一个城市所在经线的度数,和所在纬线的度数,也可以组合成一个坐标,这就是经纬坐标。北京的纬度是北纬40°,经度是东经116°,因此坐标可以写为(N 40°,E 116°)。找一个地球仪,或者打开Google Earth,看看你去过的城市经纬坐标是多少吧。

如果你经常坐车,对GPS导航应该不陌生。GPS模块就是通过测量它与太空中30多颗导航卫星之间的距离,来计算你在地球上的地理坐标,从而知道你在哪、该走哪条路的。而且GPS使用的坐标精度很高,它算出你所在位置的经度、纬度不只是一个整数,还有小数点后面的4-5位小数。例如天坛圜丘中心的经纬坐标是(N 39.87558°,E 116.40695°),这样高的精度就能让定位准确到几米的范围内。