alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
[TASK]Определение нормали
Пол года назад решал эту задачку, интересно посмотреть как её решите вы
ЗадачаДана область (region), а так же точка в которой требуется посчитать нормаль границы региона (гарантированно, что точка находится рядом с нужной границей региона). Регион имеет произвольную форму, все углы которого прямые. Так же регион может иметь разрыв.
» Alt формулировка
Нормаль самого региона в плоскости XY. Регион - это совокупность ректов. И представляет себе многоугольный прямоугольник. Надо лишь найти нормаль указанной грани этой фигуры. Грань указывается, как точка в плоскости, лежащая рядом с этой гранью.
» Задача на картинке
За основу можно взять этот код:
Функция должна возвращать угол нормали в радианах.
По сколько уже много времени прошло, и ни у кого нет идей, то вот мое решение
» решение
((код 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 для определения нормали поверхности, на котором будет открыт портал и очень активно используется в физике для определения угла наклона поверхности Отредактировано alexprey, 17.08.2012 в 00:36. |
11.08.2012, 19:09 | #1
+0/−3
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
|
11.08.2012, 19:41 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Я один не понял, как из региона получать какие либо координаты? Или автор перепутал region и rect? |
11.08.2012, 19:47 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
ADOLF, именно регион Doc, разрыв, тоесть 2 ректа не объеденных. Как известно регион складывается из ректов. Нормаль самого региона. Ланд не влияет на нормаль, вектор 2х мерный должен получиться. что такое нормаль региона что такое регион с разрывом Отредактировано alexprey, 11.08.2012 в 20:20. |
11.08.2012, 20:14 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Xipxop
Круче варика, только c++!
offline
Опыт:
7,646Активность: |
Глупый вопрос, но зачем и где это будет использоваться? |
11.08.2012, 20:55 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
|
11.08.2012, 21:09 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Arti
offline
Опыт:
11,196Активность: |
Можно вопрос: тебе типа надо что бы точка двигалась по краю ректа? не бросайте только в меня помидорами |
12.08.2012, 03:17 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Arti, задача помойму конкретная - найти нормаль, и все. А применять уже можно по разному |
12.08.2012, 12:09 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Ага найти нормаль. А от чего непонятно. |
12.08.2012, 14:19 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Doc, да как же не понятно. Нормаль самого региона в плоскости XY. Регион - это совокупность ректов. И представялет себе многоугольный прямоугольник. Надо лишь найти нормаль указанной грани этой фигуры. Грань указывается, как точка в плоскости, лежащая рядом с этой гранью.
alexprey добавил:
Ну вот же |
12.08.2012, 15:00 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Только ректы из региона никак не получить, ага. |
12.08.2012, 15:26 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Doc, можно, я же сделал |
12.08.2012, 15:50 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
|
12.08.2012, 15:52 | #13
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Doc, думай... |
12.08.2012, 15:55 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
GetMaxX < x and GetMinX > x and GetMaxY < y and GetMinY > y
оно |
13.08.2012, 13:02 | #15
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
YellowStar, и где тут угол? Или хотя бы вектор? И работаем с регионом, а не ректом |
13.08.2012, 13:05 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
RegionAddRect
бери две точки, делай вектор. в чем проблема? |
13.08.2012, 16:16 | #17
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
YellowStar, приведи конкретный код, который определит нормаль грани региона. А пока что мне не ясен твой ход мыслей |
13.08.2012, 17:02 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mihahail
๏̯͡๏
offline
Опыт:
17,766Активность: |
Грань имеет толщину, или указывается точная координата равная одному из зачений GetMax(Min)X(Y) ?
А так, если мы знаем, какие координаты соответствуют каким вершинам, то всё просто - это угол между двумя точками(соседними вершинами, которые мы отобрали тем или иным образом) +- 90 градусов, плюс или минус - в зависимости от порядка обхода вершин прямоугольника.
Хотя можно ещё математическое решение, оно наверно лучше - написать функцию, возвращающую угол в зависимости от координаты. Например, можно вычислять угол между данной точкой и центром области, затем "округлять" до 0/90/180/270, что не сложно. |
13.08.2012, 17:34 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Mihahail, координат вершин нет. И у нас region, а не rect. |
13.08.2012, 18:01 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|