程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi編寫圓周率模擬器

用Delphi編寫圓周率模擬器

編輯:Delphi

1.模擬器原理
本程序並不使用計算π值的算法,它只是一個概率模擬,即在邊長為200的正方形內隨機產生多個點,將點以圓弧為界分開統計,由於點的個數很多,直至幾乎布滿整個區域。此時,點的個數就可以看作就是它所在區域的面積。可以得到如下推導:
(1)藍色區內點個數:總個數≈藍色面積:總面積
(2)藍色區內點個數:總個數≈圓面積/4:總面積
(3)藍色區內點個數:總個數≈π×200×200/4:200×200
(4)π≈ 4×藍色區內點個數/總個數
當然,點的位置會重復,所以結果與π值是有差別的,不過,當點足夠多時,可以看到一個非常接近的結果。
2.程序設計
打開Delphi 7,首先按照圖1設計窗體(見圖)。


程序首先在Image1控件區域內畫一個邊長為200的正方形作為程序的演示窗口,故FormCreate事件如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // 畫亮綠色的正方形演示框
Image1.Canvas.Brush.Color:=clBlack;
Image1.Canvas.FillRect(Rect(0,0,199,199));
Image1.Canvas.Pen.Color:=cllime;
Image1.Canvas.Rectangle(0,0,199,199);

DoubleBuffered := True;
end;

接著放入一個Timer實現點的繪制以及π的計算:
procedure TForm1.Timer1Timer(Sender: TObject);
var
a,b,i,ii:longint;
pi,piok:single;
begin
// 隨機產生坐標點
i:=random(200);
ii:=random(200);

if (i*i+ii*ii<40000) then
begin
// 以200為半徑的圓內的點設為藍色
Image1.canvas.Pen.Color:=claqua;
a:=StrToInt(Label1.Caption);
Label1.Caption:=IntToStr(a+1);
//顯示當前點的坐標
Label6.Caption:=IntToStr(Image1.Canvas.PenPos.X);
Label7.Caption:=IntToStr(Image1.Canvas.PenPos.Y);
end
else
begin
// 超出這個區域的點都在圓外設為黃色
Image1.Canvas.Pen.Color:=clyellow;
b:=StrToInt(Label2.Caption);
Label2.Caption:=IntToStr(b+1);
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)));
Label3.Caption:=FloatToStr(pi);
// Label4顯示的是最接近真實pi的值。
piok:=StrToFloat(Label4.Caption);
//得出最接近的圓周率值 piok
if (abs(pi-3.141592653589))<(abs(piok-3.141592653589)) then
Label4.Caption:=FloatToStr(pi);
end;

最後加入兩個SpeedButton作為開始和暫停按鈕,代碼分別是Timer1.EnableD:=true;和Timer1.EnableD:=false;。好了,程序這樣就完成了,趕快按下F9親自模擬一下π的計算吧!
3.小結
雖然程序並沒有采用圓周率的算法,但能通過隨機數對π進行逼近,而由無數點描成的美妙圓弧讓我們歎為觀止。其實,這樣的思想可以用於許多場合,比如對某個數學定理或者自然規律進行模擬,希望這樣的思路對您有所啟發。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved