| 
				
				Угол в системе координат.
				 | 
				
			  | 
| 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  |  
|   | 
 |   
  |