Угол в системе координат.
|
|
RaiN_S | Дата: Воскресенье, 21 Апреля 2013, 20:31:33 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Привет. Запутался с вычислением нужного угла. В общем так: нужно расталкивать юнитов в стороны под прямым углом от направления способности. Вот моя попытка: Код set b = Atan2(GetUnitY(u) - y1,GetUnitX(u) - x1) if b > a then call SetUnitPosition( u, GetUnitX(u) + 30. * Cos(a+(bj_PI/2.)), GetUnitY(u) + 30. * Sin(a+(bj_PI/2.))) else call SetUnitPosition( u, GetUnitX(u) + 30. * Cos(a-(bj_PI/2.)), GetUnitY(u) + 30. * Sin(a-(bj_PI/2.))) endif которая не работает , когда я даю направление близкое к 3pi/2. x1 и y1 - это координаты героя.
Сообщение отредактировал RaiN_S - Воскресенье, 21 Апреля 2013, 20:35:29 |
|
|
|
VasyaBaratrum | Дата: Воскресенье, 21 Апреля 2013, 22:29:05 | Сообщение # 2 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| На ось OX проекции делаются, а не OY
|
|
|
|
Borodach | Дата: Воскресенье, 21 Апреля 2013, 22:34:40 | Сообщение # 3 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| RaiN_S, Попробуй так
Karamba
Сообщение отредактировал Borodach - Воскресенье, 21 Апреля 2013, 22:35:11 |
|
|
|
Волчачка | Дата: Воскресенье, 21 Апреля 2013, 22:40:44 | Сообщение # 4 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Код function SetUnitPosKJ takes unit u, real x, real y, real dist returns nothing call SetUnitX( u, x + dist * Cos( GetUnitFacing(u) * bj_DEGTORAD ) ) call SetUnitY( u, y + dist * Sin( GetUnitFacing(u) * bj_DEGTORAD ) ) endfunction
Сообщение отредактировал Волчачка - Воскресенье, 21 Апреля 2013, 22:41:10 |
|
|
|
BlackFox | Дата: Воскресенье, 21 Апреля 2013, 23:08:26 | Сообщение # 5 |
3 уровень
Группа: Проверенные
Сообщений: 52
Награды: 0
Репутация: 25
Блокировки:
| Волчачка, не то, это лишь двигает вперёд. А нужно на расталкивание, в стороны. Тут намного сложнее. тут будет два варианта 1 Код call SetUnitX( u, x + dist * Cos( GetUnitFacing(с) - 90. * bj_DEGTORAD ) ) call SetUnitY( u, y + dist * Sin( GetUnitFacing(с) - 90. * bj_DEGTORAD ) ) 2 Код call SetUnitX( u, x + dist * Cos( GetUnitFacing(с) + 90. * bj_DEGTORAD ) ) call SetUnitY( u, y + dist * Sin( GetUnitFacing(с) + 90. * bj_DEGTORAD ) )
Нужна ещё проверка, что юниты находятся в разных направления от пересечения способности. Ещё нужно просчитывать с направлением по месту нахождения. Без if then else endif не обойтись.
SirNikolas падёт в неравном бою с брутфорсом, Alice.
Сообщение отредактировал BlackFox - Воскресенье, 21 Апреля 2013, 23:09:12 |
|
|
|
Borodach | Дата: Воскресенье, 21 Апреля 2013, 23:22:49 | Сообщение # 6 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Цитата (BlackFox) call SetUnitX( u, x + dist * Cos( GetUnitFacing(с) - 90. * bj_DEGTORAD ) ) call SetUnitY( u, y + dist * Sin( GetUnitFacing(с) - 90. * bj_DEGTORAD ) ) А если юнит лицом в сторону.... его откинет назад по отношению к герою, а не в сторону
Karamba
Сообщение отредактировал Borodach - Воскресенье, 21 Апреля 2013, 23:23:41 |
|
|
|
BlackFox | Дата: Воскресенье, 21 Апреля 2013, 23:40:23 | Сообщение # 7 |
3 уровень
Группа: Проверенные
Сообщений: 52
Награды: 0
Репутация: 25
Блокировки:
| Цитата (Borodach) А если юнит лицом в сторону.... его откинет назад по отношению к герою, а не в сторону
Очевидно ты не понял, да и проглядел. Код set a = GetUnitFacing(c) set b = Atan2(GetUnitY(u) - y1,GetUnitX(u) - x1)
if b > a then call SetUnitX( u, x + 30. * Cos( a + 90. * bj_DEGTORAD ) ) call SetUnitY( u, y + 30. * Sin( a + 90. * bj_DEGTORAD ) ) elseif ( b < a ) then call SetUnitX( u, x + 30. * Cos( a - 90. * bj_DEGTORAD ) ) call SetUnitY( u, y + 30. * Sin( a - 90. * bj_DEGTORAD ) ) endif FIXED 22.04.13 1:29
SirNikolas падёт в неравном бою с брутфорсом, Alice.
Сообщение отредактировал BlackFox - Понедельник, 22 Апреля 2013, 01:29:13 |
|
|
|
VasyaBaratrum | Дата: Воскресенье, 21 Апреля 2013, 23:50:43 | Сообщение # 8 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| в SetUnitPosition поменяй угол a на b, так как угол а показывает направление способности, а угол b связан с юнитом
|
|
|
|
Extremator | Дата: Понедельник, 22 Апреля 2013, 07:55:13 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
| ну сначало надо выловить с какой стороны от "спелла" находится юнит, и потом установить угол который будет больше/меньше угла "спелла" на 90 градусов
если слева - то (угол спелла - 90) если справа - то (угол спелла + 90)
|
|
|
|
RaiN_S | Дата: Среда, 24 Апреля 2013, 17:18:46 | Сообщение # 10 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| BlackFox, ты вообще мой код смотрела? Это неправильно. Проверка на то, с какой стороны враг, должна быть другой. Extremator, я о том и спрашиваю, как проверку сделать нормально, т.к. в WorldEdit "не та" система координат.
Сообщение отредактировал RaiN_S - Среда, 24 Апреля 2013, 17:49:20 |
|
|
|
Волчачка | Дата: Пятница, 26 Апреля 2013, 16:27:55 | Сообщение # 11 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| RaiN_S, То есть, это типа одного из навыков хранителя света из доты? Да? То есть разброс в стороны от точки, где стоит герой?
|
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 16:43:23 | Сообщение # 12 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Нет, это типа волны силы, которая расталкивает в стороны. На рисунке начало координат - это герой, а желтая линия - область действия скилла. Соответсвенно толстый зеленый вектор - это путь, который проходит волна.
|
|
|
|
lawson | Дата: Пятница, 26 Апреля 2013, 17:10:28 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| что это за член на картинке?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Borodach | Дата: Пятница, 26 Апреля 2013, 20:10:52 | Сообщение # 14 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Вот в карте возможно и ответ... Пример
Karamba
|
|
|
|
RaiN_S | Дата: Пятница, 26 Апреля 2013, 20:57:16 | Сообщение # 15 |
6 уровень
Группа: Проверенные
Сообщений: 163
Награды: 0
Репутация: 77
Блокировки:
| Borodach, твой пример работает неправильно. Вот здесь: Код set aa = Atan2(GetWidgetY(ut)-GetWidgetY(e),GetWidgetX(ut)-GetWidgetX(e)) if aa < a then call move(e,a+90) elseif aa > a then call move(e,a-90) endif Ты делаешь ту же ошибку. Попробуй запустить скилл ровно влево , так, чтобы угол направления скилла был близок к границе положительных и отрицательных значений pi.
Скорее всего придется разбивать всё на четверти и от них отталкиваться при проверке. Но чувствую, что это можно сделать короче.
Сообщение отредактировал RaiN_S - Пятница, 26 Апреля 2013, 21:03:56 |
|
|
|