Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,445
#1

Определить количество точек пересечения двух окружностей - C++

22.02.2015, 21:07. Просмотров 2077. Ответов 4
Метки нет (Все метки)

Две окружности

Определить количество точек пересечения двух окружностей.

Входные данные
6 чисел x1, y1, r1, x2, y2, r2, где x1, y1, x2, y2 - координаты центров окружностей, а r1, r2 – их радиусы. Все числа - действительные, не превышают по модулю 1000000000, заданы не более чем с 3-мя знаками после запятой.

Выходные данные
Количество точек пересечения. Если точек пересечения бесконечно много, то вывести -1.

Пример
Входные данныеВыходные данные
0 0 5 5 0 52
Подскажите, пожалуйста, какой случай я не учёл? Программа проходит 5 тестов из 7:
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
28
29
30
31
32
33
34
#include <cmath>
#include <cstdio>
 
int main(void) {
    
    double x1, y1, r1, x2, y2, r2;
    
    scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2);
    
    double dist = pow(((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)), 0.5);
    
    if (r2 > r1) {
        double tmp = r1;
        r1 = r2;
        r2 = tmp;
    }
    
    if (x1 == x2 && y1 == y2) {
        if (r1 == r2)
            puts("-1");
        else
            puts("0");
    }
    else
        if (dist == r1 + r2 || dist == r1 - r2)
            puts("1");
        else
            if (dist > r1 + r2 || dist + r2 < r1)
                puts("0");
            else
                puts("2");
 
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2015, 21:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Определить количество точек пересечения двух окружностей (C++):

Координаты пересечения двух окружностей
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не меньше 1 и не больше, чем 1000. Они...

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

Определить, сколько точек пересечения имеют прямая и окружность и найти координаты этих точек
Привет. Тут такое дело. В общем я неплохо знаю сам язык, но вот задачку решить не могу. Т.е не знаю как. С школьной математикой у меня...

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

Количество точек пересечения
Заданно мно-во прямых на плоскости(коэффициентами своих уравнений)Подсчитать количество точек пересечения этих прямых. Подскажите как...

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

4
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,200
22.02.2015, 21:22 #2
Лучший ответ Сообщение было отмечено Dennis Ritchie как решение

Решение

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
double dist
я так понял, что это расстояния между точками
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
if (dist == r1 + r2 || dist == r1 - r2)
вот здесь может быть ошибка
плавающие так не сравнивают из за округления может не сработать, нужно вводить какую то дельту
поскольку
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
заданы не более чем с 3-мя знаками после запятой.
введем дельту 0.0001
получаем
C++
1
if (fabs(dist- (r1 + r2))<0.0001 || fabs(dist -( r1 - r2))<0.0001)
но решение это не совсем верное
если сравнивать радиусы 1000000000 и 0.01 то скорее всего комп сойдет с ума
дельту нужно рассчитывать исходя из порядков чисел
1
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,445
22.02.2015, 21:35  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
дельту нужно рассчитывать исходя из порядков чисел
Спасибо. Решение прошло все тесты. Работает даже с дельтой, равной 0.1. Я до этого ни туда дельту вставлял.
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,200
22.02.2015, 21:39 #4
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Работает даже с дельтой, равной 0.1.
чем больше дельта, тем грубее расчет
это так скажем округление, можно округлять до километров, а можно и до микрон
но этим занимается другая наука - метрология
0
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,445
23.02.2015, 00:18  [ТС] #5
Цитата Сообщение от ValeryS Посмотреть сообщение
чем больше дельта, тем грубее расчет
Прочитал я такую статью:
Что нужно знать про арифметику с плавающей запятой (лучший способ для сравнения вещественных чисел)
Увидел там алгоритм сравнения чисел с плавающей запятой преобразованием к целочисленным переменным:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool AlmostEqual2sComplement(float A, float B, int maxUlps) {
    // maxUlps не должен быть отрицательным и не слишком большим, чтобы
    // NaN не был равен ни одному числу
    assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024);
    int aInt = *(int*)&A;
    // Уберем знак в aInt, если есть, чтобы получить правильно упорядоченную последовательность
    if (aInt < 0) aInt = 0x80000000 - aInt;
    //aInt &= 0x7fffffff; //(см. комментарий пользователя Vayun)
    // Аналогично для bInt
    int bInt = *(int*)&B;
    if (bInt < 0) bInt = 0x80000000 - bInt;
    /*aInt &= 0x7fffffff;*/
    unsigned int intDiff = abs(aInt - bInt); /*(см. комментарий пользователя Vayun)*/
    if (intDiff <= maxUlps)
        return true;
    return false;
}
Не могли бы вы привести пример, как сравнить два вещественных числа с помощью этого алгоритма.
0
23.02.2015, 00:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2015, 00:18
Привет! Вот еще темы с решениями:

Найти количество и координаты точек пересечения 2-х эллипсов
Нужно найти точки пересечения 2-х эллипсов заданных уравнениями вида: (x-x1)2/a12+(y-y1)2/b12=1 (x-x2)2/a22+(y-y2)2/b22=1 нужно...

Определить координаты точек пересечения высот
Составить программу,которая по заданным координатам вершин треугольника(Xi,Yi,i=1,2,3) определяла бы координаты точек пересечения высот...

Написать функцию нахождения точек пересечения двух кривых, основанную на методе простой итерации
Помогите реализовать задачу. Заданы функции Y1, Y2, Y3 и интервал , который содержит координаты точек пересечения кривых Y1 = arctg(x), Y2...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru