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

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

Ответ
 
Mihahail
๏̯͡๏
offline
Опыт: 17,766
Активность:
YellowStar:
RegionAddRect
Так работать не будет?
Старый 13.08.2012, 18:05
ScorpioT1000
Работаем
offline
Опыт: отключен
Функция должна возвращать угол нормали в радианах.
что такое нормаль региона
что такое регион с разрывом
вот ты упоротый, если бы просто разместил скрины ссылками, то наш сервер бы залил их к себе оттуда, а теперь скриншотер умер и скрины вместе с ним
Старый 13.08.2012, 18:31
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
ScorpioT1000, под катом скрин. Да и кто ж знал что у них какой то вайп
Старый 13.08.2012, 19:16
ScorpioT1000
Работаем
offline
Опыт: отключен
Я, видимо, один знал, что так будет.
Старый 13.08.2012, 19:17
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Mihahail, и что ты собрался добавлять? У тебя есть только region неизвестной формы, есть точка лежащая рядом с нужной гранью и все, больше ничего нет.
Старый 14.08.2012, 00:11
adic3x

offline
Опыт: 108,439
Активность:
Достать из региона его координаты можно только записав их изначально куда либо, одним словом хук на функцию создания региона и хук на функцию добавление ректа? Короче показывай свое решение, а мы посмотрим.
Старый 17.08.2012, 00:28
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
ADOLF, всё куда проще. Быстро вы застонали <_< ну ладно вот вам решение
((код jass
method GetNormalAngle takes real x, real y, real d returns real
X,Y - координаты точки касания
D - размер отрезка для определения нормали
Алгоритм таков. Берем 2 точки, принадлежащие блоку. Берем 2 отрезка, длиной в d*2.
Начинаем направлять эти 2 отрезка во все 4 стороны. Если обе внешние точки вышли за границу
блока, то данная ориентация линии является искомой (Возможны не корректные случаи, при малых регионах, которые не возможно создать
Рекомендуется d брать малым, по сравнению с размерами блока, но большим по сравнению с расстоянием
до края
local real angle = 0.
loop
if not (IsPointInRegion(.AllRect, x-2.*Sin(angle)+d*Cos(angle), y+2.*Cos(angle)+d*Sin(angle)) or IsPointInRegion(.AllRect, x+2.*Sin(angle)+d*Cos(angle), y-2.*Cos(angle)+d*Sin(angle))) then
return angle
endif
set angle = angle + PI_2
exitwhen angle >= 2.*bj_PI
endloop
return angle
endmethod
))
и если не знаете какое этому применение, то я это использую в проекте HLL для определения нормали поверхности, на котором будет открыт портал и очень активно используется в физике для определения угла наклона поверхности
Старый 17.08.2012, 00:33
Doc

offline
Опыт: 63,163
Активность:
alexprey, пффф я знал что так можно но даже не рассматривал такой метод Т_Т
Это глупо и медленно.
Старый 17.08.2012, 01:23
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, другого варианта нет
Старый 17.08.2012, 01:50
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
alexprey, Случай когда "есть только region неизвестной формы, но координат нет" - быдлокод. А так регион представляет собой массив многоугольников; многоугольник является массивом упорядоченных вершин; через каждые 2 последовательные вершины можно провести прямую; если уже известно от какой прямой брать перпендикулляр, то надо ее угол наклона +90 градусов; откуда известно? а откуда ты взял условие что "точка гарантированно лежит около нужной грани"? тут нужно взять откуда-то эту точку (юзер щелкнул мышкой?) и проверить что она именно на границе лежит, а когда будеш проверять - сразу же найдешь грань, не надо такие задачи сильно абстрагировать и разбивать на части, т.к. вцелом будет оптимальней; если же никакой проверки на правильности нахождения точки не было и не известно какую границу брать: берем цикл по всем многоугольникам, внутри него цикл по всем прямым, для каждой прямой вычисляем длину перпендикулляра до точки (формула ниже), если эта длина меньше искомой толщины грани -> нашли нужную грань, а угол наклона +90 вот те угол перпендикулляра.
Код C#
/ <summary>
/ Обнаружение попадания точки в прямую линию
/ </summary>
/ <param name="point">Точка</param>
/ <param name="lineStart">Начало прямой</param>
/ <param name="lineEnd">Окончание прямой</param>
/ <param name="width">Толщина прямой</param>
/ <returns>Признак - Попали</returns>
public static bool DetectCollisionLine(Point point, Point lineStart, Point lineEnd, double width)
{
double dx = lineStart.X - lineEnd.X;
double dy = lineStart.Y - lineEnd.Y;
double a = dy;
double b = -dx;
double c = lineStart.Y * dx - lineStart.X * dy;
double k1 = Math.Abs(a * point.X + b * point.Y + c);
double k2 = Math.Sqrt(a * a + b * b);
double range = k1 / k2;
if (range > width) return false;
return (point.X >= Math.Min(lineStart.X, lineEnd.X) &&
point.X <= Math.Max(lineStart.X, lineEnd.X) &&
point.Y >= Math.Min(lineStart.Y, lineEnd.Y) &&
point.Y <= Math.Max(lineStart.Y, lineEnd.Y));
}
Код использовался для проги рисования логических схем (И, ИЛИ, НЕ) с расстановкой проводов между ними, и проверка чтоб узнать - попал ли юзер мышкой в прямую (провод).
Последняя проверка - попадает ли точка в прямоугольник; для оптимизации внутри цикла (многоугольников, потом линий) можно сначала проверять это, а уж когда найдеш сначала подходящий многоугольник + подходящую линию, уже сщи расстояние от точки до прямой
В твоем решении я так понял возвращается угол только 0, 90, 180, 270, так? Цикл то angle += PI/2.
Тем более проверка на принадлежность точки прямоугольнику многократно вызывается в нативной функции IsPointInRegion.
P.S.
А вот еще - моим алгоритмом можно получить и проверить прямую с любым уголом, не только кратный 90. А раз в варике регион состоит из ректов - можно в разы все упростить. Как именно пока не скажу (над думать). Тут еще сильное влияние окажет структура хранения этих прямых. Если например они хранятся упорядоченно так: в начале списка те что левее, в конце те что правее, можно юзать метод половинного деления (индексы массива не перебираем все подряд) при поиске расстояния от точки до прямой.

Отредактировано Alex_Hell, 17.08.2012 в 03:21.
Старый 17.08.2012, 02:56
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
точка гарантированно лежит около нужной грани
другой алгоритм делает трассировку луча <_<
Если хранить прямые, то поиск самой этой прямой будет идти намного дольше ибо формы очень сложные встречаются, нежели чем найти рект и проверить таким алгоритмом
вот пример:
зеленые не рассматриваются, т.к. имеют другое назночение. Остальные объеденяются по материалу (цвет)
Старый 17.08.2012, 13:11
Ответ

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

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

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

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



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