Сейчас 23:35:56 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Рассчёт точки
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.


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz