Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как пройти из точки A(x1;y1) в точку B(x2;y2)...


Автор: Woody Wood 10.12.2004, 22:49
У меня такая проблема.

Есть точка A с координатами x1 y1 мне необоходимо переместить объект (допустим шарик) в точку B с координатами x2 y2 с определенной скоростью (допустим 5 пикселей/сек). Надо найти приращение к координатам (допустим каждую секунду). Неплохо было бы код =).

Заранее спасибо.

Автор: S.A.P. 10.12.2004, 23:12
Для этого можно составить уравнение прямой, проходящей через 2 координаты:
(y-y1)/(y2-y1)=(x-x1)/(x2-x1)

Допустим у тебя 2 точки: A(5;3) и B(8;6); , а текущая x координата 4
(y-3)/(6-3)=(4-5)/(8-5)

надеюсь, что Y за знак равенства вывести сможеш smile

Автор: Woody Wood 10.12.2004, 23:24
Не, не смогу smile Для моих маленьких 14-летних мозгов это слишком сложно smile Поможешь?
Заранее благодарю.

Автор: S.A.P. 10.12.2004, 23:34
Код привести не могу, не помню я эту Дельфу, хоть убей smile . Сейчас Дельфисты придут, объяснят как круги рисовать. smile

Автор: Woody Wood 10.12.2004, 23:50
Мм, я сейчас попробовал так как ты предложил, но ничего не получилось - стало еще глючнее чем когда я делал по своему методу smile А мой метод был что типа такого:

stepy:=speed;
stepx:=(x1-x2)/(y1-y2);
x1:=x1+stepx;
y1:=y1+stepy;

Вроде так. Работало, но глючило. Дело в том, что у меня координаты точки А постоянно меняются мне надо сделать с учетом этого. smile

Автор: dm9 10.12.2004, 23:50
Код
const
  Пикселей_за_шаг = 5;

var
  x1, y1, x2, y2 : Integer;
  Текущая_координата_X, Текущая_координата_Y : Integer;
  Номер_шага : Integer;
  Длина : Real;

Длина := Sqrt (Sqr (y2-y1) + Sqr (x2-x1)); //Рассчитывается один раз после задания координат x1, y1, x2, y2

function Рассчитать_новые_координаты (var НовыйX, НовыйY : Integer; Номер_шага : Integer) : Boolean;
begin
  Result := Номер_шага * Пикселей_за_шаг < Длина;
  if not Result
  then Exit;
  НовыйX := x1 + Round (Номер_шага * Пикселей_за_шаг * (x2-x1) / Длина);
  НовыйY := y1 + Round (Номер_шага * Пикселей_за_шаг * (y2-y1) / Длина);
end;

Применять:

var B : Boolean;
B := Рассчитать_новые_координаты (Текущая_координата_X, Текущая_координата_Y, Номер_шага);
if not B
then ShowMessage ('Дальше идти некуда...');


smile
Добавлено @ 23:51
Цитата(Woody @ 10.12.2004, 23:50)
Дело в том, что у меня координаты точки А постоянно меняются


О таких вещах надо говорить сразу smile
Добавлено @ 23:53
Тогда так:

Код
const
  Пикселей_за_шаг = 5;

var
  x1, y1, x2, y2 : Integer;
  Текущая_координата_X, Текущая_координата_Y : Integer;
  Номер_шага : Integer;

function Рассчитать_новые_координаты (var НовыйX, НовыйY : Integer; Номер_шага : Integer) : Boolean;
var Длина : Real;
begin
  Длина := Sqrt (Sqr (y2-y1) + Sqr (x2-x1));
  Result := Номер_шага * Пикселей_за_шаг < Длина;
  if not Result
  then Exit;
  НовыйX := x1 + Round (Номер_шага * Пикселей_за_шаг * (x2-x1) / Длина);
  НовыйY := y1 + Round (Номер_шага * Пикселей_за_шаг * (y2-y1) / Длина);
end;

Применять:

var B : Boolean;
B := Рассчитать_новые_координаты (Текущая_координата_X, Текущая_координата_Y, Номер_шага);
if not B
then ShowMessage ('Дальше идти некуда...');

Добавлено @ 23:59
Сорри, я там ошибся выше, сейчас исправил. Забыл прибавить x1 и y1 к новым координатам.

Автор: Woody Wood 11.12.2004, 00:00
Я что-то не очень понял, а откуда взять Номер_шага?

Автор: dm9 11.12.2004, 00:01
Сначала он ноль, потом каждый интервал времени (1 секунда, например) прибавляешь по единичке smile

Автор: Woody Wood 11.12.2004, 00:05
Мм, походу меня снова не поняли. У меня есть шарик, который должен двигаться со скоростью 5 пикселей в секунду (или кадр например). Он должен двигаться в точку в которой зажата кнопка мыши, причем постоянно. Если вдруг кнопку мыши отпустят, то он должен дойти до точки где она была зажата и остановиться. Если кнопку снова зажмут, то все повторяется. Ясно? smile Должно получиться что-то а-ля Диабло.

Автор: dm9 11.12.2004, 00:12
Надо яснее выражать свои мысли smile

Автор: S.A.P. 11.12.2004, 00:14
Woody Wood короче, я так понял, что тебе надо, чтобы шарик всегода двигался в направлении одной точки с постоянной скоростью? Я тебе завтра код напишу, если подождешь smile

Автор: dm9 11.12.2004, 00:15
Нафиг завтра, сейчас будет smile
Добавлено @ 00:23
Код
const
  Пикселей_за_шаг = 5;

var
  Куда_идём_X, Куда_идём_Y : Integer;
  Текущая_координата_X, Текущая_координата_Y : Integer;

procedure Отрисовать_шарик;
begin
  //Рисуем шарик в координатах (Текущая_координата_X, Текущая_координата_Y)
end;

procedure Рассчитать_новые_координаты;
var Длина : Real;
begin
  Длина := Sqrt (Sqr (Куда_идём_X - Текущая_координата_X) + Sqr (Куда_идём_Y - Текущая_координата_Y));
  if Пикселей_за_шаг < Длина;
  then
  begin
     Текущая_координата_X := Куда_идём_X;
     Текущая_координата_Y := Куда_идём_Y;
     Exit;
  end;
  Текущая_координата_X := Текущая_координата_X + Round (Пикселей_за_шаг * (Куда_идём_X - Текущая_координата_X) / Длина);
  Текущая_координата_Y := Текущая_координата_Y + Round (Пикселей_за_шаг * (Куда_идём_Y - Текущая_координата_Y) / Длина);
end;

Событие onMouseMove:
if Мышь_нажата
then
begin
  Куда_идём_X := X;
  Куда_идём_Y := Y;
end;

Событие onPaint:
Отрисовать_шарик;

Событие onTimer (надо кинуть на форму TTimer):
if (Куда_идём_X <> Текущая_координата_X) or (Куда_идём_Y <> Текущая_координата_Y)
then Рассчитать_новые_координаты;

Событие onMouseDown:
Мышь_нажата := true;

Событие onMouseUp:
Мышь_нажата := false;

Автор: dm9 11.12.2004, 00:26
Исправил немного...
Добавлено @ 00:27
В смысле, код выше подправил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)