已知屏幕AB两点和两点建画线所用时间,如何动态画AB间连线?(50分)

  • 主题发起人 主题发起人 XGTL
  • 开始时间 开始时间
X

XGTL

Unregistered / Unconfirmed
GUEST, unregistred user!
我是指从A点到B点的线是动态从A点射向B点。
 
var a1,b1:integer;//定义为全局变量
timer事件中;这些或许对你有用
a1:=a1+10;
b1:=b1+10;
form1.Canvas.LineTo(a1,b1);
 
在窗口上放一个TIMER控件,把该控件的interval属性设置为画线的时间间隔。在它的ontimer
事件中,加入以下代码。
begin
with form1.cancas do
begin
brush.style:=bssolid;
brush.color:=white;
fillrect(clientrect);//以上三句是每次重画线前,把屏幕先清除,如不需要可去掉。
 moveto(x1,y1);//是A点的坐标;
lineto(x2,y2);//是B点的坐标
end;
end;
 
to:seeyouknowme
看不懂。为什么用10?从哪里画到哪里?

to:jxguang
你的画线是一次性的A点到B点,不会产生动态效果。
而且清洗屏幕会影响其它线图。
 
看不懂。为什么用10?从哪里画到哪里?
10是画线的速度,你可以调整.
忠告:你还是多看点书吧《Delphi5开发人员指南》.....。
 
解决方法:
利用计算机画直线的方法(直线差补法):
以终点(xe,ye)位于起点为原点的坐标系的第一象限为例:判断函数f=y*xe-x*ye的大小,f>=0,向+x方向增加1画点,f<0,向+y方向增加1画点。
执行到x=xe,y=ye为止,下面是示例程序(其他象限你自己推吧):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,StdCtrls, Buttons;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a1,b1,a2,b2,x,y,f:integer; //起点(a1,b1),终点(a2,b2)

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
a1:=20;
b1:=13;
a2:=160;
b2:=260;
x:=0;
y:=0;
Timer1.Enabled:=true ;
form1.Canvas.MoveTo(a1,a2);

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
f:=(b2-b1)*x-(a2-a1)*y;
if (a1+x<>a2) or (b1+y<>b2) then
begin
if f>=0 then
begin
y:=y+1;
form1.Canvas.Pixels[a1+x,b1+y]:=clBlack
end
else
begin
x:=x+1;
form1.Canvas.Pixels[a1+x,b1+y]:=clBlack;
end
end
end;

end.
 
谢谢指教
 
用LineDDA函数算出所有在线上的点!
 
怎么结贴给分,我输入分数后怎么没有反映?
 
后退
顶部