Простой способ - сначала найти выпуклую оболочку точек, что можно сделать за O (n log n) разными способами. [Мне нравится сканирование Грэма (см. анимация ), но алгоритм инкрементный также популярен, как и другие , хотя некоторые принимают больше времени .]
Затем вы можете найти самую дальнюю пару (диаметр), начав с любых двух точек (скажем, x и y) на выпуклой оболочке, двигаясь по часовой стрелке до тех пор, пока она не окажется дальше от x, затем двигаясь по x, снова перемещаясь по y и т. Д. Вы можете доказать, что все это занимает всего O (n) времени (амортизируется). Так что O (n log n) + O (n) = O (n log n) всего и, возможно, O (nh), если вместо этого вы используете упаковку подарков в качестве алгоритма выпуклой оболочки. Эта идея называется вращающимися суппортами , как вы упомянули.
Вот код Дэвида Эппштейна (исследователь вычислительной геометрии; см. Также его Алгоритмы Python и структуры данных для дальнейшего использования).
Все это не очень сложно для кодирования (должно быть не более ста строк; в коде Python выше - менее 50), но прежде чем вы это сделаете, вы должны сначала подумать, действительно ли вам это нужно. Если, как вы говорите, у вас есть только «тысячи точек», тогда тривиальный алгоритм O (n ^ 2) (который сравнивает все пары) будет запущен менее чем за секунду на любом приемлемом языке программирования. Даже с миллионом очков это не должно занять больше часа. : -)
Вы должны выбрать самый простой алгоритм, который работает.