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

e-maxx algorithm original: C/C++ #algorithm #emaxx #geometry #math
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

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

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

해법

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

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

C# 해법

자동 초안, 제출 전 검토
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++ 해법

매칭됨/원본
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 해법

자동 초안, 제출 전 검토
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.
}

Материал разбит как 알고리즘ическая 문제: изучить постановку, понять асимптотику и реализовать 알고리즘 на выбранном языке.

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.