Как вы определяете, можете ли вы нарисовать круг вокруг множества точек, так что точки из другого набора не находятся внутри него?

Мне интересно об алгоритме, который возвращает true или false, говоря мне, можно ли нарисовать круг вокруг множества точек A, так что любая точка из множества точек B не находится внутри него, или наоборот (можно нарисовать окружность вокруг множества точек B, так что любая точка из множества точек A не находится внутри нее).

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

Я посмотрел алгоритм линейного времени Мегиддо для наименьший проблема окружного круга, но проблема в том, что она только рисует наименьший круг, а это значит, что он не работает в случае, когда вам нужен большой круг.

Здесь изображен то, что я имею в виду:

enter image description here

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

Ответы

Ответ 1

В этой статье мы уменьшаем обнаружение наличия или отсутствия двух наборов точек в плоскости могут быть разделены окружностью, до линейной отделимости точек в 3D:

О'Рурк, Джозеф, С. Рао Косараджу и Нимрод Мегиддо. "Вычисление круговой отделимости". Дискретная и вычислительная геометрия, 1.1 (1986): 105-113. (Загрузка PDF.)

Ответ 2

Попробуйте следующее: используйте стереографическую проекцию, чтобы проецировать свои очки на сферу. Затем вам нужно найти плоскость, проходящую через сферу, которая разрезает сферу, так что все точки в первом наборе находятся на одной стороне плоскости, а все точки второго набора находятся на другой стороне плоскости. Пересечение плоскости и сферы представляет собой круг, который возвращается обратно к кругу (или в редких случаях, к линии) на исходной плоскости. Результирующий круг на исходной плоскости обладает желаемыми свойствами.

Изменение задачи от одного вокруг кругов на плоскости до плоскости вокруг трехмерных объектов (линейных объектов) означает, что вы можете использовать идеи из линейного программирования и выпуклых множеств. Один из подходов заключается в использовании теоремы о гиперплоскости, чтобы показать, что вы можете найти плоскость, которая отделяет образы семейств точек тогда и только тогда, когда выпуклые оболочки изображений точек из А и В не пересекаются.

В аппаратном и программном обеспечении существует множество быстрых методов для определения того, пересекаются ли два выпуклых тела: проблема обнаружения конфликтов, важная в видеоиграх, например. Проделана большая работа по этой проблеме (см., Например, https://www.medien.ifi.lmu.de/lehre/ss10/ps/Ausarbeitung_Beispiel.pdf, которая утверждает, что алгоритм работает в O (n) времени ) и, безусловно, свободно доступен код.

Вкратце: сопоставьте свои точки (X, Y) на единичной сфере (x, y, z) с помощью стереографической проекции, заданной формулой

(x,y,z) = (2*X/(R^2+1), 2*Y/(R^2+1), (R^2-1)/(R^2+1)), R^2 = X^2+Y^2

Затем используйте алгоритм Гилберта-Джонсона-Кирти или какой-либо другой алгоритм обнаружения столкновений, чтобы определить, не выпукла ли выпуклая оболочка изображений точек в одном множестве из выпуклой оболочки изображений точек в другом множестве. Это отвечает на вопрос о существовании круга. Чтобы на самом деле найти круг, вам нужна разделительная плоскость между двумя выпуклыми телами, которую вы затем пересекаете с сферой, чтобы получить круг на сфере, который вы возвращаете обратно в плоскость, обращаясь к стереографической проекции.

Если я правильно понимаю, вышесказанное может быть выполнено в O (n) времени.

Ответ 3

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

Я думаю, что, начав с разреженной сетки и контролируя значения "наибольшее расстояние до любой красной точки", "наименьшее расстояние до любой зеленой точки", вы можете сделать некоторые перспективные области более тонкими и прекрасными (умное разделение), чтобы, наконец, поймать точку или область с требуемым свойством.

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

Ответ 4

Просто идея: возьмите все пары красных и зеленых точек.

Для каждой пары вычислите ортогональную осевую линию.

Эти точки на линии - это точки, где расстояние до зеленой и красной точки равно, поэтому круг с этим центром не имеет смысла.

Но область на той же стороне линии, где красная точка также является областью, где лежала потенциальная центральная точка.

Для каждой пары {красный, зеленый} вы получите линию и область, где будет центральная точка круга.

Если вы пересечете все области всех пар, вы получите все потенциальные центральные точки для всех кругов.

В вашем примере возьмите две зеленые и красную точку между ними. Вы получите две линии на расстоянии 1/2 слева и справа от вертикальной оси.

Возьмите левую зеленую точку и все красные, вы получите линии слева вверху справа, а центр круга будет над ними.

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

Для другого набора точек пересечение может привести к пустому множеству, что означает, что вы не можете нарисовать такой круг вокруг красных, не принимая некоторые зеленые.

Это всегда будет вычислять правильный результат, но я понятия не имею, насколько хороша производительность по сравнению с алгоритмом Джозефа. Может быть, он может взглянуть?