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