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

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

Ответ
 
Ежик

offline
Опыт: 2,536
Активность:
точка в прямоугольнике.
Взял за основу эту функцию из библиотеки.

Код:
function IsCoordsIn4Gon takes real x, real y, real rx1, real ry1, real rx2, real ry2, real rx3, real ry3, real rx4, real ry4 returns boolean
    local real array dist
    local boolean b = false
    set dist[1] = SquareRoot((rx1-rx2)*(rx1-rx2)+(ry1-ry2)*(ry1-ry2))
    set dist[2] = SquareRoot((rx2-rx3)*(rx2-rx3)+(ry2-ry3)*(ry2-ry3))
    set dist[3] = SquareRoot((rx3-rx4)*(rx3-rx4)+(ry3-ry4)*(ry3-ry4))
    set dist[4] = SquareRoot((rx4-rx1)*(rx4-rx1)+(ry4-ry1)*(ry4-ry1))
    set dist[5] = SquareRoot((rx1-rx3)*(rx1-rx3)+(ry1-ry3)*(ry1-ry3))
    set dist[6] = SquareRoot((x-rx1)*(x-rx1)+(y-ry1)*(y-ry1))
    set dist[7] = SquareRoot((x-rx2)*(x-rx2)+(y-ry2)*(y-ry2))
    set dist[8] = SquareRoot((x-rx3)*(x-rx3)+(y-ry3)*(y-ry3))
    if (dist[6]<=dist[1]) and (dist[6]<=dist[5]) and (dist[7]<=dist[1]) and (dist[7]<=dist[2]) and (dist[8]<=dist[2]) and (dist[8]<=dist[5]) then
        set b = true
    else
        set dist[7] = SquareRoot((x-rx4)*(x-rx4)+(y-ry4)*(y-ry4))
        if (dist[6]<=dist[1]) and (dist[6]<=dist[5]) and (dist[7]<=dist[1]) and (dist[7]<=dist[2]) and (dist[8]<=dist[2]) and (dist[8]<=dist[5]) then
            set b = true
        endif
    endif
    return b
endfunction


Вот моя функция


Код:
function kv takes unit d1,unit d2,unit d3,unit d4,real x,real y returns boolean
local real array x2
local real array y2
local real array dist
local real a
local boolean b = false
set x2[0] = GetUnitX(d1)
set y2[0] = GetUnitY(d1)
set x2[1] = GetUnitX(d2)
set y2[1] = GetUnitY(d2)
set x2[2] = GetUnitX(d3)
set y2[2] = GetUnitY(d3)
set x2[3] = GetUnitX(d4)
set y2[3] = GetUnitY(d4)
                set dist[1] = SquareRoot((x2[0]-x2[1])*(x2[0]-x2[1])+(y2[0]-y2[1])*(y2[0]-y2[1]))
                set dist[2] = SquareRoot((x2[1]-x2[2])*(x2[1]-x2[2])+(y2[1]-y2[2])*(y2[1]-y2[2]))
                set dist[3] = SquareRoot((x2[2]-x2[3])*(x2[2]-x2[4])+(y2[2]-y2[3])*(y2[2]-y2[3]))
                set dist[4] = SquareRoot((x2[3]-x2[0])*(x2[3]-x2[0])+(y2[3]-y2[0])*(y2[3]-y2[0]))
                set dist[5] = SquareRoot((x2[0]-x2[2])*(x2[0]-x2[2])+(y2[0]-y2[2])*(y2[0]-y2[2]))
                set dist[6] = SquareRoot((x-x2[0])*(x-x2[0])+(y-y2[0])*(y-y2[0]))
                set dist[7] = SquareRoot((x-x2[1])*(x-x2[1])+(y-y2[1])*(y-y2[1]))
                set dist[8] = SquareRoot((x-x2[2])*(x-x2[2])+(y-y2[2])*(y-y2[2]))
 if (dist[6]<=dist[1]) and (dist[6]<=dist[5]) and (dist[7]<=dist[1]) and (dist[7]<=dist[2]) and (dist[8]<=dist[2]) and (dist[8]<=dist[5]) then
set b = true
    else
        set dist[7] = SquareRoot((x-x2[3])*(x-x2[3])+(y-y2[3])*(y-y2[3]))
        if (dist[6]<=dist[1]) and (dist[6]<=dist[5]) and (dist[7]<=dist[1]) and (dist[7]<=dist[2]) and (dist[8]<=dist[2]) and (dist[8]<=dist[5]) then
//--------------- 
set b = true
else
set b = false
endif
    endif
return b
endfunction


Функция работает на пол прямоугольника.Юнит щитается что он в прямоугольнике только в регионе 2.
Миниатюры
Кликните на картинку для увеличения
Название:  no.gif
Просмотров: 12
Размер:  11.2 Кбайт  
Старый 01.11.2011, 22:35
Doc

offline
Опыт: 63,163
Активность:
омфг а прямоугольник всегда одинаково повернут?
Старый 01.11.2011, 22:46
Ежик

offline
Опыт: 2,536
Активность:
Цитата:
Сообщение от Doc
омфг а прямоугольник всегда одинаково повернут?

Да.
Старый 01.11.2011, 22:49
Doc

offline
Опыт: 63,163
Активность:
Т_Т ЭТАПЯТЬ
bool inCords(unit u, float x, float y, float w, float h){
	float ux = GetUnitX(u), uy = GetUnitY(u)
	return (ux >= x && uy >= y && ux <= x + w && uy <= y + h)
}
Старый 01.11.2011, 22:53
Ежик

offline
Опыт: 2,536
Активность:
Цитата:
Сообщение от Doc
float x, float y, float w, float h

Что есть точки x,y и w,h

Если на рисунке то, x,y это d4 а w,h d2

Ежик добавил:
Так?
Старый 01.11.2011, 22:59
Doc

offline
Опыт: 63,163
Активность:
координаты нижней левой точки в прямоугольнике и его ширина высота.
Старый 01.11.2011, 23:35
Ответ

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

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

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

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



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