数与图(12)——画椭圆
在高中数学中,椭圆的标准方程写作
本文只讨论方程⑴的情况。
由⑴式可以求出函数y的表达式
这正是我们在绘图程序中需要的表达式。
方程⑴中的a、b称为椭圆的长轴及短轴,表示椭圆在x、y轴正方向上的最大值。描述椭圆的另一个特性是焦点,椭圆有两个焦点,方程⑴的焦点在x轴上,它们的坐标分别为(-c,0)及(c,0),其中
我们将在绘制椭圆的同时,在坐标轴上标记焦点的位置,以便比较长短轴的比例对焦点位置的影响。
打开上篇文章中的项目,在设计视图中,将“画曲线按钮”改名为“画椭圆按钮”,按钮的显示文本改为“画椭圆”。本文中即将绘制的椭圆其长轴最大为20,短轴小于或等于20,因此坐标系中两个坐标轴的最大值为20,最小值为-20,主间距为5,辅间距为1。按照这样的设定修改8个文本输入框中的显示文本,结果如图1所示。
图1 修改用户界面
图1中显示的1.png是椭圆方程的截图,用图片组件替代原来的“表达式标签”,设置其图片属性为1.png。设水平布局4、水平布局5的高度为自动,屏幕的垂直对齐属性为居上。然后切换到编程视图,开始编写程序。
一、全局变量
声明一个全局变量a,用来保存椭圆方程中a,代码如图2所示。
图2 声明全局变量
二、创建有返回值过程
1、椭圆函数
该过程有四个参数,如图3所示,其中的a、b、x分别对应于方程⑴中的各个量,参数“y大于0”为逻辑值,当该参数取值为真时,返回正的y值,否则返回负的y值。
图3 有返回值过程——椭圆函数
2、椭圆焦点坐标x
该过程返回椭圆焦点的x坐标c(c>0),代码如图4所示。注意这个c值是平面直角坐标系中的值,在调用该值进行绘图时,还要转换成画布坐标系中的值。
图4 有返回值过程——椭圆焦点
三、创建无返回值过程
1、求椭圆坐标列表
这个过程复制于原来的“求绘图坐标列表”过程,不同的是,这里x的最大值刚好与a相等,因此循环变量的取值范围为[-a,a]。代码如图5所示。
图5 无返回值过程——求椭圆坐标列表
2、绘制焦点
该过程分别在椭圆的两个焦点处画一个实心圆,圆的半径为5像素,代码如图6所示。前面提到过,焦点c的值是直角坐标系中的值,此处需要转换为画布坐标系中的值,这一点要格外小心。
图6 无返回值过程——绘制焦点
四、事件处理程序
我们的目标是让a保持不变,让b从20减小到6,减小的幅度为2,针对每一组a、b,绘制一个椭圆,并标记2个焦点。在画椭圆按钮的点击事件中,利用循环语句实现这一目标。为了标明椭圆与焦点的对应关系,每次循环都会改变画笔的颜色。代码如图7所示。
图7 画椭圆按钮的点击事件处理程序
五、测试
测试的结果如图8所示。
图8 测试结果
图中显示了8个椭圆(其中一个是圆)以及x轴上的8对焦点,正如我们期望的,从颜色上可以区分出椭圆与焦点之间的对应关系。当b=20时,椭圆变成了圆,两个焦点重叠在坐标系的原点。当b值在a附近逐渐变小时,焦点迅速远离原点,但当b值在远离a处变小时,焦点远离原点的速度越来越慢。
六、讨论
记得在上高中时,也曾在坐标纸上画过椭圆,但是无论是计算,还是绘图,都不可能像计算机这样精确,对于焦点的位置,始终缺乏直观的认识。直到今天,我才发现,随着b的减小,焦点远离原点的速度也在减小!至于这两者之间的关系,可以用微积分的方法准确地求出,有兴趣的读者不妨试试看。