Другие языки программирования и технологии
Взываю к умным программистам и математикам!
Есть простая задачка. даны: две окружности с центрами в точках (x1; y1) и (x2; y2) с радиусами r1 и r2 найти: координаты точек их пересечения (c1; y1) и (c2; y2) интересует случай, когда таких точек две. было бы круто, если ответ дадите готовой формулой. если такой формулы нет, дайте хотя бы алгоритм нахождения этих точек, реализуемый программными методами.
Пусть нужно найти пару точек P3 пересечения, если они существуют.
Для начала найдем расстояние между центрами окружностей. d = || P1 - P0 ||. Если d > r0 + r1, тогда решений нет: круги лежат отдельно. Аналогично в случае d < || r0 - r1 || - тогда нет решений, так как одна окружность находится внутри другой.
Рассмотрим два треугольника P0P2P3 и P1P2P3. Имеем
a^2 + h^2 = r0^2 и b^2 + h^2 = r1^2
Используя равенство d = a + b, мы можем разрешить относительно a:
a = (r0^2 - r1^2 + d^2 ) / (2d)
В случае соприкосновения окружностей, это, очевидно, превратится в r0, так как: d = r0 + r1
Решим относительно h, подставив в первое уравнение h^2 = r0^2 - a^2
Итак,
P2 = P0 + a ( P1 - P0 ) / d
Таким образом, получаем координаты точек P3 = (c1, d1) и P3 = (c2, d2):
c1 = x2 + h ( y1 - y0 ) / d
c2 = x2 - h ( y1 - y0 ) / d
d1 = y2 - h ( x1 - x0 ) / d
d2 = y2 + h ( x1 - x0 ) / d

Для начала найдем расстояние между центрами окружностей. d = || P1 - P0 ||. Если d > r0 + r1, тогда решений нет: круги лежат отдельно. Аналогично в случае d < || r0 - r1 || - тогда нет решений, так как одна окружность находится внутри другой.
Рассмотрим два треугольника P0P2P3 и P1P2P3. Имеем
a^2 + h^2 = r0^2 и b^2 + h^2 = r1^2
Используя равенство d = a + b, мы можем разрешить относительно a:
a = (r0^2 - r1^2 + d^2 ) / (2d)
В случае соприкосновения окружностей, это, очевидно, превратится в r0, так как: d = r0 + r1
Решим относительно h, подставив в первое уравнение h^2 = r0^2 - a^2
Итак,
P2 = P0 + a ( P1 - P0 ) / d
Таким образом, получаем координаты точек P3 = (c1, d1) и P3 = (c2, d2):
c1 = x2 + h ( y1 - y0 ) / d
c2 = x2 - h ( y1 - y0 ) / d
d1 = y2 - h ( x1 - x0 ) / d
d2 = y2 + h ( x1 - x0 ) / d

Леонид
изящно) я побоялся системы квадратных уравнений, а зря) спасибо
Можно считать исходя из системы координат с началом в центре первой окружности. Либо, свести задачу к треугольникам образованным точками пересечения окружностей.
Уравнение, опиывающее график первой окружности: (X-X1)^2+(Y-Y1)^2=R1^2
Соответственно, вторая окружность описывается: (X-X2)^2+(Y-Y2)^2=R@^2
Решай систему этих двух уравнений. Решения и есть точки пересечения двух окружностей.
Соответственно, вторая окружность описывается: (X-X2)^2+(Y-Y2)^2=R@^2
Решай систему этих двух уравнений. Решения и есть точки пересечения двух окружностей.
Леонид
очень сложно решать в программе систему нелинейных уравнений) хотелось бы другое, более красивое решение, возможно применить тригонометрию
Похожие вопросы
- Программист и математика
- Можно ли стать программистом без математики?
- Программист и математика
- Зачем программисту нужна математика
- Почему программист незнающий математику это плохой программист?
- Весьма интересная задача для программистов и математиков (внутри)
- Стоит поступать на программиста, если математику знаеш на троекчку?
- Чтобы стать хорошим программистом нужно математика и английский?
- Почему считают что программисту математика не нужна? Откуда взялся этот миф?
- Я не математик, а программист.