[Вопрос] Рассчёт точки
|
|
Zonnery | Дата: Понедельник, 11 Марта 2013, 08:37:53 | Сообщение # 1 |
3 уровень
Группа: Проверенные
Сообщений: 42
Награды: 0
Репутация: 95
Блокировки:
| Не буду усложнять понимание различными деталями, поэтому упрощаю всё по максимуму.
Даны два тела, у красного тела скорость 40, у синего 4. Синее тело движется по прямой(серая полоска). Нужно найти координаты точки на этой полоске, в которой встретятся красное и синее тело. Если бы синее тело находилось в покое, то решалась задача бы просто. Мы находим угол между двумя точками и через Sin\Cos*угол двигаем красное к синему. Но тут синее тело находится в движении, и нужно найти эту самую точку, запустив красное тело в которую, мы получим столкновение двух тел. Эта формула нужна для рассчёта вектора полёта снаряда в системе.
Мир, как зеркало, отражает ваше отношение к нему. Когда боретесь с миром, он борется с вами. Когда прекращаете свою битву, мир идет навстречу.(В.Зеланд) vk.com/zonnery
Сообщение отредактировал Zonnery - Понедельник, 11 Марта 2013, 08:39:01 |
|
|
|
SirNikolas | Дата: Понедельник, 11 Марта 2013, 12:40:49 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Можно сказать, что скорость синего тела (v2) пренебрежимо мала по сравнению со скоростью красного тела (v1). Тогда они встретятся через время t = d / v1, где d = √((x1 - x2)2 + (y1 - y2)2). Синее тело в этот момент будет иметь координаты x2' = x2 + v2 * t * cos(a); y2' = y2 + v2 * t * sin(a). Следовательно, угол, под которым требуется запустить красное тело, вычисляется как atan2(y2' - y1, x2' - x1).
Если же нужна более высокая точность, можно пойти следующим путем. Обозначим функцию f(d) = √((x1 - x2')2 + (y1 - y2')2), если изначальное расстояние между телами принять за d. Пусть r1 = √((x1 - x2)2 + (y1 - y2)2) r2 = f(r1) ri = f((ri - 2 + ri - 1) / 2) Будем вычислять значения функции до такого rn, что |rn - rn - 1| < ε. Тогда, выполнив исходный алгоритм для d = rn, получим искомый угол.
|
|
|
|
Zonnery | Дата: Понедельник, 11 Марта 2013, 12:46:39 | Сообщение # 3 |
3 уровень
Группа: Проверенные
Сообщений: 42
Награды: 0
Репутация: 95
Блокировки:
| Благодарю, тему можно закрыть.
Мир, как зеркало, отражает ваше отношение к нему. Когда боретесь с миром, он борется с вами. Когда прекращаете свою битву, мир идет навстречу.(В.Зеланд) vk.com/zonnery
|
|
|
|
Duosora | Дата: Понедельник, 11 Марта 2013, 12:54:41 | Сообщение # 4 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| *Здесь хотел опубликовать код, но Николас меня уже опередил* Добавлено (11 Марта 2013, 12:54:41) ---------------------------------------------
Код function CalculateBodyXY takes real x1, real y1, real x2, real y2, real speed1, real speed2, boolean x returns real local real newX1 = x1 local real newY1 = y1 local real newX2 = x2 local real newY2 = y2 local real a local real d local boolean b = (speed2 > speed1) loop set d = SquareRoot((newX1-newX2)*(newX1-newX2)+(newY1-newY2)*(newY1-newY2)) set a = Atan2(newY2-newY1,newX2-newX1) if b then set b = d < speed2 else set b = d < speed1 endif exitwhen b set newX1 = newX1 + speed1 * Cos(a) set newY1 = newY1 + speed1 * Sin(a) set newX2 = newX2 + speed2 * Cos(a) set newY2 = newY2 + speed2 * Sin(a) endloop if x then return newX1 // Любой из X подойдёт. endif return newY1 // Любой из Y подойдёт. endfunction
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
SirNikolas | Дата: Понедельник, 11 Марта 2013, 12:56:26 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата (Duosora) if x then return newX1 // Любой из X подойдёт. endif return newY1 // Любой из Y подойдёт. Два раза крутить алгоритм с одними исходными данными - not true. Лучше в глобалки пиши.
|
|
|
|
Duosora | Дата: Понедельник, 11 Марта 2013, 12:57:49 | Сообщение # 6 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| SirNikolas, Работаем мы в тех условиях, когда дополнительных вводимых глобалок мы не имеем. Поэтому я бы рад записывать это в глобалки, но вводить не данные исходно переменные - not true.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|