Генерация скошенного края для 2D многоугольника - PullRequest
4 голосов
/ 12 мая 2010

Я пытаюсь программно генерировать скошенные ребра для 2D-полигонов. Например, учитывая массив из 4 вершин, определяющих квадрат, я хочу сгенерировать что-то вроде этого:

 _________
|\ _____ /|
| |     | |
| |     | |
| |_____| |
|/_______\|

Но вычисление вершин внутренней формы сбивает меня с толку.

Простое создание копии исходной фигуры и ее уменьшение не будет работать в общем случае. (Представьте себе, что вы пытаетесь наклонить N-образный многоугольник таким образом.)

Мой алгоритм до сих пор включает анализ смежных ребер (тройки вершин; например, левый нижний, верхний левый и верхний правый вершины квадрата). Оттуда мне нужно найти угол между ними, а затем создать вершину где-нибудь вдоль этого угла, в зависимости от того, насколько я хочу, чтобы скос был.

И так как у меня мало математического фона, я застрял здесь. Как мне найти этот центральный угол? Или есть гораздо более простой способ решения этой проблемы?

Ответы [ 3 ]

2 голосов
/ 12 мая 2010

Я бы сделал что-то вроде этого:

для каждой стороны, сделайте копию и протолкните ее «внутрь» желаемой ширины скоса. («внутрь» по нормали вектора стороны). Как только вы это сделаете, найдите точки пересечения между новыми копиями (и копиями сторон, с которыми они ранее пересекались) и используйте их в качестве вершин для вашей внутренней формы. Для пересечений вам нужно будет рассмотреть истинные линии (а не отрезки), поскольку стороны в вогнутых областях должны будут расти.

Это ужасно сломается, если вы попытаетесь использовать его для фигуры с областями, которые в два раза меньше ширины скоса, но в противном случае все должно быть в порядке. (Я уверен, что вы могли бы добавить что-нибудь для этих случаев, но это другое обсуждение)

С другой стороны, если вы хотите, чтобы ширина скоса была относительно вершин, вы также можете просто толкнуть их «внутрь», используя тот же принцип. Оцените нормальный угол вершины путем усреднения нормалей стороны, с которой она соединяется.

1 голос
/ 16 мая 2010

Общий алгоритм довольно сложный. Операция, которую вы ищете, называется смещением многоугольника; если вы будете искать это, вы можете найти несколько указателей / статей и т. д.

Если вы работаете в C ++ или рядом с ним, вы можете попробовать CGAL .

0 голосов
/ 13 мая 2010

Допустим, ваша точка равна p1, а точки, создающие смежные ребра, это точки p2 и p3.Затем возьмите вектор из p1 в p2 и из p1 в p3.как -

v1 = p2 - p1
v2 = p3 - p1

Найдите угол между v1 и v2 и создайте свою точку.Вы можете найти угол используя this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...