Имеется точка. (Pos)
По щелчку на форме точка получает цель-точку (Target), к которой ей нужно двигаться с опр. скоростью. (Speed)
В месте, помещенным стрелочкой проверяется, достигли ли мы заданной точки.
Проверяется через расчёт расстояния до цели.
Вопрос в том, что иногда, при остром угле или при быстрой скорости, точка пролетает цель-точку, т.е. наша проверка не срабатывает.
Как сделать "железное" условие, проверяющее достигли ли мы заданной точки?
type
TVec2 = packed record
X, Y: Single;
end;
var
Pos: TVec2;
Velocity: TVec2;
Target: TVec2;
Speed: Single;
IsMove: boolean;
procedure StartMove(Angle: LongInt);
begin
Velocity.X:= (Speed * Cos(Angle));
Velocity.Y:= (Speed * Sin(Angle));
end;
procedure SetTarget(PX, PY: LongInt);
begin
IsMove:= True;
Target.X:= PX;
Target.Y:= PY;
StartMove(GetAngleTo(Trunc(Target.X), Trunc(Target.Y)));
end;
procedure Update;
function GetDistanceFloat(const X1, Y1, X2, Y2: Single): Single;
begin
Result:= Hypoten(X2 - X1, Y2 - Y1);
end;
begin
If IsMove then
begin
Pos.X:= (Pos.X + Velocity.X);
Pos.Y:= (Pos.Y + Velocity.Y);
If (GetDistanceFloat(Pos.X, Pos.Y, Target.X, Target.Y) <= Speed) then
begin
FIsMove:= False;
end;
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Speed:= 5.0;
SetTarget(X, Y);
end;