Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как найти 2 точки пересечения 2-х окружностей?

9.5K
05 ноября 2008 года
ROLpogo
80 / / 22.08.2006
Известны координаты центров и радиусы 2-х окружностей.
Как найти 2 точки пересечения, если таковые есть?

Пример на С++ приветствуется :)
11
05 ноября 2008 года
oxotnik333
2.9K / / 03.08.2007
собственно вопрос из школьной геометрии + математика решения системы уравнений.
окружность описывается уравнением:
(x – a)^2 + (y – b)^2 = R2, где a и b – координаты центра A окружности, R - радиус
9.5K
05 ноября 2008 года
ROLpogo
80 / / 22.08.2006
Я просто не силён в школьной программе. Кто-нибудь может помочь упростить следующее выражение?

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 - переменная, остальное константы.
341
07 ноября 2008 года
Der Meister
874 / / 21.12.2007
Мужик, считай в полярных координатах:
x = r1 * cos(phi) + x1 = r2 * cos(phi) + x2;
y = r1 * sin(phi) + y1 = r2 * sin(phi) + y2;
9.5K
07 ноября 2008 года
ROLpogo
80 / / 22.08.2006
Спасибо, уже разобрался вспомнив школьную программу.
49K
23 апреля 2009 года
Бусь
1 / / 23.04.2009
Расскажите и мне, пожалуйста.Такая же проблема возникла. Не могу решить.
Представленный вариант с полярными координатами не действует
9.5K
24 апреля 2009 года
ROLpogo
80 / / 22.08.2006
Здесь:
X1, Y1, R1 - координаты центра и радиус первой окружности.
X2, Y2, R2 - координаты центра и радиус второй окружности.
MPoint P1 - 1-я точка пересечения
MPoint P2 - 2-я точка пересечения
MPoint Near1 - точка, рядом с которой должна находиться одна из точек пересечения

Код:
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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог