数与图(11)——画圆

本文在《数与图(10)——跳动的心脏》基础上,绘制圆形,并观察小球在圆周上的移动。

其实画布组件本身具有画圆的内置过程,只要给定圆心坐标和半径,就可以实现画圆的功能,不过,为了更好地从数学角度理解圆,我们还是自己写程序画圆,况且这样才能让球在圆周上移动。

在高中的解析几何课上,我们学过圆的方程:(x-a)2+ (y-b)2 = r2,其中(a,b)为圆心坐标,r为圆的半径。为了简化程序,这里假设圆心坐标为原点(0,0),圆的半径为2,这样圆的方程简化为x2+y2=r2。由此求出

这是我们画圆的数学依据。

在前面的文章中,我们对两个坐标轴的最大值、最小值的设定是不对等的,也就是说两个坐标轴的缩放比例有所不同,如果在这样的坐标系里画圆,可想而知,只能得到一个椭圆。为了获得一个真正的圆,我们需要让两个坐标轴具有相同的缩放比例,实现这一点最简单的方法就是让画布的宽和高相等。为此,我们要对用户界面稍加修改,然后再来编写程序。

一、修改用户界面

首先打开《数与图(10)》中的项目,将项目另存为“画圆”,然后在新项目中将屏幕标题改为“画圆”,将画布的高度设为350像素(宽度原本就是350像素),并手工填写坐标轴的绘图参数,修改后的用户界面如图1所示。

图1 修改画布宽度及坐标轴的绘图参数

此时连接AI伴侣,会看到手机屏幕上显示为图2中的样子。

图2 修改后的用户界面

二、编写程序

1、添加全局变量

首先声明一个全局变量R,设其初始值为2,如图3所示。

图3 声明全局变量

2、添加有返回值过程——圆函数

对于我们将要绘制的圆,它包含了两个部分:y大于0的部分和y小于0的部分,也就是说,对于同一个x,有两个y与之对应,它们互为相反数。因此,在圆函数过程里,除了参数x,还要增设一个参数“y大于零”,这个参数的值为逻辑值。具体代码如图4所示。

图4 有两个参数的圆函数过程

3、修改过程——求曲线坐标列表

对于同一个x,存在两个y值与之对应。在循环语句中,直接将x添加到全局x列表,将大于零的y值添加到全局y列表,将小于零的y值添加到局部变量y列表中。当循环结束后,将逆序的全局x列表追加到全局x列表,将逆序的局部y列表追加到全局y列表,代码如图5所示。

图5 修改后的过程——求曲线坐标列表

这里提醒读者思考一下为什么要对追加的列表进行逆序操作,如果不这样,会有怎样的结果?

三、测试

点击手机屏幕上的画曲线按钮,有圆画出来,再点击移动球按钮,球会沿圆周移动,起点和终点都是(-2,0)点,如下面视频1所示。仔细观察球的运动,发现球在x的最大值和最小值处会突然加速,这是因为对于等距离的x变化量,y的变化量增大明显。

视频1 球沿圆周移动

四、尝试另一种绘图方法

高中数学中讲到过极坐标,对于平面上的任意一个点,可以用“角度+长度”来确定点的位置。在极坐标系中,与原点相对应的点称为极点,与x轴正方向重叠的射线称为极轴,极轴也是0度角的位置,逆时针方向为角度增加的方向。对于平面上任意一点M,从极点到M的线段称为极径,用r表示,该线段与极轴之间的夹角称为极角,用θ表示(注意角度的正方向)。在极坐标系中,圆的方程异常简单:r=R(R为常量),无论角度取值如何改变,极径均为常量。

极坐标与平面直角坐标之间存在固定的转换关系:

利用这个转换关系,重新修改“求曲线坐标列表”过程,将原来循环语句中的循环变量x改为角度,然后根据角度和半径R计算x、y坐标,代码如图6所示。修改后的代码看起来更加简洁明了。

图6 改写过程中的循环语句——以角度为循环增量

再次进行测试,结果如视频2所示,注意观察球的移动速度。

视频2 修改后的测试结果

五、发现旧程序中的错误

在测试过程中发现,当半径为2时,可以绘制出理想的圆形,如果将半径改为1,则绘制出的是椭圆形,如图7所示。为什么会这样呢?图形的形状说明x的值发生了改变,但y值好像没有随着改变。

图7 测试结果出乎意料

经过一番排查,发现错误出在画曲线按钮的点击事件处理程序中,如图8所示,将第二行的错误改正后再来测试,结果显示正常,有兴趣的读者可以自行测试一下。

图8 修改bug

六、讨论

本文用两种方法绘制了圆,两种方法的差别在于循环变量的选取,当选择x坐标为循环变量时,需要分别计算y大于0和y小于零时的函数值,而且求值的过程涉及求平方根的运算;当选择角度为循环变量时,需要借助于三角函数运算,但代码变得简洁明了。

在测试过程中观察小球的移动速度,发现两种情况下,以x为循环变量时,小球的速度大小会发生变化,而以角度为循环变量时,小球的速度大小不变。

最后,翻开《数与图(10)》,发现其中的图4果然是错误的。这个错误来自复制粘贴代码的操作,粘贴之后没有进行必要的修改。这里希望读者能引以为戒,同时,对于错误给大家带来的困惑表示歉意。

另:老巫婆的程序世界线下班计划在2020年1月~2月间在北京开课,有兴趣的读者请阅读《老巫婆的程序世界线下培训通知》

(0)

相关推荐