Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/140: Рейтинг темы: голосов - 140, средняя оценка - 4.69
4 / 4 / 0
Регистрация: 04.12.2010
Сообщений: 93
1

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

01.10.2012, 20:31. Показов 25567. Ответов 16
Метки нет (Все метки)

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

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

Входной файл 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
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
    double x1,x2,y1,y2,r1,r2;
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> x1 >> x2 >> y1 >> y2 >> r1 >> r2;
    double r = sqrt(pow(x2 - x1,2) + pow(y2 - y1,2)); //расстояние между центрами
    // проверка на совпадение 2-ух окружностей
    if (r == 0 && r1 == r2)
    {
        cout << "YES";
        return 0;
    }
 
    if (r1 + r2 >= r && r1 + r >= r2 && r2 + r >= r1)
        cout << "YES";
    else
        cout << "NO";
    return 0;
}
существует какой то контрпример, при котором задача не проходит, я его не знаю но таковой имеется, поскольку система проверки меня не пропускает, что же я не учёл?
PS Алгоритм на изображение... Просто проверяется условие существование треугольника!
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2012, 20:31
Ответы с готовыми решениями:

Пересечение двух окружностей
Есть такая задачка. Вам даны две окружности в плоскости. Найдите все их различные точки...

Задача на пересечение двух окружностей
Всем привет! Прошу вашей помощи в решении задачи так как я уже дней пять над ней мучаюсь и все не...

Пересечение двух прямых и проверка на пересечение
Доброго времени суток слизал функцию проверки отсюда:/segments_intersection_checking на всякий...

Столкновение двух окружностей
Итак,я сталкиваю два шарика(но вообще их больше,массив). Какое-то время после старта программы все...

16
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
01.10.2012, 20:40 2
не учли, как минимум, что они могут совпадать. тогда условие треугольника не верно, а пересечение имеется
0
4 / 4 / 0
Регистрация: 04.12.2010
Сообщений: 93
01.10.2012, 20:41  [ТС] 3
Цитата Сообщение от Thinker Посмотреть сообщение
не учли, как минимум, что они могут совпадать
C++
1
2
3
4
5
6
// проверка на совпадение 2-ух окружностей
    if (r == 0 && r1 == r2)
    {
        cout << "YES";
        return 0;
    }
0
Thinker
01.10.2012, 20:43
  #4

Не по теме:

ну да, не заметил

0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
01.10.2012, 20:51 5
Может дело в погрешности из-за извлечения корня и прямого сравнения даблов?
Уберите корень и сравнивайте квадраты
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
01.10.2012, 20:53 6
чот я не понял в чом проблема? программа ведь работает?
0
4 / 4 / 0
Регистрация: 04.12.2010
Сообщений: 93
01.10.2012, 20:55  [ТС] 7
Цитата Сообщение от Nixy Посмотреть сообщение
чот я не понял в чом проблема? программа ведь работает?
да, но на сайте с заданием не проходит на втором тесте (Wrong Answer)
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
01.10.2012, 20:55 8
может и правда в погрешности, так как имеются граничные случаи (вырожденного в отрезок треугольника), когда окружности касаются (одна внутри другой и одна вне другой). там для радиусов должно выполнено r = r1+r2 либо r1 = r + r2 в зависимости от того, как они касаются. при погрешностях условие алгоритма в этих случаях может нарушится
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.10.2012, 20:55 9
Bogdand, возможно дело в погрешности. Не вычисляйте корень, сравнивайте с r * r.

Не по теме:

Опоздал ><

0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
01.10.2012, 20:56 10
Цитата Сообщение от Bogdand Посмотреть сообщение
на сайте с заданием

Не по теме:

а что за сайт?



Цитата Сообщение от I.M. Посмотреть сообщение
Уберите корень и сравнивайте квадраты
дельная идея
0
4 / 4 / 0
Регистрация: 04.12.2010
Сообщений: 93
01.10.2012, 20:59  [ТС] 11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Bogdand, возможно дело в погрешности. Не вычисляйте корень, сравнивайте с r * r.

Не по теме:

Опоздал ><

второе условие как я с квадратами сравню?
0
Nixy
01.10.2012, 21:01
  #12

Не по теме:

написал не подумав

0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
01.10.2012, 21:01 13
Цитата Сообщение от Bogdand Посмотреть сообщение
второе условие как я с квадратами сравню?
легко, нужно условие без корня только для граничных случаев, если они не верны, дальше с корнем
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
01.10.2012, 21:08 14
C++
1
if (r1*r1 + r2*r2+2*r1*r2 >= r )
это вот случай если у тебя они касаются в одной точке воде так
где r=(x1-x2)^2+(y1-y2)^2
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
01.10.2012, 21:14 15
Невнятно сформулирована задача. Проверить окружности изолированы просто

#define SQR(a) ((a) * (a)) // или template
bool outside = SQR(r1 + r2) > SQR(x2 - x1) + SQR(y2 - y1);

Конечно вызовы pow и sqrt = западло.
Но вот что нужно еще (что считается "настоящим" пересечением) - не пойму ;-)
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
01.10.2012, 21:23 16
Цитата Сообщение от Bogdand Посмотреть сообщение
также абсолютно не проходит!
даже странно. когда-то решал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <math.h>
int main(){
  int a, b, r, a1, b1, r1;
  double temp;
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
  scanf("%d%d%d%d%d%d", &a, &b, &r, &a1, &b1, &r1);
  temp=sqrt(pow((double)(a-a1), 2.) + pow((double)(b-b1), 2.));
  if(temp>(double)(r+r1) || temp+(double)r<r1 || temp+(double)r1<r)
        printf("NO");
  else
      printf("YES");
 
  return 0;
}
все прошло )
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.10.2012, 21:30 17
Зашел только что на acmp.ru, эта задача у меня пройдена вот так:
C++
1
2
3
4
5
6
   d = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
   
   if ( d <= ( r1 + r2 ) * ( r1 + r2 ) && d >= ( r1 > r2 ? r1 - r2 : r2 - r1 ))
      outFile << "YES";
   else
      outFile << "NO";
1
01.10.2012, 21:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2012, 21:30
Помогаю со студенческими работами здесь

Координаты пересечения двух окружностей
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не...

Строка: Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк.
Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, то...

Вводится значение двух радиусов окружностей
Помогите создать блок схему для задачи c пояснениями пожалуйста: Вводится значение двух радиусов...

Вычислить площадь пересечения двух окружностей
Здравствуйте) Может кто-нибудь сталкивался с написнием программы для вычисления площади пересечения...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru