E086. Пересечение двух окружностей

e-maxx algorithm original: C/C++ #algorithm #emaxx #geometry #math
El texto de la tarea se traduce del ruso para el idioma seleccionado. El código no cambia.

Источник: e-maxx.ru/algo, страница PDF 248.

given две окружности, каждая определена координатами своего центра и радиусом. it is required find все их точки пересечения (либо одна, либо две, либо ни одной точки, либо окружности совпадают).

Solución

Сведём нашу задачу к задаче о Пересечении окружности и прямой. Предположим, не теряя общности, что центр первой окружности - в начале координат (если это не так, то перенесём центр в начало координат, а при выводе ответа будем обратно прибавлять координаты центра). Тогда мы имеем систему двух уравнений:

x2 + y2 = r12

(x - x2)2 + (y - y2)2 = r22

Вычтем из второго уравнения первое, чтобы избавиться от квадратов переменных:

x2 + y2 = r12

x (-2x2) + y (-2y2) + (x22 + y22 + r12 - r22) = 0

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

Ax + By + C = 0,

A = -2x2,

B = -2y2,

C = x22 + y22 + r12 - r22. А Solución последней задачи описано в соответствующей статье. Единственный вырожденный случай, который надо рассмотреть отдельно - когда центры окружностей совпадают. Действительно, в этом случае вместо уравнения прямой мы получим уравнение вида 0 = С, где C - некоторое number, и этот случай будет обрабатываться некорректно. Поэтому этот случай нужно рассмотреть отдельно: если радиусы окружностей совпадают, то ответ - бесконечность, иначе - точек пересечения нет.

C# solución

borrador automático, revisar antes de enviar
using System;
using System.Collections.Generic;
using System.Linq;

public static class AlgorithmDraft
{
    // Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
    x2 + y2 = r12
    (x - x2)2 + (y - y2)2 = r22
    x2 + y2 = r12
    x (-2x2) + y (-2y2) + (x22 + y22 + r12 - r22) = 0
    Ax + By + C = 0,
    A = -2x2,
    B = -2y2,
    C = x22 + y22 + r12 - r22.
}

C++ solución

coincidente/original
x2 + y2 = r12
(x - x2)2 + (y - y2)2 = r22
x2 + y2 = r12
x (-2x2) + y (-2y2) + (x22 + y22 + r12 - r22) = 0
Ax + By + C = 0,
A = -2x2,
B = -2y2,
C = x22 + y22 + r12 - r22.

Java solución

borrador automático, revisar antes de enviar
import java.util.*;
import java.math.*;

public class AlgorithmDraft {
    // Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
    x2 + y2 = r12
    (x - x2)2 + (y - y2)2 = r22
    x2 + y2 = r12
    x (-2x2) + y (-2y2) + (x22 + y22 + r12 - r22) = 0
    Ax + By + C = 0,
    A = -2x2,
    B = -2y2,
    C = x22 + y22 + r12 - r22.
}

Материал разбит как Algoritmoическая Tarea: изучить постановку, понять асимптотику и реализовать Algoritmo на выбранном языке.

Vacantes para esta tarea

Se muestran vacantes activas con etiquetas coincidentes.

Todas las vacantes
Todavía no hay vacantes activas.