Как определить пересекаются ли окружности
Перейти к содержимому

Как определить пересекаются ли окружности

  • автор:

Как определить пересекаются ли окружности

Говорят, что две окружности пересекаются, если они имеют две общие точки.

Пусть \(R_1\) и \(R_2\) – радиусы окружностей \(\omega_1\) и \(\omega_2\) и \(d\) – расстояние между их центрами. Окружности \(\omega_1\) и \(\omega_2\) пересекаются тогда и только тогда, когда числа \(R_1\), \(R_2\), \(d \) являются длинами сторон некоторого треугольника, т. е. удовлетворяют всем неравенствам треугольника: $$ R_1+R_2 > d, \, R_1+d > R_2, \, R_2+d > R_1. $$

Касающиеся окружности

Говорят, что две окружности касаются, если они имеют одну общую точку. Окружности касаются внутренним образом, если одна из них расположена внутри другой. Окружности касаются внешним образом, если они расположены вне друг друга.

Пусть \(R_1\) и \(R_2\) – радиусы окружностей \(\omega_1\) и \(\omega_2\) и \(d\) – расстояние между их центрами. Окружности \(\omega_1\) и \(\omega_2\) касаются внешним образом тогда и только тогда, когда \(R_1+R_2=d\), внутренним образом – когда \(\left|R_1-R_2\right|=d\).

Как определить пересечение прямоугольника с кругом?

См. сабж — необходимы вычисления в 2D; или подойдет определение пересечения линии с кругом в 2D.

#1
12:39, 2 сен 2004

Измеряешь расстояние от вершины до центра круга. Если оно меньше радиуса круга, то произошло пересечение. Расстояние можно измерять по формуле:
2D — sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)), где sqrt корень.
3D — sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)).

#2
12:45, 2 сен 2004

Логичнее сравнивать не корни, а квадраты, то есть сравнивать с квадратом радиуса

#3
12:48, 2 сен 2004

На самом деле, надо проверять еще точку ценрта круга на попадание в прямоугольник, если круг, например, полностью входит в прямоугольник.

#4
12:55, 2 сен 2004

Нужно еще проверять расстояния до сторон — круг может не содержать вершины и не содержаться в прямоугольнике, но, тем не менеее, пересекать его.

#5
12:58, 2 сен 2004

Это как. Круг не содежит вершин, но пересекает прямоугольник?!

#6
13:09, 2 сен 2004

DooM
Представь квадрат со стороной 2 с центром в начале координат. Рассмотри круг радиуса 1 с координатами (0, 1.99).

#7
13:19, 2 сен 2004

Сенкс за ответы. Но осталось 2 ситуации — про которую сказал IPSer и как определить попали ли внутрь круга прямоугольник или линия?

#8
13:37, 2 сен 2004

Упс, 2 ситуацию оказалось просто решить — сегодня я вобще что-то торможу.. Но как быть с ситуацией, когда круг пересекает произвольная линия и при этом в круге ни одной точки этой линии не содержится?

  • Gregory_krovosos
  • Новичок

#9
13:43, 2 сен 2004

Держи пересечения многоугольника с окружностью. Код надо править, но он выдран из реальной работающей проги. Если чего непонятно — отвечу.
Соотв-но если тебе нужен пр-ник, то там где обходятся стороны мн-ка тебе соот-но нужно обойти свой пр-ник.

// пересекает ли окружность радиуса R c центром в x,y
// отрезок (A,B) длина которого есть L
bool CircleIntersects(double x, double y, double R,
double L, DOT2D* A, DOT2D* B, DOT2D* Z)
<
// единичный вектор отрезка AB
double Xv = (B->x — A->x) / L;
double Yv = (B->y — A->y) / L;
double Xd = (A->x — x);
double Yd = (A->y — y);
double b = 2 * (Xd * Xv + Yd * Yv);
double c = Xd * Xd + Yd * Yd — R * R;
double c4 = c + c; c4 += c4;
double D = b * b — c4;
if (D < 0) return false; // нет корней, нет пересечений

