中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
如何使用Delphi编写圆周率模拟器?
作者:Sabine  时间:2006-10-05 12:25 出处:ccidnet.com 责编:月夜寒箫
              摘要:如何使用Delphi编写圆周率模拟器?

圆周率π是个古老的东西,早在1700多年前祖冲之已将其值精确到小数点后7位,而如今通过计算机程序已能算到十亿位之多!我是个圆周率爱好者,这个“爱好”至少是出于对这个无理数的热衷,我不但可以背诵到小数点后100位,而且还收藏着从网上找到几个计算π的程序,你有兴趣可以到我的小站nihg.yeah.net找一下。

一、模拟器原理

本程序并使用计算π值的算法,她只是一个概率模拟,即在边长为200的正方形内随机产生多个点,将点以圆弧为界分开统计,由于点的个数很多,直至几乎布满整个区域。此时,点的个数就可以看作就是它所在区域的面积。可以得到如下推导:

蓝色区内点个数:总个数≈蓝色面积:总面积

蓝色区内点个数:总个数≈圆面积/4:总面积

蓝色区内点个数:总个数≈π×200×200/4:200×200

π≈ 4×蓝色区内点个数/总个数

当然,点的位置会重复,所以结果与π值是有差别的,不过,当点足够多时,可以看到一个非常接近的结果。

二、程序设计

程序首先在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亲自模拟一下π的计算吧!

三、小结

虽然程序并没有采用圆周率的算法,但能通过随机数对π进行逼近,而由无数点描成的美妙圆弧让我们叹为观止。其实,这样的思想可以用于许多场合,比如对某个数学定理或者自然规律(彩票?)进行模拟,希望这样的思路对您有所启发。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有