Исходник программы, показывающей пример рисования пересекающихся окружностей по точкам пересечения.
Принцип рисования окружностей
P1 и P2 - центры окружностей, расположенные в точках (x1, y1) и (x2, y2). dx и dy - смещения x и y точки P2 от точки P1.
dx = x2-x1
dy = y2-y1
Пифагор говорит нам, что расстояние между P1 и P2 равно d = sqrt (dx * dx + dy * dy). Если d меньше суммы радиусов кругов r1 + r2, то круги могут пересекаться. (По-прежнему существует вероятность того, что P2 так близко к P1, что полностью содержится внутри и все еще не пересекается. Это верно тогда и только тогда, когда d <| r1-r2 |. Представьте, что окружности концентрические, имеют один и тот же центр. Тогда расстояние от края внутреннего круга до внешнего является абсолютным значением разности радиусов. Если d становится больше, чем это расстояние, круги снова пересекаются, пока не превысит сумму радиусов.
Предполагая, что круги пересекаются, мы хотим найти координаты точек или точек пересечения, IP1 и IP2 (для ясности я оставил метку IP2 на диаграмме выше).
Итак, у нас есть достаточно информации, чтобы найти a и h. Рассматривая прямоугольный треугольник IP1P1P3, мы можем записать cos (a) = a / r1, где a - угол в точке P1.
Также, рассматривая треугольник P1P2IP1, мы можем применить «закон косинуса», чтобы получить другое выражение для cos (a).
Закон косинусов: Cos (a) = (r12 + d2-r22) / (2r1d)
Следовательно, cos (a) = a / r1 = (r12 + d2-r22) / (2r1d) и умножение обеих частей на r1 оставляет а = (r12 - r22 + d2) / (2 d)
Если круги касаются одной точки, вы можете подставить d = r1 + r2 в приведенное выше уравнение и доказать, что a = r1 в единственной точке пересечения.
Как только мы узнаем a, мы можем найти значение h как h = sqrt (r12 - a2).
Уф, еще один важный шаг, чтобы найти фактические координаты точек пересечения. Хитрость здесь состоит в том, чтобы концептуально повернуть точку P3 вниз так, чтобы она лежала на оси x. Мы еще не знаем, что это за угол, но мы назовем его -beta, -b. Тогда координаты P3 относительно P1 будут (a, h). Теперь, если мы повернем через точку (a, h) назад на угол b, то мы окажемся в верхней точке пересечения. Другая точка, если она существует, будет результатом поворота точки (a, -h).
Итак, если мы найдем двумерные уравнения вращения (на этом сайте, например, мы найдем уравнения вращения в точке на заданный угол).
x '= x cos b - y sin b
y '= y cos b + x sin b
Чтобы применить поворот вверх на b, нам нужно его значение или, по крайней мере, значения для sin (b) и cos (b). Они определяются треугольником, образованным сторонами d, dx и dy на приведенной выше диаграмме, поэтому Sin (b) = dy / d и Cos (b) = dx / d. И последнее соображение, поскольку приведенные выше уравнения предполагают, что мы вращаемся вокруг начала координат ((0,0), а на самом деле мы вращаемся вокруг точки P1 в точке (x1, y1), нам нужно перевести окончательные координаты обратно, добавив (x1, y1 ) к повернутым значениям.
Таким образом, наши точки пересечения: IP1.x = x1 + a * dx / d - h * dy / d и IP1.y = y1 + h * dx / d + a * dy / d.
или же
IP1.x = x1 + (a * dx - h * dy) / d и, IP1.y = y1 + (h * dx + a * dy) / d
и для нижнего пересечения (a, -h), повернутого на b
IP2.x = x1 + (a * dx + h * dy) / d и IP2.y = y1 + (-h * dx + a * dy) / d
Как говорится на латыни: «Q.E.D.», что в переводе означает «Мы прибыли в пункт назначения».