圓周率π是個古老的東西
早在
多年前祖沖之已將其值精確到小數點後
位
而如今通過計算機程序已能算到十億位之多!我是個圓周率愛好者
這個
愛好
至少是出於對這個無理數的熱衷
我不但可以背誦到小數點後
位
而且還收藏著從網上找到幾個計算π的程序
你有興趣可以到我的小站找一下
一
模擬器原理
本程序並使用計算π值的算法
她只是一個概率模擬
即在邊長為
的正方形內隨機產生多個點
將點以圓弧為界分開統計
由於點的個數很多
直至幾乎布滿整個區域
此時
點的個數就可以看作就是它所在區域的面積
可以得到如下推導
藍色區內點個數
總個數≈藍色面積
總面積
藍色區內點個數
總個數≈圓面積/
總面積
藍色區內點個數
總個數≈π×
×
/
×
π≈
×藍色區內點個數/總個數
當然
點的位置會重復
所以結果與π值是有差別的
不過
當點足夠多時
可以看到一個非常接近的結果
二
程序設計
打開Delphi
首先按照圖
設計窗體
程序首先在Image
控件區域內畫一個邊長為
的正方形作為程序的演示窗口
故FormCreate事件如下
procedure TForm
FormCreate(Sender: TObject);
begin
// 畫亮綠色的正方形演示框
Image
Canvas
Brush
Color:=clBlack;
Image
Canvas
FillRect(Rect(
));
Image
Canvas
Pen
Color:=cllime;
Image
Canvas
Rectangle(
);
DoubleBuffered := True;
end;
接著放入一個Timer實現點的繪制以及π的計算
procedure TForm
Timer
Timer(Sender: TObject);
var
a
b
i
ii:longint;
pi
piok:single;
begin
// 隨機產生坐標點
i:=random(
);
ii:=random(
);
if (i*i+ii*ii<
) then
begin
// 以
為半徑的圓內的點設為藍色
Image
canvas
Pen
Color:=claqua;
a:=StrToInt(Label
Caption);
Label
Caption:=IntToStr(a+
);
//顯示當前點的坐標
Label
Caption:=IntToStr(Image
Canvas
PenPos
X);
Label
Caption:=IntToStr(Image
Canvas
PenPos
Y);
end
else
begin
// 超出這個區域的點都在圓外設為黃色
Image
Canvas
Pen
Color:=clyellow;
b:=StrToInt(Label
Caption);
Label
Caption:=IntToStr(b+
);
end;
// 畫點(長為
像素的直線)
Image
Canvas
MoveTo(i
ii);
Image
Canvas
LineTo(i
ii+
);
// 計算pi的值
pi:=(
*(StrToInt(Label
Caption))/(StrToInt(Label
Caption)+StrToInt(Label
Caption)));
Label
Caption:=FloatToStr(pi);
// Label
顯示的是最接近真實pi的值
piok:=StrToFloat(Label
Caption);
//得出最接近的圓周率值 piok
if (abs(pi
))<(abs(piok
)) then
Label
Caption:=FloatToStr(pi);
end;
最後加入兩個SpeedButton作為開始和暫停按鈕
代碼分別是Timer
Enabled:=true;和Timer
Enabled:=false;
好了
程序這樣就完成了
趕快按下F
親自模擬一下π的計算吧!
三
小結
雖然程序並沒有采用圓周率的算法
但能通過隨機數對π進行逼近
而由無數點描成的美妙圓弧讓我們歎為觀止
From:http://tw.wingwit.com/Article/program/Delphi/201311/24655.html