Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Манипуляторы http://www.cyberforum.ru/cpp-beginners/thread861513.html
Ребята, проблема с манипуляторами.. Вместо того чтобы были пустые места, программа выдает нули(( void view(HANDLE hrFile) { Miami_Heat Club; int num = 0; DWORD dwCount; cout<<"--------------------------------------------------------------------"<<endl; cout<<"|"<<setw(7)<<"Name"<<setw(4)<<"|"<<setw(8)<<"Surname"<<setw(2)<<"|"<<"Pos"<<"|"<<setw(2)<<" Nat ...
C++ Удаление слов из текста Добрый день! есть задачка: Определить самое короткое слово в каждом предложении. Удалить эти слова из текста.Для обработки строк следует использовать функции стандартной библиотеки <cstring>.Примечание: следует использовать строки, представленные как массив символов. Строки, созданные с помощью классов (таких, как например, string из библиотеки STL) использовать запрещается. У меня получился... http://www.cyberforum.ru/cpp-beginners/thread861510.html
C++ ввод пути к файлу с консоли
подскажите пожалуйста, вот как отрыть файл для работы с ним я знаю, но покрайней мере я делаю так FILE *f; f=fopen("input.txt","r"); а можно как что бы указывать путь к файлу с консоли, что нибуть такое FILE *f; string bs; cin >> bs; f=fopen("bs","r"); ну или вопще как такое реализовать, подскажите пожалуйста
C++ Среднее геометрическое С++
Вычислить среднее геометрическое для каждого элемента одномерного массива по следующему правилу : {b}_{i}=\sqrt{a(i)*a(2)*...*a(i)} \sqrt{a(i)*a(2)*...*a(i)} Использовать функцию вычисления среднего геометрического одномерного массива.
C++ Двуязычие приложения http://www.cyberforum.ru/cpp-beginners/thread861473.html
Есть собственно С++ код работает все в консоли Не пойму как сделать что бы пользователь мог выбрать на каком языке будет отображаться текст программы на русском или на английском.. Выбор между ними, как создавать код, какие файлы применять!
C++ Показ скрытого сообщения Добрый день. Есть 2 класса 1-главный 2-второстепенный Когда перед пользователем появляется консоль в консоле можно зайти в меню 1 класса или во 2 класс. Если пользователь сразу из главного меню 1 и 2 класса зайдет во 2 класс то там ничего не будет Если пользователь зайдет в 1 класс и сделает такое действие "Нажмите клавишу "Y" чтобы удалить файл", после нажатия "Y" будет произведено некое... подробнее

Показать сообщение отдельно
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595

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

11.05.2013, 22:57. Просмотров 910. Ответов 10
Метки (Все метки)

Есть такая задачка.

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

В силу большой требуемой точности рекомендуется использовать более чем 8-байтные вещественнозначные типы при вычислениях. Вот тут сразу вопрос, это какие типы ? double 8 байтный, больше не знаю. Пишу на MVSC++ 2012

Входные данные
В первой строке M (1 <= M <= 10000) -- количество тестов. Следующие 2M строк описывают сами окружности. Каждая окружность описывается 3 числами: координатами центра и радиусом.
Все числа в файле целые, известно, что все координаты от -1000 до +1000, и радиус больше нуля и не превосходит 1000.

Выходные данные
Для каждого теста выведите сообщение:
There are no points!!! -- если нет точек пересечения;
There are only i of them.... -- если есть только i точек пересечения. Выведите в след. i строках сами точки, сортируя их по x в первую очередь и по y во вторую. Выводите их с 12 знаками после запятой.
I can't count them - too many points -- если их бесконечное число.
Разделяйте выводы для разных тестов пустой строкой.

Пример

Ввод
1
0 0 2
4 0 2
Вывод
There are only 1 of them....
2.00000000000000 0.00000000000000

Решал так :
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <set>
#include <vector>
#include <limits>
#include <stdio.h>
#include <string>
#include <queue>
#include <time.h>
 
using namespace std;
 
double eps = 1e-18;
 
bool comp(long double a, long double b){
    return (abs(a-b) < eps);
} 
 
void circle_line(long double a, long double b, long double c, long double r, long double x1, long double y1){
    long double x0 = -a*c/(a*a+b*b);
    long double y0 = -b*c/(a*a+b*b);
    if (c*c > r*r*(a*a+b*b)+eps){
        printf("There are no points!!!\n");
    }else if (comp(c*c, r*r*(a*a+b*b))) {
        printf("There are only 1 of them....\n");
        printf("%.14lf %.14lf\n", x0 + x1, y0 + y1);
    } else {
        printf("There are only 2 of them....\n");
        long double d = r*r - c*c/(a*a+b*b);
        long double mult = sqrt (d / (a*a+b*b));
        long double ax = x0 + b * mult;
        long double bx = x0 - b * mult;
        long double ay = y0 - a * mult;
        long double by = y0 + a * mult;
        if (ax > bx || (ax == bx && ay > by)) {
            swap(ax, bx);
            swap(ay, by);
        }
        printf("%.14lf %.14lf\n%.14lf %.14lf\n", ax + x1, ay + y1, bx + x1, by + y1);
    }
}
 
void circle_circle (long double x1, long double y1, long double r1, long double x2, long double y2, long double r2){
    if (comp(x1, x2) && comp(y1, y2)) {
        if (!comp(r1, r2)){
            printf("There are no points!!!\n");
        } else {
            printf("I can't count them - too many points :(\n");
        }
        return;
    }
    x2 -= x1;
    y2 -= y1;
    circle_line(- 2.0 * x2, - 2.0 * y2, x2*x2 + y2*y2 + r1*r1 - r2*r2, r1, x1, y1);
}
 
int main() {
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int t;
    cin >> t;
    while (t > 0) {
        long double x1, y1, r1, x2, y2, r2;
        scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2);
        circle_circle(x1, y1, r1, x2, y2, r2);
        printf("\n");
        t--;
    }
    return 0;
}
(Доступ к контестору только из Саратова http://acm.sgu.ru/univer/)

Добавлено через 39 секунд
В чём ошибка ?

Добавлено через 50 секунд
http://e-maxx.ru/algo/circles_intersection можно руководствоваться

Добавлено через 3 минуты
статус :
Test.1: OK with Time 0 ms
Test.2: OK with Time 0 ms
Test.3: OK with Time 0 ms
Test.4: OK with Time 15 ms
Test.5: OK with Time 0 ms
Test.6: WA with Time 31 ms
Test.7: WA with Time 31 ms
Test.8: OK with Time 62 ms
Test.9: OK with Time 31 ms
Test.10: OK with Time 62 ms
Test.11: OK with Time 62 ms
Test.12: OK with Time 62 ms
Test.13: WA with Time 62 ms
Test.14: WA with Time 46 ms
Test.15: WA with Time 78 ms
Test.16: WA with Time 0 ms
Test.17: OK with Time 15 ms
Test.18: WA with Time 15 ms
Test.19: OK with Time 15 ms

Добавлено через 5 минут
Мне кажется потеря точности

Добавлено через 47 минут
upup

Добавлено через 4 часа 16 минут
upb

Добавлено через 2 часа 28 минут
апп
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru