微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题用Delphi制作美丽的万花规
栏目软件世界
作者徐磊
发布2001年35期
  我们在市面上常看到一种叫万花规的小玩具,它有一个大的内圆塑料板和一个小的圆塑料板,小的圆塑料板上有一个小孔,把圆珠笔尖插入小的圆塑料板上的小孔内,顺时针(或逆时针)在大圆形板的边缘转动,下面的纸上会画出一种美丽的图案。但是,这些美丽的图案是有限的,下面我们就尝试用Delphi在计算机上模拟这种过程,生成的图案会更多更美丽。原理如下:
  O1是大圆圆心,O2是小圆圆心,T是小圆上的一点,S是T到O2的长度,R1是大圆的半径,R2是小圆的半径,由图(

)开始,小圆逆时针自转到图(

)位置时两圆心连线与水平线相比已转过了a1角度,小圆的新切点与圆心和T点已转过了a2角度,因此:
  a1*R1=a2*R2
  a2=(R1/R2)*a1
  T点的新座标为:
  Xb:=-(R1-R2)*cos(a1)-s*cos(a2-a1);
  Yb:=(R1-R2)*sin(a1)-s*sin(a2-a1);
  好了,原理知道了,我们就来实际操作。启动Delphi 5.0,新建一个窗体,加入一个定时器,写入如下代码:
  unit Unit1:
  interface
  uses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  StdCtrls,ExtCtrls;
  type
  TForm1 = class(TForm)
  Button1:TButton
  Timer1:TTimer;
  procedure FormPaint(Sender: TObject);
  procedure Timer1Timer(Sender: TObject):
  private
  { Private declarations}
  public
  { Public declarations}
  end;
  var
  Form1: TForm1;
  R1,R2,S:integer; //R1大圆半径,R2小圆半径;S为小圆上的任意一点到圆心距离
  Xb:array[1..1000] of integer;
  Yb:array[1..1000] of integer;
  Xt,Yt,W,H,i:integer;
  //Xb,Yb定义为小圆上一点座标,W,H大圆圆心座标
  a1,a2:Real;//a1定义为大圆角度,a2定义为小圆角度
  implementation
  type TCube = array[0..1000] of Integer;
  {$R *.DFM}
  procedure TForm1.FormPaint(Sender:TObject);
  begin
  form1.Refresh; //清空
  R1:=240;
  R2:=72;
  S:=34;
  w:=form1.Width div 2;
  h:=form1.Height div 2;
  Randomize;
  form1.Canvas.Pen.Color=Random(65535)
  Canvas.LineTo((w-R1*2) div 2,h div 2);
  n:=0;
  end;
  procedure TForm1.Timer1Timer(Sender:TObject);
  begin
  form1.Refresh(); //清空
  Randomize;
  form1.Canvas.Pen.Color:=Random(65535);
  //定义随机色
  R2:=Random(R1-10); //循环增量
  S:=Random(R2-2);
  Canvas.MoveTo(w-(R1-R2+S),h); //初始变量
  for i:=1 to 20000 do
  begin
  a1:=(pi/360)*i;
  a2:=(R1/R2)*a1;
  Xt:=Trunc(-(R1-R2)*cos(a1)-s*cos(a2-a1)+w);
  Yt:=Trunc((R1-R2)*sin(a1)-s*sin(a2-a1)+h;
  Canvas.LineTo(Xt,Yt);
  end;
  if R2+10>R1 then form1.Refresh(); //清空
  end;
  end.
  好了,按F9,运行程序后的效果图如(

),相信你还能做出更加美妙的图案来。以上程序在Windows98和Delphi 5.0下调试通过。