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