Как найти 2 точки пересечения 2-х окружностей?
Известны координаты центров и радиусы 2-х окружностей.
Как найти 2 точки пересечения, если таковые есть?
Пример на С++ приветствуется 🙂
6 ответов
Я просто не силён в школьной программе. Кто-нибудь может помочь упростить следующее выражение?
2 * sqrt(R2^2 — (y — y2)^2) * (x2 — x1) + 2 * y * (y2 — y1) = R1^2 — R2^2 + y2^2 — (x2 — x1)^2 — y1^2
Нужно привести его к квадратному уровнению.
Здесь y — переменная, остальное константы.
Здесь:
X1, Y1, R1 — координаты центра и радиус первой окружности.
X2, Y2, R2 — координаты центра и радиус второй окружности.
MPoint P1 — 1-я точка пересечения
MPoint P2 — 2-я точка пересечения
MPoint Near1 — точка, рядом с которой должна находиться одна из точек пересечения
bool GetCirclesIntersect(float X1, float Y1, float R1, float X2, float Y2, float R2, MPoint &P1, MPoint &P2, MPoint Near1)
<
// Ищем пересечение ближайшее только к Near1.
float C1 = R1 * R1 — R2 * R2 + Y2 * Y2 — (X2 — X1) * (X2 — X1) — Y1 * Y1, // заменяющая константа.
C2 = X2 — X1, // заменяющая константа.
C3 = Y2 — Y1, // заменяющая константа.
a = -4 * C2 * C2 — 4 * C3 * C3,
b = 8 * C2 * C2 * Y2 + 4 * C1 * C3,
c = 4 * C2 * C2 * R2 * R2 — 4 * C2 * C2 * Y2 * Y2 — C1 * C1,
X_1_1 = 0, X_1_2 = 0, Y_1 = 0, X_2_1 = 0, X_2_2 = 0, Y_2 = 0,
Leng1, Leng2;
float sqrtVal = b * b — 4 * a * c;
if ( sqrtVal < 0 || a == 0 )
<
if ( X1 == X2 && Y1 == Y2 && R1 == R2 ) // Если окружности совпадают, то будем считать, что точка тут:
<
P1.x = X1 — R1;
P1.y = Y1;
P2.x = X1 + R1;
P2.y = Y1;
return true;
>
return false;
>
Y_1 = (-b + sqrt(sqrtVal)) / (2 * a);
Y_2 = (-b — sqrt(sqrtVal)) / (2 * a);
X_1_1 = X1 + sqrt(R1 * R1 — (Y_1 — Y1) * (Y_1 — Y1));
X_1_2 = X1 — sqrt(R1 * R1 — (Y_1 — Y1) * (Y_1 — Y1));
X_2_1 = X2 + sqrt(R2 * R2 — (Y_2 — Y2) * (Y_2 — Y2));
X_2_2 = X2 — sqrt(R2 * R2 — (Y_2 — Y2) * (Y_2 — Y2));
P1.y = Y_1;
P2.y = Y_2;
Leng1 = sqrt((Near1.x — X_1_1) * (Near1.x — X_1_1) + (Near1.y — Y_1) * (Near1.y — Y_1)),
Leng2 = sqrt((Near1.x — X_1_2) * (Near1.x — X_1_2) + (Near1.y — Y_1) * (Near1.y — Y_1));
if ( Leng1 < Leng2 )
P1.x = X_1_1;
else
P1.x = X_1_2;
Leng1 = sqrt((Near1.x — X_2_1) * (Near1.x — X_2_1) + (Near1.y — Y_2) * (Near1.y — Y_2)),
Leng2 = sqrt((Near1.x — X_2_2) * (Near1.x — X_2_2) + (Near1.y — Y_2) * (Near1.y — Y_2));
if ( Leng1 < Leng2 )
P2.x = X_2_1;
else
P2.x = X_2_2;
Как найти координаты точек пересечения двух окружностей в пространстве?
Имеется две окружности в пространстве, нормали к которым совпадают с двумя ортами косоугольной системы координат. Третий орт перпендикулярен к остальным. Уравнения окружностей задаются в эллиптических системах координат (
x1 = a * cosh(mu) * cos(nu1)
r1 = a * sinh(mu) * sin(nu1)
y1 = 0
z1 = 0
z2 = b * cosh(mu) * cos(nu2)
r2 = b * sinh(mu) * sin(nu2)
y2 = 0
x2 = 0
Имеется также угол пересечения первых двух ортов alpha.
Эти уравнения в трехмерном пространстве дают две окружности. Как можно найти координаты точек пересечения?
На рисунке представлено расположение поверхностей положения, получаемые в навигационной системе. Пересечение синей и зеленой поверхностей дают первую окружность. Пересечение красной и желтой — вторую. Учитывая, что поверхности получаются в результате определения навигационных параметров (mu, nu1, nu2) — считается что решение всегда существует, но не однозначно. Многозначность устраняется отделльно. 
Точки пересечения окружности
Как рассчитать точки пересечения двух окружностей. Я ожидал бы, что во всех случаях будут две, одна или никакие точки пересечения.
У меня есть координаты x и y центральной точки и радиус для каждого круга.
Ответ на python будет предпочтительным, но любой рабочий алгоритм будет приемлемым.
5 ответов
Пересечение двух кругов
- Если d> r 0 + r 1, то решений нет, кружки разделены.
- Если d 2 + h 2 = r 0 2 и b 2 + h 2 = r 1 2
Используя d = a + b, мы можем решить для a,
a = (r 0 2 — r 1 2 + d 2 ) / (2 d)
Легко показать, что это сводится к r 0, когда два круга касаются одной точки, то есть: d = r 0 + r 1 Решите для h, подставив a в первое уравнение, h 2 = r 0 2 — a 2
Так
P 2 = P 0 + a (P 1 — P 0) / д
И, наконец, P 3 = (x 3, y 3) в терминах P 0 = (x 0, y 0), P 1 = (x 1, y 1) и P 2 = (x 2, y 2), есть
х 3 = х 2 + — ч (у 1 — у 0) / д
y 3 = y 2 — + h (x 1 — x 0) / d