Другие языки программирования и технологии

Как двигать изображение по кривой прямой

Пишу на Delphi. Хочу создать простую игру. Мне нужно знать как правильно определить путь к месту нажатия мишкой(координаты нажатия я знаю) Всмысле изображение должно двигаться по кривой в точку нажатия мишки. Если кто знает способ работы LineTo то он мне тоже подойдет. Пробивал работать с векторами но я не могу правильно определить вектор направления.если извесна точка начала и конца...
Ну во-первых: что за «мишка» − косолапый что-ли?
Во-вторых: начальных знаний математики и декартовой системы координат должно быть достаточно:
Пусть требуется нарисовать отрезок от точки A(Xa, Ya) до точки B(Xb, Yb).
Нужно определиться с частными случаями, когда отрезок совпадает с осью X или Y:

if (Xa = Xb) and (Ya = Yb) then { рисовать ничего не нужно! }
else if Xa = Xb then { движемся вдоль оси Y } MoveY(Xa, Ya, Yb)
else if Ya = Yb then { движемся вдоль оси X } MoveX(Xa, Xb, Ya)
else { общий случай - движемся от одной точки к другой } MoveXY(Xa, Ya, Xb, Yb);

С частными случаями должно быть просто:

procedure MoveY(X, Ya, Yb : Integer);
var Y : Integer;
begin
if Yb > Ya then for N := Ya to Yb do { собственно новая точка X,Y движется вниз }
else N := Ya downto Yb do { новая точка X,Y движется вверх }
end;

В случае для MoveX действуем аналогичным способом.

Общий случай разрабатываем по примерно такому алгоритму:
Выясняем по какой оси нужно больше сместиться и какой нужен шаг для смещения по другой оси на единицу шага по основной

dX := Xb - Xa;
dY := Yb - Ya;
if dX > 0 then kX := +1 else kX := -1;
if dY > 0 then kY := +1 else kY := -1;
if Abs(dX) = Abs(dY) then { смещение по оси Х равно смещению по оси Y } Steps := Abs(dX)
else if Abs(dX) > Abs(dY) then { смещение по оси Х больше } begin Steps := Abs(dX); kY := kY / Abs(dX); end
else { смещение по оси Y больше } begin Steps := Abs(dY); kX := kX / Abs(dY); end;

Теперь просто пройдём все точки по линии

for N := 0 to Steps do begin X := Round(Xa + N * kX); Y := Round(Ya + N * kY); { новая точка X,Y получена } end;
КЧ
Константин Чернобаев
85 518
Лучший ответ