在上篇文章《數與圖——整理與分享》的末尾有一個二維碼,那是一個下載連結,是截止到彼時的《數與圖》程序的源文件「畫橢圓.aia」。已經下載了該文件的讀者會發現其中包含了畫橢圓的程序,但那還不是最終的程序。本文將完成與繪製橢圓相關的程序,並討論橢圓方程中常數a、b對橢圓形狀及焦點位置的影響。
在高中數學中,橢圓的標準方程寫作
本文只討論方程⑴的情況。
由⑴式可以求出函數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的減小,焦點遠離原點的速度也在減小!至於這兩者之間的關係,可以用微積分的方法準確地求出,有興趣的讀者不妨試試看。