Ваша проблема недостаточно определена: с заданным набором точек вы можете получить много разных многоугольников, если не добавите ограничение, кроме «создать хороший вогнутый или выпуклый многоугольник».
И даже простой пример показывает, что:
представьте треугольник ABC, и пусть D будет центром этого треугольника, какой выход вы ожидаете для набора точек {A, B, C, D}?
- ABC, так как D внутри?
- или полигон ADBCA?
- или полигон ABDCA?
- или ABCDA многоугольник?
Теперь, если вы скажете: «Хорошо, D находится в центре, очевидно, что мы должны отказаться от D», пусть D будет все ближе и ближе, скажем, от сегмента AB. Когда вы решите, что лучшим выходом будет ABC или ADBCA?
Таким образом, вы должны добавить ограничения, чтобы иметь возможность построить алгоритм, поскольку, если вы не можете сами решить для приведенного выше примера {A, B, C, D}, как компьютер может это сделать? :-) Например, если вы называете AvgD средним расстоянием между точками, вы можете добавить ограничение, согласно которому ни один сегмент вашего внешнего многоугольника не должен быть длиннее 1,2 * AvgD (или, лучше, Alpha * AvgD, и вы попробуете свой алгоритм с другим альфа).
Чтобы решить вашу проблему, я бы сначала использовал классический алгоритм оболочки, чтобы получить внешний выпуклый многоугольник (который является детерминированным), а затем разбил бы сегменты, которые являются «слишком длинными» (с желаемым ограничением), помещая все больше и больше внутренних точек в контуре, пока все ограничения не будут в порядке. Что-то вроде «копания ям» в выпуклый многоугольник.
«Сломать» слишком длинный сегмент - это тоже то, что вы можете делать совершенно другими способами. Можно искать ближайшую не в наброске точку от средней точки сегмента. Другой вариант - выбрать точку с наименьшим радиусом для текущего сегмента ... Теперь, когда у вас есть новая точка, разбейте сегмент на две части, обновите список слишком длинных сегментов и делайте это снова, пока не закончите (или пока вы не достигнете «удовлетворительной» средней длины для слишком длинных сегментов или ...)
Удачи!