Конференция "Игры" » Точка пролетает мимо цель-точки.
 
  • Y- (09.04.13 17:48) [0]
    Имеется точка. (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))); // Получаем угол в радианах до цели и расcчитываем векторную скорость.
    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;


  • Y- (09.04.13 17:49) [1]

    * FIsMove = IsMove;

  • Rouse_ © (09.04.13 20:14) [2]

    > точка пролетает цель-точку

    Ну так ты проверяй пред подвижкой расстояние до цели.
    На пальцах, расстояние = 5, скорость = 10, на следующей итерации расстояние будет минус пять.
  • Y- (10.04.13 21:30) [3]
    А я вообще правильно проверяю момент прибытия?
  • stainless © (11.04.13 03:42) [4]
    есть способ проверять принадлежность цели прямоугольнику...
    xx,yy: integer;

    xx:= (Pos.X + Velocity.X); // Считаем новые координаты
    yy:= (Pos.Y + Velocity.Y);

    IsMove:= PtInRect(Rect(min(xx,Pos.x), min(yy,Pos.y), max(xx,Pos.x),    max(yy,Pos.y), Point(Target.X, Target.Y));

    if IsMove then begin// Двигаемся.
     Pos.X:=xx;
     Pos.Y:=yy;
    end;
  • Y- (11.04.13 17:25) [5]

    > stainless ©   (11.04.13 03:42) [4]


    В моём случае круг - делает точки равноудалёнными.
 
Конференция "Игры" » Точка пролетает мимо цель-точки.
Есть новые Нет новых   [134427   +38][b:0][p:0.001]