Найти все общие точки двух окружностей - Turbo Pascal
Формулировка задачи:
Две окружности
Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
На плоскости заданы две окружности. Требуется найти все их общие точки.
Формат ввода
Первая строка входа содержит одно целое число K — количество тестовых примеров K (1≤ K≤ 104).
Каждый тестовый пример состоит из двух строк: первая содержит описание первой окружности, вторая — описание второй. Описание каждой окружности дано тремя целыми числами — координатами центра x и y и радиусом r (-1000 ≤ x, y ≤ 1000, 0<r≤ 1000).
Формат вывода
Для каждого тестового примера выведите одно из следующих сообщений:
“There are no points!!!”, если окружности не пересекаются
“There are only i of them....” если окружности пересекаются ровно в i точках. В этом случае в последующих i строках выведите координаты точек пересечения. Точки должны быть выведены в лексикографическом порядке (сначала точки с меньшим x, при равенстве — точки с меньшим y) c абсолютной погрешностью не хуже 10-6.
“I cant count them - too many points ” — если точек пересечения бесконечно много.
Ответы к разным тестовым примерам отделяйте дополнительной пустой строкой (в качестве примера оформления смотрите пример к задаче).
Пример
Ввод
2
0 0 2
4 0 2
0 0 1
1000 1000 1
Вывод
There are only 1 of them....
2.000000 0.000000
There are no points!!!
Актуально
Решение задачи: «Найти все общие точки двух окружностей»
textual
Листинг программы
const e=0.0001; var x1,y1,r1,x2,y2,r2:integer; x,y,a,b,h,d,x3,y3,x4,y4:real; begin writeln('Введите параметры 1 окружности'); write('x0=');readln(x1); write('y0=');readln(y1); write('R=');readln(r1); writeln('Введите параметры 2 окружности'); write('x0=');readln(x2); write('y0=');readln(y2); write('R=');readln(r2); if (abs(x1-x2)<e)and(abs(y1-y2)<e)and(abs(r1-r2)<e) then write('Окружности совпадают') else begin d:=sqrt(sqr(x1-x2)+sqr(y1-y2));//расстояние между центрами if (d>r1+r2)or(d<abs(r1-r2)) then write('Точек пересечения нет') //или излированы или 1 внутри другой else if abs(d-(r1+r2))<0.000001 then begin writeln('Окружности касаются в точке:'); x3:=(x1+x2)/2; y3:=(y1+y2)/2; writeln('x=',x3:0:2,' y=',y3:0:2); end else begin b:=(sqr(r2)-sqr(r1)+sqr(d))/(2*d); a:=d-b; h:=sqrt(sqr(r2)-sqr(b)); x:=x1+(x2-x1)/(d/a); y:=y1+(y2-y1)/(d/a); x3:=x-(y-y2)*h/b; y3:=y+(x-x2)*h/b; x4:=x+(y-y2)*h/b; y4:=y-(x-x2)*h/b; writeln('Точки пересечения:'); writeln('1:x=',x3:0:2,' y=',y3:0:2); writeln('2:x=',x4:0:2,' y=',y4:0:2); end; end; end.
Объяснение кода листинга программы
- Переменные
x1
,y1
,r1
,x2
,y2
,r2
иe
инициализируются значением 0.0001. - Переменные
x
,y
,a
,b
,h
,d
иx3
,y3
,x4
,y4
инициализируются значением 0.0000. - Код запрашивает у пользователя параметры первой окружности и сохраняет их в соответствующих переменных.
- Затем код запрашивает у пользователя параметры второй окружности и сохраняет их в соответствующих переменных.
- Если расстояние между центрами окружностей меньше или равно сумме радиусов окружностей, то окружности совпадают. В этом случае выводится сообщение
Окружности совпадают
. - Если расстояние между центрами окружностей больше суммы радиусов окружностей, то точек пересечения нет. В этом случае выводится сообщение
Точек пересечения нет
. - Если расстояние между центрами окружностей находится в диапазоне от суммы до разности радиусов окружностей, то точек пересечения может быть несколько. В этом случае вычисляются координаты точек пересечения и выводится сообщение
Точки пересечения:
. - Вычисляются координаты точек пересечения и выводится сообщение с координатами точек пересечения.
- Вычисляется среднее значение координат точек пересечения и выводится сообщение с координатами среднего значения.
- Вычисляется расстояние между средним значением координат точек пересечения и каждой из точек пересечения и выводится сообщение с координатами точек пересечения и расстоянием между ними.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д