Mihahail
๏̯͡๏
offline
Опыт:
17,766Активность: |
YellowStar:
Так работать не будет? |
13.08.2012, 18:05 | #21
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
вот ты упоротый, если бы просто разместил скрины ссылками, то наш сервер бы залил их к себе оттуда, а теперь скриншотер умер и скрины вместе с ним |
13.08.2012, 18:31 | #22
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
ScorpioT1000, под катом скрин. Да и кто ж знал что у них какой то вайп |
13.08.2012, 19:16 | #23
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
Я, видимо, один знал, что так будет. |
13.08.2012, 19:17 | #24
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Mihahail, и что ты собрался добавлять? У тебя есть только region неизвестной формы, есть точка лежащая рядом с нужной гранью и все, больше ничего нет. |
14.08.2012, 00:11 | #25
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Достать из региона его координаты можно только записав их изначально куда либо, одним словом хук на функцию создания региона и хук на функцию добавление ректа? Короче показывай свое решение, а мы посмотрим. |
17.08.2012, 00:28 | #26
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #27
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
alexprey, пффф я знал что так можно но даже не рассматривал такой метод Т_Т Это глупо и медленно. |
17.08.2012, 01:23 | #28
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Doc, другого варианта нет |
17.08.2012, 01:50 | #29
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #30
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
точка гарантированно лежит около нужной грани
другой алгоритм делает трассировку луча <_< Если хранить прямые, то поиск самой этой прямой будет идти намного дольше ибо формы очень сложные встречаются, нежели чем найти рект и проверить таким алгоритмом вот пример: зеленые не рассматриваются, т.к. имеют другое назночение. Остальные объеденяются по материалу (цвет) |
17.08.2012, 13:11 | #31
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|