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

e-maxx algorithm original: C/C++ #algorithm #emaxx #geometry #math
Le texte du problème est traduit du russe pour la langue sélectionnée. Le code reste inchangé.

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

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

Solution

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

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. А Solution последней задачи описано в соответствующей статье. Единственный вырожденный случай, который надо рассмотреть отдельно - когда центры окружностей совпадают. Действительно, в этом случае вместо уравнения прямой мы получим уравнение вида 0 = С, где C - некоторое number, и этот случай будет обрабатываться некорректно. Поэтому этот случай нужно рассмотреть отдельно: если радиусы окружностей совпадают, то ответ - бесконечность, иначе - точек пересечения нет.

C# solution

brouillon automatique, à relire avant soumission
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++ solution

correspondant/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 solution

brouillon automatique, à relire avant soumission
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.
}

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

Vacancies for this task

offres actives with overlapping task tags are affichés.

Toutes les offres
Il n'y a pas encore d'offres actives.