Пересечение между кругом и осью выровненного прямоугольника - PullRequest
1 голос
/ 11 марта 2011

Я пишу конвертер для данных 2D геометрии.Одним из элементов, которые я должен преобразовать, является дуга.В исходной системе дуга описывается двумя выровненными по оси прямоугольниками.Первый прямоугольник является ограничительной рамкой для круга, частью которого является дуга.Второй прямоугольник является ограничительной рамкой для самой дуги.Ограничение состоит в том, что ограничивающий прямоугольник дуги должен пересекать два ребра ограничивающего прямоугольника круга.Я знаю координаты верхней левой и нижней правой точек каждого прямоугольника.

Система целей описывает дугу следующим образом: Прямоугольник - это ограничивающий прямоугольник, вокруг круга, частью которого является дуга.Пока это так же, как указано выше.Тогда у меня есть две точки, обозначающие начальную и конечную точки дуги.Обе точки должны находиться точно на «краю» круга.

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

Мои мысли пока:

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

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

1 Ответ

1 голос
/ 11 марта 2011

Назовите координаты внешнего поля top, left, bottom и right. Центр и радиус тогда:

centre.x = (left + right)/2
centre.y = (top + bottom)/2
radius = (right - left)/2

Отсюда мы можем написать уравнение, которое должно выполняться для всех точек по периметру круга:

(x - centre.x) * (x - centre.x) + (y - centre.y) * (y - centre.y) = radius * radius

Координаты внутреннего поля дают вам возможные значения x и y. Подставляйте по одному и решайте как стандартное квадратное уравнение . Если существует реальное решение и соответствующая точка находится в пределах диапазона внутреннего блока, это точка. Учитывая ограничения исходных данных, вы должны обнаружить, что есть два момента - это ваш ответ.

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