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

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

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Полярные координаты
Мною было выяснено что полярные координаты вызывают концентрацию объектов по осям смещеным на 45% от осей X\Y
!5\9 объектов сходятся именно у этих осей
как пример бага выкладываю карту, где это просматривается.
обратите внимание на миникарту, мобы будут созданы 2 раза, и в обоих случаях это правило не нарушается
ну и само собой такую несправедливость мною было решено исправить, кто может или хочет помочь, прошу отозваться
Старый 22.12.2006, 18:31
nic666

offline
Опыт: 5,612
Активность:
Ну дык попробуй заменить ГСЧ, он же RND... тут и тема такая была ;)

nic666 добавил:
Хотя, я попробовал свой генератор, результат примерно такой же...
Старый 22.12.2006, 19:17
Iron
Листовой
offline
Опыт: 24,427
Активность:
DioD, что ты имеешь ввиду? Т.е. ты хошь сказать, что расстояние по окружности (в варике) от 44-го до 45-го градусов менше чем от 89-го до 90-го?
Старый 22.12.2006, 19:35
nic666

offline
Опыт: 5,612
Активность:
DioD
Всё брат! Я понял в чем проблема. Дело не в качестве ГСЧ, а в том как ты его используешь.

Предположим что функция RND(360) выдает значения равновероятно, то есть равномерно. Но функция sin(RND(360)) уже не будет выдавать равномерные значения, а также и COS(RND(360)) - их значения подчиняются иной закономерности, а имено
sin^2(a)+cos^2(a)=1
то есть поскольку sin(45)=cos(45), то при значении 45 имеется аномально большое равенство .sin(45)=cos(45)=sqrt(2)/2


Это не глюк полярной системы! Это закон тригонометрии!!!
Чтобы исправить это используй одинаковый угол, вот так
Код:
function Trig_Creep_Spawn_Actions takes nothing returns nothing
    local real ang = I2R(RND(360000))
    local real x = (11424/600)*(600-udg_CCounter) * Cos(ang)
    local real y = (11424/600)*(600-udg_CCounter) * Sin(ang)
    call CreateUnit(Player(12),'u000',x,y,0)
    set udg_CCounter = udg_CCounter + 1
endfunction

ну или вместо RND можно local real ang = GetRandomDirectionDeg()
или тоже local real ang = GetRandomReal(0, 6.2831)

Попробуй!
Старый 22.12.2006, 19:43
Iron
Листовой
offline
Опыт: 24,427
Активность:
nic666, тока что глянул карту и тоже увидел.
DioD, вся фишка в том, что функции cos и sin нелинейные, так что хоть угол и равномерно рандомится, но sin и cos от этой равномерности получается неравномерный.
Т.е. это не полярные координаты кревые, это у тебя функция не совсем для вычисления полярных координат.
Старый 22.12.2006, 19:49
nic666

offline
Опыт: 5,612
Активность:
собствено в твоем оригинале и небыло полярной системы координат , там (R,a) задает точку, а у тебя "a" было разным для "x" и для "y"
Старый 22.12.2006, 19:50
DioD

offline
Опыт: 45,134
Активность:
хехе, надо исправить эту багу не изменяя функцию напрямую, собственно для этого требуется линия распределения с взаимоисключаемыми объектами, позже явыложу это, хотя хз получиться это на джаз или нет
Старый 22.12.2006, 20:00
nic666

offline
Опыт: 5,612
Активность:
такое впечатление, что меня абсолютно не поняли...
Ну DioD посмотри же на формулы R * Cos(ang), R * Sin(ang), пара чисел (R,ang) задают точку в полярной системе координат, у тебя просто была ошибка в формуле... нет никаких глюков.
Код:
function Trig_Creep_Spawn_Actions takes nothing returns nothing
    local real ang = GetRandomReal(0, 6.2831)
    local real R= (11424/600)*(600-udg_CCounter)
    local real x = R * Cos(ang)
    local real y = R * Sin(ang)
    call CreateUnit(Player(12),'u000',x,y,0)
    set udg_CCounter = udg_CCounter + 1
endfunction
Старый 22.12.2006, 20:33
Ответ

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

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

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

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



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