科技

少兒程式設計|Scratch例項11:精確計算圓周率程式(機器模擬割圓法

(點選 ↑藍字,輕鬆關注。檢視歷史文章,收穫最新資訊)

本文中,我們將使用程式求解圓周率,通過這個例項,我們可以感受到計算機程式給人類帶來的巨大得計算能力提升,這種能力對需要大量計算的人群來說是無法想象的,比如以前的數學家、科學家等。

在程式設計之前,讓我們一起回顧什麼是圓周率,以及瞭解什麼是圓周率計算方法“割圓術”。

圓周率與割圓術

什麼是圓周率?

π is commonly defined as the ratio of a circle's circumference C to its diameter d.

The number π (/paɪ/) is a mathematical constant. Originally defined as the ratio of a circle's circumference to its diameter, it now has various equivalent definitions and appears in many formulas in all areas of mathematics and physics. It is approximately equal to 3.14159. It has been represented by the Greek letter "π" since the mid-18th century, though it is also sometimes spelled out as "pi". It is also called Archimedes' constant.

圓周率是一個數學常數,是一個圓的周長 C 和其直徑 d 的比率,約等於3.1415926,它在18世紀中期之後一般用希臘字母 π 指代,有時也拼寫為“pi”。

—— Wikipedia

如圖,圓周率 = 圓的周長 ÷ 直徑。

什麼是割圓術?

“割圓術”是一個重要的求解圓周率的方法,三國時代的劉徽、南北朝數學家祖衝、希臘數學家阿基米德等等,都是使用割圓術完成自己對圓周率π的計算。

下面是劉徽的著作中關於割圓的描述,他算出的圓周率值是3.1416。

簡單一點解釋,割圓術就是在圓內繪製等邊多邊形,當多邊形的邊數越多時,多邊形的周長與圓周越是接近,同時,多邊形周長除以圓直徑的結果越接近某一個固定值,這個值被稱作“圓周率”。

下面分別是6邊形、12邊形、24邊形、48邊形,可以看出48邊形比6邊形更相似於圓,有理由相信,邊數繼續增加後,多邊形會更加近似於圓。

在約公元480年,祖沖之利用割圓術計算24567形的邊長,得到 π ≈ 355113(現在稱其為密率),其數值為3.1415926~3.1415927,小數點後的前七位數都是正確值。直到一千多年後才由15世紀的阿拉伯數學家阿爾·卡西以17位有效數字打破此記錄。為紀念這位偉大的中國古代數學家,有人將 π ≈ 355113 稱作“祖率”。

00 演算法分析

學習了割圓術,我們來思考怎樣將它轉化成程式語言。

首先,我們要動態的畫出一個圓,更準確的說,我們要畫一個圓的內接正多邊形,通過逐步增大多邊形的邊數,觀察多邊形逐漸向圓形靠攏的過程,同時,觀察圓周率逐漸變得精準的過程。這個動畫過程,可能需要用到圓心、半徑、邊數、邊長,具體用到哪些則取決於我們的演算法。

再次提醒:圓周率 = (邊長 × 邊數) ÷ (半徑 × 2)。

圓內接多邊形的邊數可以要求使用者輸入,假設邊數是n。

知道了邊數,就知道了n邊形相鄰兩邊的夾角,等於內切角,即360÷n;也知道了多邊形中單獨一個三角形的內切角,等於360÷n。

據此分析,引出了兩種程式設計演算法:

方法一

從使用者處獲取n,並將圓的半徑設定為固定值R,則,算出 多邊形邊長 = (sin(360÷n÷2))× R × 2,多邊形周長 = 邊長 × n,所以,圓周率 = 周長 ÷ (R × 2)。

這個演算法的優點是:1)直徑是精確值。不足之處是:1)畫多邊形困難 2)正弦函式對一些讀者來說偏難。

方法二

從使用者處獲取n,並將多邊形的邊長設定為固定值L,程式每畫出一條邊後轉360÷n度並繼續畫下一邊,直到繪製完n條邊,則,算出 多邊形周長 = L × n,間接得到直徑(此法無法直接得到直徑,可以通過畫多邊形過程“起點與n÷2處的點之間的長度”算出直徑的約數d),所以,圓周率 = L × n ÷ d。

這個演算法的優點是:1)周長是精確值 2)畫多邊形容易。不足之處是:1)求直徑不直觀。

綜上分析,我們採用第二種方法作為我們本次的演算法。

01 軟體分析

需求說明:

編寫一個計算程式,程式開始時讓使用者輸入圓內接正多邊形的邊數n,從固定起點A開始繪製直線,直線長度為L,然後旋轉360÷n度並繼續畫下一條邊,以此類推,直到繪製完n條邊。另外,在繪製第n÷2邊時,記錄下此時與A的距離,作為直徑d。多邊形繪製完成後,計算圓周率 = L × n ÷ d,在螢幕上顯示結果。

