Решение без ограничений - установить
P n = Σ i = 1 n-1 P i / (n-1)
(С ограничениями труднее; у меня есть идея, как это сделать, см. Мой совет ниже)
Доказательство
Мы стремимся свести к минимуму
Σ i = 1 n-1 || P n - P i || 2
= Σ i = 1 n-1 (P n - P i ) · (P n - P я )
= Σ i = 1 n-1 P n · P n - 2P n · P i + P i · P i
= Σ i = 1 n-1 P n · P n - Σ i = 1 n-1 2P n · P i + Σ i = 1 n-1 P i · P я
= (n-1) P n · P n - 2P n · Σ i = 1 n-1 P i + Σ i = 1 n-1 P i · P i
Поскольку мы находимся в 2d, это квадратное уравнение 2-переменных; мы можем взять частные производные, чтобы найти критическую точку (и, следовательно, минимум):
f = (n-1) P nx 2 + (n-1) P ny 2 - 2P nx Σ i = 1 n-1 P ix - 2P ny Σ i = 1 n-1 P iy + Σ i = 1 n-1 P i · P i (постоянный, поэтому не имеет значения для производной)
D x f = 2 (n-1) P nx - 2Σ i = 1 n-1 P ix
D y f = 2 (n-1) P ny - 2Σ i = 1 n-1 P iy
Если установить последние две производные равными 0, мы получим результат.
Это известно как барицентрическая комбинация (или барицентр , или центр масс или что у вас есть). Хотя это не отвечает на ваш вопрос, последнее уравнение должно помочь:
k = (n-1) P n · P n - 2P n · Σ i = 1 n-1 P i + Σ i = 1 n-1 P i · P i
Где k - некоторая постоянная. Если бы мы нарисовали это на плоскости, то для некоторого k мы получили бы одну точку: P n , наш барицентр. При увеличении k мы получим график окружности с центром в P n - все точки на этом круге имеют одинаковое значение суммы квадратов. При увеличении k это значение суммы квадратов становится все больше и больше.
Если бы мы собирались решить это математически и тщательно, мы бы хотели найти наименьшее k, которое создает круг, имеющий точку, которая удовлетворяет всем ограничениям. Я не знаю, как мы это сделаем.
Чтобы оценить ответ в программе, я продолжал бы создавать все большие и большие круги вокруг нашего барицентра, пока мы не найдем тот, который работает. Чтобы определить, работает ли круг: найдите все точки столкновения нашего барицентрического круга со всеми другими кругами, созданными ограничениями, и везде, где наш круг сталкивается с другим, создайте точку разреза. Со всеми нашими точками среза мы разделили наш круг на дуги (не более 2n-1 дуг, если только наш центр не является точно одной из точек) - все точки на каждой дуге будут иметь одинаковый статус " удовлетворяет ограничениям или нет ", поэтому выберите любую точку на дуге, чтобы проверить ее. Сделайте это для всех дуг в круге, и если ни одна из них не удовлетворяет его, сделайте круг немного больше.
Мы могли бы сделать это немного лучше, заметив, что увеличение размера круга ни к чему не приведет, если мы все еще сталкиваемся одинаковое количество раз со всеми одинаковыми кругами.