Обрезка вогнутой многоугольной линии без вырожденных краев - PullRequest
2 голосов
/ 07 октября 2010

В последние дни я искал и исследовал Интернет, чтобы найти подходящий метод для моей проблемы.

Проблема:

Обрезать вогнутый многоугольник против бесконечной линии без направления (На самом деле многоугольник против плоскости в 3d, но проблема схожа, я думаю). В настоящее время я использую Сазерленда-Ходжмана, но получающиеся в результате многоугольники иногда содержат части с нулевой площадью, созданные из вырожденных ребер, и также не поддерживают многоугольники, содержащие отверстия.

Лучший алгоритм, который я нашел, который мог бы решить мою проблему - это алгоритм Вейлера-Атертона, но он предназначен для обрезки многоугольника с ребрами по часовой стрелке, и все, что у меня есть, - это бесконечная линия (в 3d плоскости), в которой отсутствует информация о направлении. 1007 *

Вопрос:

Существует ли алгоритм обрезки вогнутого многоугольника, который соответствует моим потребностям, или у кого-нибудь есть предложения о том, как изменить алгоритм Вейлера-Атертона для работы в этом случае? Существуют веб-страницы, которые предполагают, что его можно обобщить для поддержки большего числа случаев, но я не могу понять это.

// Отношения Айкен

Ответы [ 2 ]

3 голосов
/ 09 октября 2010

Нашел подходящий алгоритм в Graphic Gems V, который решает мою проблему.Если у кого-то есть такая же проблема, это ссылка:

Гласснер А., «Обрезка вогнутого многоугольника», в Graphics Gems V, А. Паэт, изд., Academic Press, Cambridge, 1995

1 голос
/ 07 октября 2010

Вы можете использовать обрезку полигонов *, чтобы решить эту проблему путем преобразования линии в обрезной многоугольник. Предполагая, что вы не обрезаете в почти горизонтальной плоскости, просто убедитесь, что критический (ограничивающий) край ограничивающего многоугольника немного больше, чем вертикальные размеры рассматриваемого многоугольника (то есть край проходит над и под рассматриваемым многоугольником). Если обрезать в почти горизонтальной плоскости, убедитесь, что критический край немного шире объекта.

* например Clipper - http://sourceforge.net/projects/polyclipping/

Раскрытие информации: я являюсь автором Clipper, поэтому существует вероятность личного уклона.

...