2009-01-25 12 views
5

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

Простейший алгоритм, о котором я мог думать, проверяет один за другим, если они попадают в форму, образованную другими. Но это должен быть очень медленный алгоритм.

Я думал о том, чтобы выбрать один из краев (один из самых удаленных от источника на пример) и рассчитать самый длинный путь от этого старта ... должен получить путь к краю, правильно?

Любое предложение?

+0

Вы хотите, чтобы многоугольник _a_, который покрывал все точки, или вы хотите, чтобы многоугольник _smallest_ (с точки зрения области) покрывал все точки? – sykora

+0

@sykora, многоугольник, который покрывает все точки. graham scan кажется действительным. Благодарю. – fabiopedrosa

ответ

7

Трюк с полиэдральными алгоритмами выбирает тот, который соответствует вашему входу и вашему желаемому результату, поскольку существует много способов представлять многогранник, и преобразование между представлениями может быть дорогостоящим. В этом случае вы начинаете с точек и хотите заканчивать вершинами, поэтому алгоритм Graham scan для вычисления вершин convex hull должен делать трюк, хотя может потребоваться некоторое усилие для его распространения за 2-мерный случай. Это O (n log n) в количестве входных вершин.

+0

Сканирование Graham в основном дает вам выпуклый корпус. – shoosh

6

Я не знаю, какой лучший алгоритм найти этот многоугольник, но многоугольник, который вы ищете, называется «выпуклый корпус».

Ищет это, вы должны найти соответствующий алгоритм.

+0

Я не думаю, что он ищет выпуклую оболочку, так как ему нужны края многоугольника, образованного его вершинами. Выпуклая оболочка исключала бы даже то, что он мог захотеть. – sykora

+0

«некоторые из них являются избыточными (внутри формы), и я хочу их удалить». – Timbo

+0

Я не ищу, чтобы уменьшить края ... Я ищу в построении многоугольника из коллекции вершин, некоторые из которых являются избыточными. – fabiopedrosa

4

The Convex Hull является одной из наиболее изученных проблем вычислительной геометрии. Graham Scan является одним из простых convex hull algorithms, но, конечно, не единственным. The Gift-wrapping Algorithm, также называемый Марсом Джарвиса, является самым простым, о котором я знаю. The Stony Brook algorithm repository имеет несколько реализаций выпуклых алгоритмов корпуса в C и C++. Geometry in Action показывает в основном применения выпуклых оболочек. Вот коллекция из low-dimensional и arbitrary-dimensional программ расчета выпуклых корпусов.