Нахождение точки перехвата объекта.

Декабрь 26, 2007

Недавно решал такую задачу. Есть равномерно движущийся объект. Необходимо направить другой объект так, что бы он перехватил 1й. Для первого объекта известно его текущее положение и скорость перемещения. Для второго известна только величина скорости и его положение.

Из постановки задачи, следует, что оба объекта будут перемещаться одинаковый промежуток времени t и встретяться в точке P.

Нахождение точки перехвата

В обобщенном виде, задача записывается так:

Имеем 3 неизвестных параметра: , , Но нам известна величина .

Находим время, которое будут двигаться два объекта к точке пересечения:

Теперь распишем полученную формулу в проекциях на оси

И составим систему уравнений:

Сделаем следующие обозначения, для упрощения читабельности формул:

Теперь найдем

и подставим полученное значение в первую формулу системы уравнений

Сделаем еще несколько обозначений:

Продолжим наши преобразования:

Получаем квадратное уравнение, находим дискриминант и наше 1е неизвестное a.

Помним, уравнение имеет решение, если

Теперь находим время, которое необходимо обоим объектам, что бы достичь точки пересечения, помним что

Зная t, находим вектор скорости второго объекта:

Вот и вся математика.

Замечания

  • Так как после решения квадратного уравнения, если дискриминант больше 0 мы получим два значения скорости. Для каждого из них находим время и для последующих расчетов используем наименьшее положительное значение.
  • Если дискриминант меньше 0, тогда 2й объект 1й уже догнать не сможет

Пример реализации

Вектор speed1 содержит помимо направления, также и значение скорости:
speed1 = dir * speedVal

inline bool getInterceptPos(const Vector4& p1, const Vector4& speed1, const Vector4& p2, float speedVal, Vector4& pos)
{
	float x = p1.x - p2.x;
	float y = p1.y - p2.y;
	float c = speedVal;
	float s = x * speed1.y - y * speed1.x;
	float d = (-2*x*s)*(-2*x*s) - 4 * (x*x + y*y)*(s*s - (y*y)*(c*c));
	if(!(d < 0)) {

		float a1 = (2*x*s + sqrtf(d))/(2*((x*x) + y*y));
		float a2 = (2*x*s - sqrtf(d))/(2*((x*x) + y*y));

		float t1 = y / (a1 - speed1.y);
		float t2 = y / (a2 - speed1.y);
		float t = t1;
		if(t < 0 || (t > t2 && t2 > 0))
			t = t2;
		pos = p1 + speed1 * t;
		return true;
	}
	return false;
}
			

Реализацию класса Vector4 смотрите тут.

Обсудить в форуме.


Раз вы уже дочитали до сюда, то вам ничего не будет стоить кликнуть на рекламу

All content copyright (c) 2012 Vladislav Litunovskiy. All Rights Reserved.