摘 要: 圓周率π是個古老的數據,早在1700多年前祖沖之已將其值精確到小數點后7位,而如今通過計算機程序已能算到十億位之多。在課堂及平時工作中,直觀、迅速、精確的測算出圓周率,對于課程的學習是非常有價值的。這里使用Delphi模擬一種測算圓周率的方法。
關鍵詞: Delphi技術 模擬 圓周率
1.前言
在日常的教學及相關工作中,我們經常要介紹并使用圓周率,雖有具體的數據及相關的歷史計算事件,但對于學生及普通的人員來說,很難弄懂其的計算原理,印象不深,效果差。本文通過Delphi即Windows平臺下的可視化應用程序開發工具,提供一種有效的方法,通過具體的編程技術來高效、直觀地完成圓周率的計算。
2.設計原理
本程序只是一個概率模擬。首先繪制一個邊長為200的正方形,在其中隨機生產多個點,該正方形中可以容下一個大圓的四分之一圓。以圓弧為界,在圓弧內的即為圓內點,之外的即為圓外點。由于點數非常之多,幾乎布滿整個正方形,因此點數就可以看成是其所在區域的面積。則作如下推導:如圖1所示,紅色區域表示1/4圓內;黃色區域表示圓外。
紅色區域面積∶正方形面積≈紅色區域點數∶總點數
紅色區域面積∶正方形面積=1/4圓面積∶正方形面積
1/4圓面積∶正方形面積≈紅色區域點數∶總點數
π×200×200/4∶200×200≈紅色區域點數∶總點數
π≈4×紅色區域點數/總點數
在區域的點數會出現重復,所以計算機的最終結果與實際π值會有差別,但是當點數足夠多時,則可以看成一個非常近似的結果。
3.功能實現
3.1控件說明
本程序有圖有數據,因此首先在窗體上設置一Image控件,其主要用于顯示圖像。在整個窗體生成時則加載,該控件的繪圖代碼繪制一個外邊框為黃色,內部為黑色邊長為200的正方形。在顯示數據方面,這里采用Label標簽控件,使用它的Caption屬性用于實時顯示圓內點數、圓外點數、當前計算的π值、當前X軸、Y軸的坐標。為了控制方便程序設置了兩個按鈕用于開始和暫停模擬。窗體最下方設置一個顯示當前系統時間的Text文本控件,方便用戶進行比對。為了自動快速的進行模擬。程序設置了一個主要控件Timer定時器。其是一個非可視化組件。利用其可以實現自動打點。它的Interval屬性在這里十分重要,用于控制Timer觸發事件(打點)的時間間隔。單位是ms,默認值1000即1s,這里為了模擬的速度,設置為1,即0.001s。
程序各控件布局如圖2。
3.2代碼實現
整個窗體在創建時的代碼:
procedure TForm1.FormCreate(Sender: TObject);
begin
′在Image1控件區域內畫一個邊長為200的正方形作為程序的演示窗口,畫亮綠色的正方形演示框
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.FillRect(Rect(0,0,199,199));
Image1.Canvas.Pen.Color:=clyellow;
Image1.Canvas.Rectangle(0,0,199,199);
DoubleBuffered:= True;
end;
添加Timer控件實現點的繪制和π的計算:
var
a,b,i,ii:longint;
pi:single;
begin
′隨機產生坐標點
i:=random(200);/隨機獲取0-200以內的整數
ii:=random(200);
if (i*i+ii*ii<40000) then′判斷是否為圓內點,根據數學公式X2+Y2<=r2
begin
′以200為半徑的圓內的點設為紅色
Image1.canvas.Pen.Color:=clred;
a:=StrToInt(Label1.Caption);′label.Caption初始值為0
Label1.Caption:=IntToStr(a+1);′a為圓內點數,加1后傳送給label控件
′顯示當前點的坐標
Label4.Caption:=IntToStr(Image1.Canvas.PenPos.X);
Label5.Caption:=IntToStr(Image1.Canvas.PenPos.Y);
end
else
begin
′超出這個區域的點都在圓外設為黃色
Image1.Canvas.Pen.Color:=clyellow;
b:=StrToInt(Label2.Caption);
Label2.Caption:=IntToStr(b+1);′b為圓外點數,加1后傳送給label控件
′顯示當前點的坐標
Label4.Caption:=IntToStr(Image1.Canvas.PenPos.X);
Label5.Caption:=IntToStr(Image1.Canvas.PenPos.Y);
end;
′畫點(長為1像素的直線)
Image1.Canvas.MoveTo(i,ii);
Image1.Canvas.LineTo(i,ii+1);
′計算pi的值
pi:=(4*(StrToInt(Label1.Caption))/(StrToInt(Label1.Caption)+StrToInt(Label2.Caption)));
′得出最接近的圓周率值 Pi值
if (abs(pi-3.141592653589))<(abs(StrtoFloat(label3.Caption)-3.141592653589)) then
Label3.Caption:=FloatToStr(pi);′若新的pi值更加精確,則更新顯示π值的label3
edit1.Text:=timetostr(now);′顯示當前系統經過的時間
end;
添加兩個按鈕控件以方便的控制程序的暫停和繼續:
procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;′使得timer控件工作
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
timer1.Enabled:=1;′使得timer控件停止作用
end;
3.3實際運行
運行模擬器,點擊開始模擬按鈕則開始進行圓周率的模擬計算如圖4-1、4-2。
當點的數量越來越大時,計算出的圓周率會越來越接近真實值。
4.結語
本程序沒有采用圓周率的算法,而是通過使用隨機數模擬計算pi值,對π進行逼近。巧妙使用Delphi的一些控件,我們能解決許多實際問題。
參考文獻:
[1]John Ayres.Delphi DirectX圖形與游戲程序設計[M].電子科技大學出版社,2006,7.
[2]李大潛.圓周率π漫話[M].高等教育出版社,2007,12.
[3]周愛名.Delphi源代碼分析[M].電子工業出版社,2004,9.
[4]梁冰.Delphi技術方案寶典[M].人民郵電出版社,2008,2.