需求分析:

至少需要兩個角色,一個角色詢問邊數,一個角色繪圖;

角色A通過輸入框詢問使用者切割成幾邊形,存入變數n,然後通知角色B可以開始畫圖和計算了;

角色B畫圖:繪圖起點設定在y軸上,暫定座標x=0、y=160。試執行時如發現不妥,可以再調整;

多邊形邊長不能固定,而應該根據n的大小進行調整(請思考原因,此處不講解了),暫定邊長L=1000÷n;

迴圈n÷2次畫多邊形的一半:畫直線L,然後旋轉360÷n度並繼續畫下一邊。迴圈結束時,記錄下與起點的距離,即直徑d;

繼續迴圈n÷2次畫多邊形的另一半;

計算圓周率 = L × n ÷ d,計算結束,結果輸出在螢幕上顯示。

02 新增角色

預設的小貓角色用來詢問使用者,再增加一個角色用來畫圓。

對於第二個角色,我們使用“繪製角色”的方式,其實只要畫個圓點即可。操作步驟是,點選【選擇一個角色】,選擇【繪製】,在造型編輯器中(是Scratch自帶的畫圖軟體),點選【畫筆】,因為我們要在造型的中心畫一個很小的點,所以先放大造型背景圖,在清楚分辨背景圖的中心十字星的時候,將滑鼠移到中心之上,滑鼠左鍵點選繪製一個小點。

03 調整角色的大小和位置

將角色調整到合適的大小,將小貓移到舞臺的一角。

04 更換舞臺背景

按照你自己的喜好,將預設的舞臺背景替換成合適的背景圖。

為了讓大家看清楚程式設計中我們使用的座標,和所繪製圓的精確位置,我使用下面的圖。如果你覺得不美觀,可以在程式除錯成功後,將它替換成其他背景圖。

背景圖的名字是Xy-grid。

05 新增變數

增加4個變數:圓周率、邊數、邊長、直徑。

06 小貓角色編碼

小貓角色的編碼很簡單,詢問多邊形的邊數,將變數值初始化歸零。

07 畫圖角色的編碼

畫圖角色的編碼和需求分析中是一致的,每個積木編碼的含義詳見下圖的圖注。

其中有些需要著重講解:

1、角色的朝向與轉交

角色在多邊形頂點時,角色的朝向與轉角是比較難理解的內容。

請務必先自己思考,有了一定思路後,觀察下圖。

紫色箭頭,表示了角色當前的朝向;

綠色θ角,表示了畫下一條邊之前,角色的旋轉角;

2、“直徑”計算

計算直徑,其實就是計算“座標系中兩點的距離”。

計算兩點距離有現成的方法,如下圖

通過程式碼實現這個公式

使用上面的程式碼,計算結果完全正確。可是,我總覺得有些不完美的地方:1)積木程式碼太長了,看起來麻煩 2)求兩點距離的公式有的讀者還沒學習或者難以理解運用。

針對“直徑”計算,我們可以優化一下程式碼!

08 畫圖角色的編碼(第2版)

一、新增一個新角色【起點】

首先,再增加一個角色【起點】,把它一直固定在繪圖的起點位置,除此之外,不做其他事情。

操作步驟:

1、【可選】給畫圖角色改一個“見名知意”的名字;

2、從畫圖角色複製一個新角色,並改名為“起點”;

3、刪除因複製自帶過來的程式碼;

4、編寫新程式碼

二、修改求直徑的程式碼

然後,修改求直徑的程式碼,只要求解【畫圖】角色與【起點】角色之間的距離即可。

09 完工!執行程式

至此,我們完成了“需求說明”中的全部內容,可以點選舞臺左上角的小旗子執行程式,檢視效果。

解決程式執行慢的問題

但是,當你填寫的邊數特別大時,會發現程式運行了很長時間。如果你只想知道 π 的值而不關心動畫過程,可以【開啟加速模式】,這樣程式就會瞬間執行完畢了。

附加練習

使用者輸入時,如果小於3,不進行計算,直接提醒使用者輸入值不合理(思考為什麼要控制不能小於3)

去掉使用者輸入,將程式改成多邊形的邊數從3開始逐漸增加,觀察各個變數和圓周率的變化

tag:#Scratch程式設計、#少兒程式設計、#兒童程式設計、#趣味程式設計、#青少年程式設計、#軟體程式設計

本文為一點號作者原創,未經授權不得轉載

Reference:科技日報

看更多!請加入我們的粉絲團

轉載請附文章網址

不可錯過的話題