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

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

Ответ
 
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
[TASK]Определение нормали
Пол года назад решал эту задачку, интересно посмотреть как её решите вы

Задача

Дана область (region), а так же точка в которой требуется посчитать нормаль границы региона (гарантированно, что точка находится рядом с нужной границей региона). Регион имеет произвольную форму, все углы которого прямые. Так же регион может иметь разрыв.
» Alt формулировка
Нормаль самого региона в плоскости XY. Регион - это совокупность ректов. И представляет себе многоугольный прямоугольник. Надо лишь найти нормаль указанной грани этой фигуры. Грань указывается, как точка в плоскости, лежащая рядом с этой гранью.
За основу можно взять этот код:
function GetRegionNormal takes region targetRegion, real pointX, real pointY returns real
	return 0.0
endfunction
Функция должна возвращать угол нормали в радианах.
По сколько уже много времени прошло, и ни у кого нет идей, то вот мое решение
» решение
((код 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
Doc

offline
Опыт: 63,163
Активность:
  1. Что такое разрыв?
  2. Регион может лежать на очень неровной поверхности, с мелкими холмиками например. Каким образом тогда определить? И вообще зачем регион, может нужен подсчет нормали к ландшафту? Не понимаю короче.
Старый 11.08.2012, 19:41
adic3x

offline
Опыт: 108,439
Активность:
Я один не понял, как из региона получать какие либо координаты? Или автор перепутал region и rect?
Старый 11.08.2012, 19:47
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
ADOLF, именно регион
Doc, разрыв, тоесть 2 ректа не объеденных. Как известно регион складывается из ректов.
Нормаль самого региона. Ланд не влияет на нормаль, вектор 2х мерный должен получиться.
что такое нормаль региона
что такое регион с разрывом

Отредактировано alexprey, 11.08.2012 в 20:20.
Старый 11.08.2012, 20:14
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Глупый вопрос, но зачем и где это будет использоваться?
Старый 11.08.2012, 20:55
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Xipxop,
  1. уже используется
2)
Пол года назад решал эту задачку, интересно посмотреть как её решите вы
Старый 11.08.2012, 21:09
Arti

offline
Опыт: 11,196
Активность:
Можно вопрос: тебе типа надо что бы точка двигалась по краю ректа? не бросайте только в меня помидорами
Старый 12.08.2012, 03:17
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Arti, задача помойму конкретная - найти нормаль, и все. А применять уже можно по разному
Старый 12.08.2012, 12:09
Doc

offline
Опыт: 63,163
Активность:
Ага найти нормаль. А от чего непонятно.
Старый 12.08.2012, 14:19
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, да как же не понятно. Нормаль самого региона в плоскости XY. Регион - это совокупность ректов. И представялет себе многоугольный прямоугольник. Надо лишь найти нормаль указанной грани этой фигуры. Грань указывается, как точка в плоскости, лежащая рядом с этой гранью.
alexprey добавил:
Ну вот же
Старый 12.08.2012, 15:00
Doc

offline
Опыт: 63,163
Активность:
Только ректы из региона никак не получить, ага.
Старый 12.08.2012, 15:26
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, можно, я же сделал
Старый 12.08.2012, 15:50
Doc

offline
Опыт: 63,163
Активность:
Старый 12.08.2012, 15:52
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Doc, думай...
Старый 12.08.2012, 15:55
YellowStar
poon
offline
Опыт: 15,144
Активность:
GetMaxX < x and GetMinX > x and GetMaxY < y and GetMinY > y

оно
Старый 13.08.2012, 13:02
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
YellowStar, и где тут угол? Или хотя бы вектор? И работаем с регионом, а не ректом
Старый 13.08.2012, 13:05
YellowStar
poon
offline
Опыт: 15,144
Активность:
RegionAddRect

бери две точки, делай вектор. в чем проблема?
Старый 13.08.2012, 16:16
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
YellowStar, приведи конкретный код, который определит нормаль грани региона. А пока что мне не ясен твой ход мыслей
Старый 13.08.2012, 17:02
Mihahail
๏̯͡๏
offline
Опыт: 17,766
Активность:
Грань имеет толщину, или указывается точная координата равная одному из зачений GetMax(Min)X(Y) ?
А так, если мы знаем, какие координаты соответствуют каким вершинам, то всё просто - это угол между двумя точками(соседними вершинами, которые мы отобрали тем или иным образом) +- 90 градусов, плюс или минус - в зависимости от порядка обхода вершин прямоугольника.
Хотя можно ещё математическое решение, оно наверно лучше - написать функцию, возвращающую угол в зависимости от координаты. Например, можно вычислять угол между данной точкой и центром области, затем "округлять" до 0/90/180/270, что не сложно.
Старый 13.08.2012, 17:34
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Mihahail, координат вершин нет. И у нас region, а не rect.
Старый 13.08.2012, 18:01
Ответ

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

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

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

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



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