Goodie
offline
Опыт:
2,825Активность: |
Распределение юнитов по радиусу
Нужно составить такую формулу. Наверняка она новичкам и мне понадобится) Вобщем, у нас есть радиус,тип юнита, и 2 точки. Это x и y Задав значение мы получаем круг юнитов Функция сама найдет оптимальное значение юнитов и выдаст кружок Не могу таки найти формулу. Никак =/ ибо в геометрии не шарю =) Кто помогет с такой функцией, буду очень рад |
31.03.2013, 02:34 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
Может быть, это не то, что надо, но попробуй ScSortedSelector - перебор юнитов по удаленности |
31.03.2013, 04:25 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Goodie
offline
Опыт:
2,825Активность: |
ScorpioT1000, Ноу, мне не выбор нужен =/ А нужно создать ровное кол-во объектов по радиусу |
31.03.2013, 04:56 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,338Активность: |
((код jass
function CreateUnitCircle takes player pl, integer unitid, real x, real y, real radius, integer count returns group
local integer nIndex = 0 local group grp = CreateGroup( ) local real A = 360.00 / count loop exitwhen nIndex > count set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex )
call GroupAddUnit( grp, bj_lastCreatedUnit ) set nIndex = nIndex + 1 endloop set bj_groupRemoveGroupDest = grp
set grp = null return bj_groupRemoveGroupDest
endfunction )) Вот функция, формула круга проста 360 поделить на количество юнитов и умножить на шаг цикла, так ты находишь смещение точки, ну а координаты вычисляются так же просто
X + расстояние * Cos( угол смещения * bj_DEGTORAD ) то же самое для Y тока там Sin вот версия с защитой от дурака
» код
((код jass
function CreateUnitCircle takes player pl, integer unitid, real x, real y, real radius, integer count returns group
local integer nIndex = 0 local real A = 360.00 / count if unitid == 0 then проверка на отсутствие id юнита return null endif set bj_groupRemoveGroupDest = CreateGroup( ) loop exitwhen nIndex > count set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex ) if GetHandleId( bj_lastCreatedUnit ) == 0 then проверка на то что юнита с таким id не существует call DestroyGroup( bj_groupRemoveGroupDest ) return null endif call GroupAddUnit( bj_groupRemoveGroupDest, bj_lastCreatedUnit ) set nIndex = nIndex + 1 endloop return bj_groupRemoveGroupDest endfunction )) Отредактировано quq_CCCP, 31.03.2013 в 05:38. |
31.03.2013, 05:19 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Goodie
offline
Опыт:
2,825Активность: |
quq_CCCP, Дак я здесь не вижу как формулой нашлось число, так как в принимаемых аргументах есть count
Нужно функцией найти count не записывая в него ничего Кстати: ((код jass
loop
exitwhen nIndex >= count set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex )
call GroupAddUnit( grp, bj_lastCreatedUnit ) set nIndex = nIndex + 1 endloop )) Я же написал. У нас есть: ((код jass
void CircleUnits(int id,float radius,real x,real y){
... } )) Примерно такой должна быть функция Спасибо конечно gug_CCCP за твою функцию, много чего узнал) Но еще вот осталось добавить к ней - авто нахождение count не записывая в него ничего Goodie добавил:
Вот. Эта функция мне подходит: ((код jass
#include "cj_types.j"
group CircleUnits(player forplayer,int unitid,float radius,float x,float y){
float count = 0.0 , A =0.0 int nIndex = 0 group grp = CreateGroup( ) count = (radius/20.0) ; count = I2R(R2I(count)) ; A = 360.00 / count do{ GroupAddUnit( grp, CreateUnit( forplayer, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex ) ) nIndex++ }whilenot(nIndex > count) bj_groupRemoveGroupDest = grp grp=null return bj_groupRemoveGroupDest } ................
private group Circled = null
void SomeFunc(){
Circled = CircleUnits(Player(6),'H000',150.00,GetUnitX(gg_unit_earc_0018),GetUnitY(gg_unit_earc_0018))
ForGroup(Circled,\ lambda void(){ DestroyEffect(AddSpecialEffect("war3mapImported\\Punishment_Missle.mdx",GetUnitX(GetEnumUnit()),GetUnitY(GetEnumUnit()))) }) ))
Вот это мне было нужно =) Формула расчета боевых едениц вроде работает правильно) Создает кружок из едениц
Goodie добавил: Закрывайте |
31.03.2013, 12:35 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|