unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
sx,sy,tx,ty,
fireX,fireY,
targetX,targetY,
tax,tay,
firedisX,firedisY:Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
sx := StrToIntDef(Edit1.Text,400);
sy := StrToIntDef(Edit2.Text,300);
tx := StrToIntDef(Edit3.Text,0);
ty := StrToIntDef(Edit4.Text,0);
fireX := sx;
fireY := sy;
targetX := tx;
targetY := ty;
//对这段代码不明白,大概的理解是根据起始坐标和目的坐标计算火球消失的的目标 最大是500,
//但是这个算法很奇怪,如果水平或者垂线就会 坐标为0 ,
//于是挖出来做了个程序,看明白了,就是想实现射线的延长功能,但又不想用算力进行科学计算,于是简化了下,
if fireX <> targetX then
tax := Abs(targetX - fireX)
else
tax := 1;
if fireY <> targetY then
tay := Abs(targetY - fireY)
else
tay := 1;
if abs(fireX - TargetX) > abs(fireY - TargetY) then
begin
firedisX := Round((TargetX - fireX) * (500 / tax));
firedisY := Round((TargetY - fireY) * (500 / tax));
end
else
begin
firedisX := Round((TargetX - fireX) * (500 / tay));
firedisY := Round((TargetY - fireY) * (500 / tay));
end;
Canvas.Brush.Color := clWindow;
Canvas.FillRect(ClientRect);
Label5.Caption :='firedisX,Y: ' + IntToStr(firedisX) + ',' + IntToStr(firedisY);
Label1.Repaint;
Label2.Repaint;
Label3.Repaint;
Label4.Repaint;
Label5.Repaint;
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 1;
Canvas.MoveTo(sx,sy);
Canvas.LineTo(tx,ty);
Canvas.Pen.Color := clGreen;
Canvas.Pen.Width := 1;
Canvas.MoveTo(fireX,fireY);
Canvas.LineTo(firedisX,firedisY);
end;
end.