double orient(DOT2D* a, DOT2D* b, DOT2D* c)
<
return (a->x — c->x)*(b->y — c->y) — (a->y — c->y) * (b->x — c->x);
>

// знак полуплоскости
bool semi_sign(DOT2D* a, DOT2D* b, DOT2D* c)
<
return orient(a,b,c) >= 0;
>

bool Intersects()
<
. в Z заносится точка пересечения .
// one=окружность
// two=мн-ник
_ASSERT(one->kind == stCircle);
_ASSERT(two->kind == stPoly);

// центр окружности
DOT2D center(one->xc, one->yc);
DOT2D indot(two->xc, two->yc);
DOT2D* A = two->rect_poly->first;
// кол-во сторон, для которых центр окружности лежит внутри мн-ка
int inside = 0;
int i = 0;
// обходим все стороны мн-ка
while (A)
<
DOT2D* B = A->next;
if (B == 0) B = two->rect_poly->first;
// AB = очередная сторона мн-ка, проверяем где лежит центр окружности
if (semi_sign(A, B, &indot) == semi_sign(A, B, &center)) inside++;
// проверяем пересечение окружности с AB
if (CircleIntersects(center.x, center.y, one->R, two->lengths, A, B, Z))
return true;
A = A->next;
i++;
>

// если центр окружности лежит внутри мн-ка, то inside д.б. равно кол-ву сторон мн-ка
if (inside == two->rect_poly->n)
<
if (Z)
<
Z->x = (one->xc + two->xc)/2;
Z->y = (one->yc + two->yc)/2;
>
return true;

// если центр мн-ка лежит внутри окр-ти, то есть пересечение
if (distance2DSqr(center.x, center.y, two->xc, two->yc) R * one->R)
<
if (Z)
<
Z->x = (one->xc + two->xc)/2;
Z->y = (one->yc + two->yc)/2;
>
return true;
>
else
return false;
>

Окружность. Относительное взаимоположение окружностей.

Если две окружности имеют только одну общую точку, то говорят, что они касаются.

Если же две окружности имеют две общие точки, то говорят, что они пересекаются.

Трех общих точек две не сливающиеся окружности иметь не могут, потому, что в противном случае через три точки можно было бы провести две различные окружности, что невозможно.

Будем называть линией центров прямую, проходящую через центры двух окружностей (например, прямую OO1).

Теорема.

Если две окружности имеют общую точку по одну сторону от линии центров, то они имеют общую точку и по другую сторону от этой линии, т.е. такие окружности пересекаются.

Пусть окружности O и O1 имеют общую точку A, лежащую вне линии центров OO1. Требуется доказать, что эти окружности имеют еще общую точку по другую сторону от прямой OO1.

Опустим из A на прямую OO1 перпендикуляр AB и продолжим его на расстояние BA1, равное AB. Докажем теперь, что точка A1 принадлежит обеим окружностям. Из построения видно, что точки O и O1 лежат на перпендикуляре, проведенном к отрезку AA1 через его середину. Из этого следует, что точка O одинаково удалена от A и A1. То же можно сказать и о точке O1. Значит обе окружности, при продолжении их, пройдут через A1.Таким образом, окружности имеют две общие точки : A (по условию) и A1 (по доказанному). Следовательно, они пересекаются.

Следствие.

Общая хорда (AA1) двух пересекающихся окружностей перпендикулярна к линии центров и делится ею пополам.

Теоремы.

1. Если две окружности имеют общую точку на линии их центров или на ее продолжении, то они касаются.

2. Обратно: если две окружности касаются, то общая их точка лежит на линии центров или на ее продолжении.

Признаки различных случаев относительного положения окружностей.

Пусть имеем две окружности с центрами O и O1, радиусами R и R1 и расстоянием между центрами d.

Эти окружности могут находиться в следующих 5-ти относительных положениях:

Относительное взаимоположение окружностей.

1. Окружности лежат одна вне другой, не касаясь. В этом случае, очевидно, d > R + R1 .

2. Окружности имеют внешнее касание. Тогда d = R + R1, так как точка касания лежит на линии центров O O1.

3. Окружности пересекаются. Тогда d < R + R1 и d > R + R1, потому что в треугольнике OAO1 сторона OO1 меньше суммы, но больше разности двух других сторон.

4. Окружности имеют внутреннее касание. В этом случае в d = R — R1, потому что точка касания лежит на продолжении линии OO1.

5. Одна окружность лежит внутри другой, не касаясь. Тогда, очевидно,

d < R - R1 (в частном случае в может равняться нулю, т.е. окружности могут иметь общий центр. Такие окружности называются концентрическими).

Обратные предложения.

Так как различные случаи расположения окружностей сопровождаются различными соотношениями между расстоянием центров и величиной радиусов, то обратные предложения должны быть верны, а именно:

1. Если d > R + R1, то окружности расположены одна вне другой, не касаясь.

2. Если d = R + R1, то окружности касаются извне.

3. Если d < R + R1 и в то же время d > R — R1, то окружности пересекаются.

4. Если d = R — R1, то окружности касаются изнутри.

5. Если d < R - R1, то одна окружность лежит внутри другой не касаясь.

Эти предложения легко доказываются от противного.

Например, для доказательства первого предложения рассуждаем так: предположим противное, т.е., что окружности не расположены одна внутри другой. Тогда могут возникнуть 4 случая относительно их взаимного расположения.

Какой бы из этих случаев мы ни взяли, ни в одном из них не будет такой зависимости между расстоянием центров и величиной радиусов, какая нам дана в условии d > R Е R1. Значит, все эти случаи исключаются. Остается один возможный, именно тот, который требовалось доказать. Таким образом, перечисленные признаки различных случаев относительно положения двух окружностей не только необходимы, но и достаточны.

Как определить пересекаются ли окружности

есть 2 окружности, известны центры окружностей и их радиус, как узнать пересекаются они или нет?
понятно что две окружности пересекаются, если расстояние между их центрами меньше суммы их радиусов.
есть массив окружностей, прохожусь по ним циклом, в цикле поставил условие
if ((p[i].r+r>=abs(p[i].p.X-t.X))and(p[i].r+r>=abs(p[i].p.y-t.y))) then
как-то не корректно работает.
На форме видно что они не пересекаются а условие говорит что пересекаются
Где:
p[i].r — радиус очередной окружности из массива
r — радиус окружности какую мы проверяем на пересечение с ней других окружностей
p[i].p.X — центр по х очередной окружности из массива
t.X — центр по х окружности какую мы проверяем на пересечение с ней других окружностей
p[i].p.y — аналогично p[i].p.X
t.y — аналогично t.X

Регистрация: 09.01.2008
Сообщений: 26,238

Э!! Так Вы же расстояние неправильно вычисляете!

Расстояние между двумя точками — это корень квадратный из суммы квадратов разности соответствующих координат.

Пусть есть точка A с координатами (Xa, Ya) и точка B с с координатами (Xb, Yb)
тогда расстояние Lab между ними будет:

Lab := sqrt( sqr(Xa-Xb) + sqr(Ya-Yb) );
Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Форумчанин
Регистрация: 17.03.2009
Сообщений: 318

аааа точно, я ж делал такое.
Счас исправлю

вооо, совсем другое дело

Последний раз редактировалось Stilet; 17.06.2011 в 15:37 .

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как узнать занят порт или нет DeDoK Работа с сетью в Delphi 3 12.09.2010 21:51
Как узнать программа запущена или нет? ilSMoKEli Общие вопросы Delphi 5 02.05.2010 23:01
обновление в блоге — Как узнать, запущена программа с правами администратора или нет Pblog Обсуждение статей 0 05.03.2010 20:50
Как узнать открыл пользователь окно или нет? KaimNotark Общие вопросы Delphi 5 09.02.2010 09:38
как узнать что введено а Edit1 цифры или нет doncova1 Компоненты Delphi 9 05.02.2007 10:43

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *