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


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

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

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