Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Перемещение объекта из точки А в точку Б


Автор: compplace 17.6.2012, 17:57
Доброго времени суток.
Есть точка А (x, y) и есть точка Б(x, y).
Как переместить объект из точки А в точку Б?
Для этого вроде как используются формулы с косинусами?

Автор: nworm 17.6.2012, 19:20
Пример ответа.
Возьмём объект в руки в точке A и перетащим в точку Б.

То есть Вы условия задачи не до конца сформулировали.
Напишите подлиннее.

Автор: compplace 17.6.2012, 19:34
Цитата(nworm @ 17.6.2012,  19:20)
Пример ответа.
Возьмём объект в руки в точке A и перетащим в точку Б.

То есть Вы условия задачи не до конца сформулировали.
Напишите подлиннее.

Ну например есть цикл, который должен переместить объект в заданную точку или нарисовать линию.
Ну или как в игре Арканоид шарик запускают и он движется по заданной траектории от одной точки до другой, потом отталкивается и так же само.
Так вот как эту траекторию сделать и перемещать объект?

Автор: Pavia 17.6.2012, 19:44
Код

вычисляем скорости vx и vy;

x:=А.x;
y:=А.y;


цикл 
  измеряем, вычисляем dt - время прошедшее с предыдущего витка цикла 
  dx:=vx*dt;
  dy:=vx*dt;

  x:=x+dx;
  y:=y+dy;
выходим из цикла  если (x=Б.x) и (y=Б.y)


Если работаете с цифрами с плавающей точкой, то сравнение делаем с допуском.

А ещё лучше сделать выход из цикла по t>Б.t и  точно вычислить новые координаты.


Автор: iff 17.6.2012, 20:57
Цитата(compplace @  17.6.2012,  17:57 Найти цитируемый пост)
Для этого вроде как используются формулы с косинусами? 

Если вы хотите плавное перемещение объекта, то да.

Автор: kaktebe 17.6.2012, 23:59
Цитата(Pavia @ 17.6.2012,  19:44)
Код

вычисляем скорости vx и vy;

x:=А.x;
y:=А.y;


цикл 
  измеряем, вычисляем dt - время прошедшее с предыдущего витка цикла 
  dx:=vx*dt;
  dy:=vx*dt;

  x:=x+dx;
  y:=y+dy;
выходим из цикла  если (x=Б.x) и (y=Б.y)


Если работаете с цифрами с плавающей точкой, то сравнение делаем с допуском.

А ещё лучше сделать выход из цикла по t>Б.t и  точно вычислить новые координаты.

Да, так оно будет работать, но если объекты лежат на одной вертикальной/горизонтальной/диагональной прямой. А если они лежат на разных плоскостях? И под углом не 90/45/180 и т.д. к друг другу, а под скажем 12/50/77? Так они не встретятся никогда по идее...
В инете нормальной инфы не нашёл по этой теме.
Встречаются примеры типа такого:
Vx = cos(angl*M_PI/180) * speed;
Vy = sin(angl*M_PI/180) * speed; 
Но непонятно как вычислять angl...

Автор: Pavia 18.6.2012, 05:34
Цитата(kaktebe @  17.6.2012,  23:59 Найти цитируемый пост)
 А если они лежат на разных плоскостях? И под углом не 90/45/180 и т.д. к друг другу, а под скажем 12/50/77? Так они не встретятся никогда по идее...

Если они лежат в разных плоскостях, то добавляется z.  По поводу углов. Данная формула подойдет для любых углов. 


Цитата(kaktebe @  17.6.2012,  23:59 Найти цитируемый пост)
Встречаются примеры типа такого:Vx = cos(angl*M_PI/180) * speed;Vy = sin(angl*M_PI/180) * speed; Но непонятно как вычислять angl...

Эти формулы применяются когда известна угол и скорость. Угол можно вычислить через арктангенс. Но смысла в этом нету когда vx и vy можно напрямую без косинусов и синусов получить. vx:=(Б.х-А.Х)/t

Автор: iff 18.6.2012, 13:10
Цитата(Pavia @  18.6.2012,  05:34 Найти цитируемый пост)
Если они лежат в разных плоскостях,

Всегда в одной. даже если есть координата z.

Цитата(Pavia @  18.6.2012,  05:34 Найти цитируемый пост)
Данная формула подойдет для любых углов

Если compplace не вычислит vx и vy, а примет за единицу, то нет.

Если хотите что-бы объект двигался не равномерно (разгонялся со "старта" и замедлялся к "финишу"), то имеет смысл использовать тригонометрическую зависимость координаты.

Автор: compplace 18.6.2012, 16:04
Цитата(iff @ 18.6.2012,  13:10)
Цитата(Pavia @  18.6.2012,  05:34 Найти цитируемый пост)
Если они лежат в разных плоскостях,

Всегда в одной. даже если есть координата z.

Цитата(Pavia @  18.6.2012,  05:34 Найти цитируемый пост)
Данная формула подойдет для любых углов

Если compplace не вычислит vx и vy, а примет за единицу, то нет.

Если хотите что-бы объект двигался не равномерно (разгонялся со "старта" и замедлялся к "финишу"), то имеет смысл использовать тригонометрическую зависимость координаты.

А как angl вычислить имея координаты двух 2D точек?

Автор: baldina 18.6.2012, 16:24
Цитата(compplace @  18.6.2012,  16:04 Найти цитируемый пост)
А как angl вычислить имея координаты двух 2D точек? 

для двух точек вопрос не имеет смысла. надо как минимум три. 
на трех точках можно построить два вектора, и найти угол используя http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B0%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5

Добавлено через 5 минут и 12 секунд
Цитата(compplace @  17.6.2012,  17:57 Найти цитируемый пост)
Как переместить объект из точки А в точку Б?

вообще говоря, если движение по прямой - то линейная интерполяция
p=a*(1-t)+b*t, где а и b суть точки, t - параметр [0,1]. если движение равномерное, можно t считать временем
а вот откуда косинусы взялись я таки не понял)). про повороты вроде ничего не говорилось

Автор: htoit 20.6.2012, 10:55
Посмотрите алгоритм Брезенхема, который позволяет строить линии и окружности в дискретных пространствах.
Алгоритм чрезвычайно прост, реализуется целочисленной арифметикой и не имеет артефактов... применяется и в графике, и в управлении.

Автор: compplace 20.6.2012, 12:18
Цитата(htoit @ 20.6.2012,  10:55)
Посмотрите алгоритм Брезенхема, который позволяет строить линии и окружности в дискретных пространствах.
Алгоритм чрезвычайно прост, реализуется целочисленной арифметикой и не имеет артефактов... применяется и в графике, и в управлении.

Спасибо, я уже сделал по таким вот формулам:
x += speed*cos(angle*(3.141592/180));
y += speed*sin(angle*(3.141592/180));
А angle сначала выставляется где-то например 30 градусов и потом отражается при ударе о стенки.
Правда немного криво работает...

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