Задачи
September 5

Задача. Геометрия & Программирование

Даны:

  1. Два маленьких круга (см.рисунок ниже), которые касаются внешне друг друга.
  2. Также есть большой круг, который расположен таким образом, что он касается два малых круга, но они находятся внутри него.
  3. Хорда t большего круга является общей касательной к 2м меньших кругам с радиусами r1 и r2.
  4. Также известно, что центры всех трех окружностей лежат на одной прямой.
  5. Вам даны ЛИБО значения радиусов r1, r2, ЛИБО значение длины хорды t.

Необходимо вычислить площадь области, помеченной желтым цветом на рисунке.

Входные данные: r1, r2 ЛИБО t.
r1, r2, t больше нуля и меньше 100.

Пример:
r1 = 15, r2 = 20
Output: ~1884

Разбор

1. Даны r1, r2.

Исходя из условий задачи (расположение окружностей, центры окружностей O, O1, O2 лежат на одной прямой) получаем, что радиус большого круга равен:

r = r1 + r2.

Тогда площадь серой области будет:

S = Pi*(r1 + r2)^2 - P*r1^2 - Pi*r2^2 = 2*Pi*r1*r2

2. Дана хорда t.

Рассмотрим треугольник (смотри рисунок) OBC.

OB - радиус большего круга, поэтому OB = r1 + r2

OC = 2*(r1 + r2) - 2*r2 - r1 - (r1 + r2 - r1) = r1 - r2

BC = t / 2

Хорда проходит в точке касания двух окружностей, поэтому она будет перпендикулярна к прямой, на ктр лежат центры окружностей. Треугольник OBC будет прямоугольный. Поэтому воспользуемся теоремой Пифагора:

(r1 + r2)^2 = (r1 - r2)^2 + t^2 / 4

Преобразуем формулу и получим формулу для серой части:

*Pi*r1*r2 (эту формулу мы вывели из 1го случая) = Pi*t^2 / 8

Рисунок ужасный, но, надеюсь, главную суть уловили :)

Реализация

Play-test

https://dotnetfiddle.net/GbShB3