Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/141: Рейтинг темы: голосов - 141, средняя оценка - 4.80
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256

Проверить, пересекаются ли две окружности

03.07.2015, 11:19. Показов 29037. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, не получается решить данную задачу:

На плоскости даны две окружности. Требуется проверить, пересекаются ли они.

Входные данные

Входной файл INPUT.TXT состоит из двух строк. На каждой строке записана информация об одной окружности – координаты ее центра x и y (целые числа, по модулю не превосходящие 5000) и радиус (целое число 1 ≤ r ≤ 1000).

Выходные данные

В выходной файл OUTPUT.TXT выведите «YES», если окружности пересекаются, и «NO» в противном случае.

Вот мой способ решения, он основан на том, чтобы для начала вычислить какая из окружностей "первая", а какая "вторая", а после этого проверить пересечение. Интересно было бы увидеть также ваши решения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
void main()
{
    // Объявление переменных, простых и правдивых (true)
    int x1, y1, x2, y2, r1, r2;
    int tx1, tx2, ty1, ty2, tr1, tr2;
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    // Расчет, какая из окружностей 1, а какая 2.
 
    // Не получается
 
 
   // Расчёт, пересекаются ли окружности.
    if (((ty2 - tr2) > (ty1 + tr1)) || ((tx2 - tr2) > (tx1 + tr1)) || (((ty2 - tr2) == (ty1 + tr1)) && ((tx2 - tr2) == (tx1 + tr1))))
    {   
        cout << "NO" << endl;
    }
    else if ((tx1 != tx2) && ((ty2 - tr2) >= (ty1 + tr1)))
    {
        cout << "NO" << endl;
    }
    else
        cout << "YES" << endl;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2015, 11:19
Ответы с готовыми решениями:

Определить пересекаются ли две заданные окружности
Составить программу, определяющую: не пересекаются, касаются, или пересекаются две заданные окружности (для каждой окружности при вводе...

Проверить, пересекаются ли окружности
Привет родные форумчане! Пожалуйста помогите решить буду особенно благодарен если напишите код с комментариями что как работает, заранее...

Определить, во скольких точках пересекаются две окружности
Заданы две окружности: с центром в точке О (x0, y0) и радиусом R0 и с центром в точке О (x1, y1) и радиусом R1. Определите, во скольких...

8
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
03.07.2015, 11:26
Расстояние между центрами <= суммы радиусов = пересекаются.
1
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
03.07.2015, 11:49  [ТС]
По сути всё ясно, спасибо. Странно, что Visual Studio нормально компилирует, а на сайте выдает ошибку:

error C2668: sqrt: неоднозначный вызов перегруженной функции

Как это исправить ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
using namespace std;
 
void main()
{
    int x1, y1, x2, y2, r1, r2;
    double d;
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    if ((r1 + r2) <= d)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
0
1615 / 1181 / 552
Регистрация: 08.01.2012
Сообщений: 4,558
03.07.2015, 12:03
один из вариантов: double x1, y1, x2, y2, r1, r2;
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
03.07.2015, 13:00  [ТС]
Странно, не проходит тесты, я что-то не учёл ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cmath>
using namespace std;
 
void main()
{
    int x1, y1, x2, y2, r1, r2;
    double d;
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    cout << sqrt(d) << endl;
    if ((r1 + r2) <= sqrt(d))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
03.07.2015, 13:05
Цитата Сообщение от Melvil Посмотреть сообщение
не проходит тесты
1.И не будет проходить, пока не поменяете тип координат с int на double
2. Надо избавиться от sqrt
C++
1
if ( (r1 + r2)*(r1+r2) <=d)
1
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
03.07.2015, 13:15  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
.И не будет проходить, пока не поменяете тип координат с int на double
2. Надо избавиться от sqrt
Код C++Выделить код
1
if ( (r1 + r2)*(r1+r2) <=d)
Спасибо, но почему ? В условии указано, что числа целые.
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
03.07.2015, 13:53
Цитата Сообщение от Melvil Посмотреть сообщение
На плоскости даны две окружности. Требуется проверить, пересекаются ли они.
Если они на плоскости, то координаты измеряем в метрах.
Почему не может быть окружности радиусом в полтора метра?
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
03.07.2015, 14:35  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Если они на плоскости, то координаты измеряем в метрах.
Почему не может быть окружности радиусом в полтора метра?
В условии сказано, что координаты - это целые числа:

координаты ее центра x и y (целые числа, по модулю не превосходящие 5000) и радиус (целое число 1 ≤ r ≤ 1000).
И всё же, если брать и целые и дробные числа, программа не проходит проверки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void main()
{
    double x1, y1, x2, y2, r1, r2, d;
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    if ((r1 + r2)*(r1 + r2) >= d)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
Добавлено через 28 минут
Решение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void main()
{
    double x1, y1, x2, y2, r1, r2, d;
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    if ((r1 + r2)*(r1 + r2) >= d && d + r1 > r2 && d + r2 > r1 )
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

ля начала определимся с тем, что нам известны радиусы окружностей и они равны r1 и r2. Так же по формуле расстояния между точками мы можем вычислить расстояние между центрами данных окружностей:

r = sqrt( (x2-x1)2 + (y2-y1)2 )

Заметим так же, что окружности будут пересекаться тогда и только тогда, когда возможен треугольник со сторонами r1, r2 и r. Фигуру, две стороны которой лежат на третьей или одна из сторон имеет нулевую длину так же будем считать треугольником, т.к. окружности могут друг друга касаться(r=r1+r2), либо полностью совпадать (r=0).

Треугольник считается возможным если сумма двух любых его сторон не меньше третьей. Т.е. в нашем случае достаточно проверить, что r1+r2>=r и r+r2>=r1 и r+r1>=r2. При этом желательно использовать вещественные типы данных. Так же можно провести аккуратное сравнение с учетом возможных погрешностей при вычислениях.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2015, 14:35
Помогаю со студенческими работами здесь

ООП: принять две фигуры Shape*, и проверить, пересекаются ли они
Вот задания: 1. При наличии класса Circle (круг) Square (квадрат) і Triangle(треугольник) походный от Shape (фигура) определить функцию...

ООП: принять две фигуры Shape*, и проверить, пересекаются ли они
Вот задания но я просто 0 в С ++, только начал изучать, может кто знает как? 1. При наличии класса Circle (круг) Square (квадрат) і...

Как узнать пересекаются ли окружности
Даны координаты центров двух окружностей и их радиусы, нужно узнать: 1. совпадают ли? 2. не пересекаются? 3. пересекаться ли в двух...

Определить в скольких точках пересекаются окружности
Заданы две окружности: с центром в точке О1(x0, y0) и радиусом R0 и с центром в точке О2(x1, y1) и радиусом R1. Определите, во скольких...

Определите, во скольких точках пересекаются окружности.
Помогите пожалуйста решить. Ничего не понимаю, а скоро экзамен(((( Буду очень благодарна... Заданы две окружности: с центром в точке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru