圆周率π是个古老的东西
早在
多年前祖沖之已将其值精确到小数点后
位
而如今通过计算机程序已能算到十亿位之多!我是个圆周率爱好者
这个
爱好
至少是出于对这个无理数的热衷
我不但可以背诵到小数点后
位
而且还收藏着从网上找到几个计算π的程序
你有兴趣可以到我的小站找一下
一模拟器原理
本程序并使用计算π值的算法她只是一个概率模拟即在边长为的正方形内随机产生多个点将点以圆弧为界分开统计由于点的个数很多直至几乎布满整个区域此时点的个数就可以看作就是它所在区域的面积可以得到如下推导
蓝色区内点个数总个数≈蓝色面积总面积
蓝色区内点个数总个数≈圆面积/总面积
蓝色区内点个数总个数≈π××/×
π≈ ×蓝色区内点个数/总个数
当然点的位置会重复所以结果与π值是有差别的不过当点足够多时可以看到一个非常接近的结果
二程序设计
打开Delphi 首先按照图设计窗体
程序首先在Image控件区域内画一个边长为的正方形作为程序的演示窗口故FormCreate事件如下
procedure TFormFormCreate(Sender: TObject);
begin
// 画亮绿色的正方形演示框
ImageCanvasBrushColor:=clBlack;
ImageCanvasFillRect(Rect());
ImageCanvasPenColor:=cllime;
ImageCanvasRectangle();
DoubleBuffered := True;
end;
接着放入一个Timer实现点的绘制以及π的计算
procedure TFormTimerTimer(Sender: TObject);
var
abiii:longint;
pipiok:single;
begin
// 随机产生坐标点
i:=random();
ii:=random();
if (i*i+ii*ii<) then
begin
// 以为半径的圆内的点设为蓝色
ImagecanvasPenColor:=claqua;
a:=StrToInt(LabelCaption);
LabelCaption:=IntToStr(a+);
//显示当前点的坐标
LabelCaption:=IntToStr(ImageCanvasPenPosX);
LabelCaption:=IntToStr(ImageCanvasPenPosY);
end
else
begin
// 超出这个区域的点都在圆外设为黄色
ImageCanvasPenColor:=clyellow;
b:=StrToInt(LabelCaption);
LabelCaption:=IntToStr(b+);
end;
// 画点(长为像素的直线)
ImageCanvasMoveTo(iii);
ImageCanvasLineTo(iii+);
// 计算pi的值
pi:=(*(StrToInt(LabelCaption))/(StrToInt(LabelCaption)+StrToInt(LabelCaption)));
LabelCaption:=FloatToStr(pi);
// Label显示的是最接近真实pi的值
piok:=StrToFloat(LabelCaption);
//得出最接近的圆周率值 piok
if (abs(pi))<(abs(piok)) then
LabelCaption:=FloatToStr(pi);
end;
最后加入两个SpeedButton作为开始和暂停按钮代码分别是TimerEnabled:=true;和TimerEnabled:=false;好了程序这样就完成了赶快按下F亲自模拟一下π的计算吧!
三小结
虽然程序并没有采用圆周率的算法但能通过随机数对π进行逼近而由无数点描成的美妙圆弧让我们歎为观止