利用Delphi技术直观实现圆周率的精确测算 【论文】_13648
论文:利用Delphi技术直观实现圆周率的精确测算 论文网
本文作者(汪 洋 顾培培),请您在阅读本文时尊重作者版权。
摘 要: 圆周率π是个古老的数据,早在1700多年前祖冲之已将其值精确到小数点
后7位,而如今通过计算机程序已能算到十亿位之多。在课堂及平时工作中,直观、迅速、精确的测算出圆周率,对于课程的学习是非常有价值的。这里使用Delphi模拟一种测算圆周率的方法。
关键词: Delphi技术 模拟 圆周率
1.前言
在日常的教学及相关工作中,我们经常要介绍并使用圆周率,虽有具体的数据及相关的历史计
算事件,但对于学生及普通的人员来说,很难弄懂其的计算原理,印象不深,效果差。本文通过Delphi即Windows平台下的可视化应用程序开发工具,提供一种有效的方法,通过具体的编程技术来高效、直观地完成圆周率的计算。
2.
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
原理
本程序只是一个概率模拟。首先绘制一个边长为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′判断是否为圆内点,根据数学
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
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;