XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Функция рикошета
Когда я делал способность, которая должна была создавать электрический шар отскакивающий от юнитов, то я столкнулся с проблемой, а как же найти этот самый угол отражения, я перечитал темы в поиске, перепробовал разные варианты, но при тесте все-равно замечались ошибки, поэтому мне пришлось думать нестандартно такого варианта я не видел, т.к. я люблю геометрию, я начертил на листке схему и нашел ответ. Надо было всего лишь построить перпендикулярный вектор в вершине вектора нашего снаряда, таким образом мы получаем 2 возможных направления нашего снаряда и 3 (ровно назад). Но теперь оставалось решить, а в какую сторону ему лететь, я стал думать дальше. В итоге я построил 2 точки на одинаковом расстоянии от места касания векторов, на перпендикулярном векторе и сравнил расстояние от этих точек до моего объекта, если модуль разности был не больше 25 то я разворачивал его в обратную сторону, иначе направлял в сторону точки расстояние которой ближе к электрическому шару.
function SR takes real x1, real y1, real x2, real y2 returns real
   return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 
endfunction 

function GetAngle takes real x, real y, real x1, real y1, real a, real fa, real fd returns real
    real X1 = x1 + fd * Cos(a + 90 * bj_DEGTORAD)
    real Y1 = y1 + fd * Sin(a + 90 * bj_DEGTORAD)
    real X2 = x1 + fd * Cos(a - 90 * bj_DEGTORAD)
    real Y2 = y1 + fd * Sin(a - 90 * bj_DEGTORAD)
    real dist1 = SR(x, y, X1, Y1)
    real dist2 = SR(x, y, X2, Y2)
    real r
    if dist1 - dist2 > fa or dist1 - dist2 < -1*fa  then
        if dist1 > dist2 then
            r = Atan2(Y2-y,X2-x) 
        else
            r = Atan2(Y1-y,X1-x)
        endif
    else
        r = a - 180 * bj_DEGTORAD
    endif
    return r
endfunction
x,y -координаты снаряда
x1,y1 - координаты объекта
а - угол между объектами
fa - максимальная погрешность при которой, мы развернем снаряд ровно назад
fd - расстояние от места касания векторов, до точки
Утверждать, что такого не было, не имею права, так что если это "баянище" - удалите.
Миниатюры
Кликните на картинку для увеличения
Название:  Angles.jpg
Просмотров: 21
Размер:  25.8 Кбайт  Кликните на картинку для увеличения
Название:  Angles1.jpg
Просмотров: 25
Размер:  31.0 Кбайт  Кликните на картинку для увеличения
Название:  Angles2.jpg
Просмотров: 20
Размер:  30.9 Кбайт  

Отредактировано Vadik29, 13.01.2013 в 19:13.
Старый 13.01.2013, 12:33
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Vadik29, Просто это не полное определение - Угол падения равен углу отражения, и забывают от точке раздела 2 сред, в данном случае перпендикуляре, делящим угол на пополам...
Старый 13.01.2013, 12:50
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
quq_CCCP, в данном случае он равен. Я понял, моя функция имеет максимальный угол отражения 90°.

Отредактировано Vadik29, 13.01.2013 в 13:13.
Старый 13.01.2013, 12:51
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Vadik29, Осталось только добавить формулу Преломления и добавлять в библиотеку функций, глядишь оценят...
Старый 13.01.2013, 13:13
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
quq_CCCP, А вот с этим у меня проблема, не знаю как ее впихнуть сюда.
Старый 13.01.2013, 20:05
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Vadik29, Преломление - это изменение скорости и угла, при попадании снаряда в цель, он должен частично замедлится и изменить свой угол, подробнее можно глянуть в учебнике физики...
Старый 14.01.2013, 06:15
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 12:10.