Я работаю над небольшой библиотекой игровой геометрии, и среди множества других методов я хочу найти середину пересечения между кругом и прямоугольником. Тем не менее, мне трудно думать о быстром алгоритме для этого. Кто-нибудь знает хороший алгоритм для этого?
Я готов пожертвовать идеальной точностью, если это означает, что алгоритм будет значительно быстрее.
Основной способ представления каждой фигуры:
круг
- число с плавающей запятой x, y (в центре)
- float r (радиус)
Прямоугольник
- float x, y (в центре)
- float w, h (значения ширины и высоты, они представляют x и y расстояние от центра до соответствующего края).
EDIT:
Поскольку, как представляется, существует путаница в отношении того, что я имею в виду под "средней точкой", позвольте мне уточнить:
Учитывая, что круг и прямоугольник пересекаются, существует область, созданная их перекрытием. Я хочу определить географический центр этой области (либо точно, либо определить приблизительный).
Пример: http://en.wikipedia.org/wiki/Centroid
РЕДАКТИРОВАТЬ # 2:
Вы, ребята, дали мне некоторые идеи, позвольте мне поработать над некоторыми из них, и я вернусь к вам.
Заключительные мысли:
Я пометил ответ Гарета как принятый, потому что он дал мне идеи того, с чем я в конечном итоге согласился, но моя окончательная реализация отличается от его, поэтому я объясню это здесь.
Я придумал два основных способа сделать это: один, который был бы совершенно точным (но требовал более сложного программирования и больше математики), и другой, более простой / быстрый способ, который был довольно близок все время. В итоге я выбрал последнее, но вот два метода:
Метод 1: Фрагментация формы:
По сути, идея состоит в том, чтобы разбить перекрывающуюся область на отдельные сегменты, для которых можно легко вычислить их среднюю точку и площадь, а затем взять средневзвешенное значение для всего результата.
Пример, показанный здесь, имел три части: центральный прямоугольник, занимающий большую часть области, и два изогнутых сегмента для краев круга.
Метод 2: Интерполяция строки
Во-первых, вам нужно вычислить точку в прямоугольнике, которая будет базовой точкой. Это должна быть точка, которую легко вычислить, и она совпадает. Для этой точки я использую среднее значение всех пересечений ребер окружности и прямоугольника (если пересечений ребер не существует, я по умолчанию указываю местоположение кружка, поскольку это означает, что одна фигура содержится в другой).
Рассчитать линию между центром круга и этой точкой. Затем вычислите сегмент, который находится в перекрывающейся области. Середина этой области считается средней точкой этого отрезка.
Этот метод является неточным, но всегда создает точку в обоих объектах, и результирующая точка, как правило, находится близко к середине (поэтому она "выглядит" хорошо для случайного глаза). Это также намного проще и быстрее, поэтому я пошел с этим.