Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как пройти из точки A(x1;y1) в точку B(x2;y2)... ...по прямой линии 
:(
    Опции темы
Woody Wood
Дата 10.12.2004, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2004

Репутация: нет
Всего: нет



У меня такая проблема.

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

Заранее спасибо.
PM MAIL   Вверх
S.A.P.
Дата 10.12.2004, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Для этого можно составить уравнение прямой, проходящей через 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
PM MAIL   Вверх
Woody Wood
Дата 10.12.2004, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2004

Репутация: нет
Всего: нет



Не, не смогу smile Для моих маленьких 14-летних мозгов это слишком сложно smile Поможешь?
Заранее благодарю.
PM MAIL   Вверх
S.A.P.
Дата 10.12.2004, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



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

Это сообщение отредактировал(а) Perchilla - 10.12.2004, 23:34
PM MAIL   Вверх
Woody Wood
Дата 10.12.2004, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2004

Репутация: нет
Всего: нет



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

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

Вроде так. Работало, но глючило. Дело в том, что у меня координаты точки А постоянно меняются мне надо сделать с учетом этого. smile
PM MAIL   Вверх
dm9
Дата 10.12.2004, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Код
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 к новым координатам.

Это сообщение отредактировал(а) dm9 - 10.12.2004, 23:58
PM MAIL ICQ   Вверх
Woody Wood
Дата 11.12.2004, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2004

Репутация: нет
Всего: нет



Я что-то не очень понял, а откуда взять Номер_шага?
PM MAIL   Вверх
dm9
Дата 11.12.2004, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



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

Это сообщение отредактировал(а) dm9 - 11.12.2004, 00:02
PM MAIL ICQ   Вверх
Woody Wood
Дата 11.12.2004, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 10.12.2004

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Woody Wood - 11.12.2004, 00:07
PM MAIL   Вверх
dm9
Дата 11.12.2004, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Надо яснее выражать свои мысли smile
PM MAIL ICQ   Вверх
S.A.P.
Дата 11.12.2004, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Woody Wood короче, я так понял, что тебе надо, чтобы шарик всегода двигался в направлении одной точки с постоянной скоростью? Я тебе завтра код напишу, если подождешь smile
PM MAIL   Вверх
dm9
Дата 11.12.2004, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Нафиг завтра, сейчас будет 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:27
PM MAIL ICQ   Вверх
dm9
Дата 11.12.2004, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Исправил немного...
Добавлено @ 00:27
В смысле, код выше подправил
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.