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

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

22.02.2015, 21:07. Просмотров 2329. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

4
ValeryS
Модератор
7265 / 5519 / 692
Регистрация: 14.02.2011
Сообщений: 18,704
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,446
22.02.2015, 21:35  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
дельту нужно рассчитывать исходя из порядков чисел
Спасибо. Решение прошло все тесты. Работает даже с дельтой, равной 0.1. Я до этого ни туда дельту вставлял.
0
ValeryS
Модератор
7265 / 5519 / 692
Регистрация: 14.02.2011
Сообщений: 18,704
22.02.2015, 21:39 4
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Работает даже с дельтой, равной 0.1.
чем больше дельта, тем грубее расчет
это так скажем округление, можно округлять до километров, а можно и до микрон
но этим занимается другая наука - метрология
0
Dennis Ritchie
548 / 140 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
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-х эллипсов заданных уравнениями вида: ...

Определить координаты точек пересечения высот
Составить программу,которая по заданным координатам вершин...


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

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

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