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


Автор: Fantaz1 22.6.2011, 19:10
Помогите решить проблему!
Я пишу 2д игру, вид сбоку. И сейчас хочу реализовать такую фишку, что б при нажатии на кнопку мыши с персонажа (координаты X0, Y0) вылетала пуля и летела по направлению места нажатия кнопки мыши (X1,Y1)
То есть у нас есть прямая построенная на двух точках.
Вопрос: как и по каким формулам можно изменять нашу пулю(X0,Y0) что б она летела равномерно к (X1,Y1)? Как определить величины которые мы должны прибавлять к нашим X0,Y0 к примеру каждую миллисекунду??

Автор: azesmcar 22.6.2011, 19:23
Цитата(Fantaz1 @  22.6.2011,  19:10 Найти цитируемый пост)
Вопрос: как и по каким формулам можно изменять нашу пулю(X0,Y0) что б она летела равномерно к (X1,Y1)? Как определить величины которые мы должны прибавлять к нашим X0,Y0 к примеру каждую миллисекунду?? 

http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D1%8F%D0%BC%D0%B0%D1%8F

Автор: Fantaz1 22.6.2011, 19:44
и шо дальше? там нету ответа на мой вопрос!! Уравнения прямой я и так знаю, я не про это спрашивал!

Автор: azesmcar 22.6.2011, 20:04
а что ты спрашивал?

Цитата(Fantaz1 @  22.6.2011,  19:10 Найти цитируемый пост)
как и по каким формулам можно изменять нашу пулю(X0,Y0) что б она летела равномерно к (X1,Y1)? 

ответ: твоя формула - уравнение прямой!

Автор: Fantaz1 22.6.2011, 20:11
Это не ответ! И что дальше делать с этим уравнением прямой? подставлять все числа и проверять подходят ли они этому уравнению?
Вопрос вот: как изменять координаты пули?

Автор: azesmcar 22.6.2011, 20:15
Fantaz1

Ты хоть прочитал по ссылке прежде чем отвечать?
Цитата

Уравнение прямой, проходящей через две заданные несовпадающие точки
user posted image
или в общем виде
user posted image

подставляешь циклом значения для x в интервале между x0 и x1, считаешь y и получаешь координаты.

Автор: Fantaz1 22.6.2011, 20:29
Я не настолько туп, я ищу нормальный алгоритм решения чем этот, тупой перебор чисел я не считаю за решение.
Вот я и спрашивал есть ли какие то формулы или законы по которым изменяются координаты по прямой!
Вот на другом форуме мне и ответили то что я хотел:
Зависимость координат пули от времени (v - это заданная скорость)

user posted image

Автор: Earnest 22.6.2011, 20:47
Тебе ответили ровно то же самое... Это обобщенное уравнение прямой, абсолютно эквивалентное тому, что написал azesmcar. 
И  t - совсем не время, а параметр длины прямой. Впрочем, можно и как время трактовать, да хоть как ежиков, стоящих вдоль прямой.
Цитата(Fantaz1 @  22.6.2011,  21:29 Найти цитируемый пост)
Я не настолько туп, я ищу нормальный алгоритм решения чем этот, тупой перебор чисел я не считаю за решение.

Может и не туп, но с матчастью явные пробелы. Никакого тупого перебора тебе и не предлагали. Кто же виноват, что ты не понял. Хорошо, что на другом форуме тебе объяснили лучше. 
Кстати, ты действительно угол собираешься вычислять? Все эти арктангенсы применять?

Автор: Fantaz1 23.6.2011, 12:27
До ответа дошел сам. Оказывается он был до безобразия прост..) И не надо не каких формул и прямых. 
- Нахожу координаты вектора движения пули (X1-X0;Y1-Y0). 
- Делю его на его длину. Получаю единичный вектор. 
- А потом постоянно его прибавляю к координате пули.
И пуля движется в ту сторону которую надо)

Автор: baldina 23.6.2011, 12:37
Цитата(Fantaz1 @  23.6.2011,  12:27 Найти цитируемый пост)
постоянно его прибавляю

плохой способ

Автор: Fantaz1 23.6.2011, 12:48
Цитата(baldina @  23.6.2011,  12:37 Найти цитируемый пост)
плохой способ

В смысле? почему плохой?

Автор: baldina 23.6.2011, 14:47
потому что накапливается погрешность.
если надо пройти отрезок (a,b) с шагом dx (для простоты положим, что (b-a) кратно dx), есть два способа:
Код

for (double x = a; x < b; ) 
  x += dx;

и
Код

int n = int((b-a)/dx);
for (int i=0; i < n; ++i)
  double x = a + i*dx;

второй способ предпочтительнее, т.к. в нем не используется предыдущее значение, и погрешность невелика и постоянна
---
что касается Вашей задачи, имхо удобнее представить её в виде линейной интерполяции c параметром t, изменяемом от 0 до 1:
Код

template <typename T>
T lerp(T a, T b, double t) 
{
   return a*(1.0-t) + b*t;
}

формула a*(1.0-t) + b*t суть уравнение прямой в параметрическом виде, где a и b - точки концов отрезка, задающего прямую
т.е. фрагмент программы может быть примерно такой:
Код

int X0, Y0;
int X1, Y1;
int n = 10; // число шагов
double dt = 1.0/(n-1);
for (int i=0; i < n; ++i)
{
   double t = i*dt;
   int X = lerp(X0,X1,t);
   int Y = lerp(Y0,Y1,t);
}

Автор: _Y_ 23.6.2011, 21:57
Цитата(Fantaz1 @  23.6.2011,  12:48 Найти цитируемый пост)
почему плохой? 

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

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