struct MPoint
{
float x,
y;
};
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;
return true;
}
Как найти 2 точки пересечения 2-х окружностей?
Как найти 2 точки пересечения, если таковые есть?
Пример на С++ приветствуется :)
окружность описывается уравнением:
(x – a)^2 + (y – b)^2 = R2, где a и b – координаты центра A окружности, R - радиус
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 - переменная, остальное константы.
x = r1 * cos(phi) + x1 = r2 * cos(phi) + x2;
y = r1 * sin(phi) + y1 = r2 * sin(phi) + y2;
Спасибо, уже разобрался вспомнив школьную программу.
Представленный вариант с полярными координатами не действует
X1, Y1, R1 - координаты центра и радиус первой окружности.
X2, Y2, R2 - координаты центра и радиус второй окружности.
MPoint P1 - 1-я точка пересечения
MPoint P2 - 2-я точка пересечения
MPoint Near1 - точка, рядом с которой должна находиться одна из точек пересечения
Код: