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

Пересечение кругов

28.05.2018, 23:38. Показов 1162. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер буду благодарен за помощь))
Смотрите нам даны два круга нам известно координаты их центров пусть будут х0, у0 и х1, у1 а также радиусы r0 и r1 надо найти общий площадь сечения (если не поняли то есть еще рисунок надеюсь поймете) и вот мой код не могу понять в чем ошибка (я знаю что есть еще другие варианты пересечения я это сделаю но никак не пойму в чем ошибка)
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
#include <math.h>
#include <iostream>
#include <cmath>
using namespace std;
const double pi = 3.1415926535897932384626433832795;
int main() {
    double x0, y0, r0, x1, y1, r1, d, a, h, x2, y2,sc,sc1;
    double x3, y3, kut, s, x3l, y3l, leng,  kut1, s1;
    cin >> x0 >> y0 >> r0;
    cin >> x1 >> y1 >> r1;
    d = sqrt(pow((x0 - x1), 2) + pow((y0 - y1), 2));//відстань між центрами кіл
    
    
        a = (pow(r0, 2) - pow(r1, 2) + pow(d, 2)) / (2 * d);//on picture
        h = sqrt(pow(r0, 2) - pow(a, 2));//on picture
 
        x2 = x0 + (a*(x1 - x0)) / d;
        y2 = y0 + (a*(y1 - y0)) / d;//координати точки п2
 
        x3 = x2 - (h*(y1 - y0)) / d;
        y3 = y2 - (h*(x1 - x0)) / d;
        x3l = x2 + (h*(y1 - y0)) / d;
        y3l = y2 + (h*(x1 - x0)) / d;
        //перший трикутник
        kut = (180 / pi) * (h / r0);//градусна міра кута першого трикутника
 
 
        leng = h * 2;//відстань між точками перетину кіл
        s = (a * leng) / 2;//площа першого трикутника
 
        //другий трикутник
        kut1 = ((180 / pi) * (h / r1));
        s1 = ((d - a) * leng) / 2;//площа другого трикутника
 
        //сигменти
        sc = ((pi*pow(r0, 2)*kut) / 360) - s;
        sc1 = ((pi*pow(r1, 2)*kut) / 360) - s1;
        cout << sc + sc1;
    
    system("pause");
}
Миниатюры
Пересечение кругов  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2018, 23:38
Ответы с готовыми решениями:

Пересечение двух кругов
Привет. Есть входной файл такого формата: Первый ряд цифр относится к первому кругу, 1 -...

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

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

Даны площади нескольких кругов
Помогите сделать программу! Даны площади нескольких кругов. Найти радиус самого маленького из них!...

9
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
29.05.2018, 00:09 2
_Milk_, решал эту задачу, там ещё ошибка была в девятом знаке после запятой на скрине, сбросьте оригинал условия, чтобы можно было найти по поиску
0
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
29.05.2018, 00:34 3
Цитата Сообщение от Yetty Посмотреть сообщение
решал эту задачу
через интегралы\сегменты кругов\ ещё как-то?
Сам в коде выражать тут поленился)
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
29.05.2018, 01:05 4
Цитата Сообщение от Herji Посмотреть сообщение
через интегралы\сегменты кругов\ ещё как-то?
Сам в коде выражать тут поленился)
да, разность двух определённых интегралов. второй раз уже тоже неинтересно

Добавлено через 9 минут
хотя нет, не так скорее было, вроде один интеграл находил, а потом умножал на 4. найти бы тему точно сказал
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
29.05.2018, 10:41  [ТС] 5
Цитата Сообщение от Yetty Посмотреть сообщение
_Milk_, решал эту задачу, там ещё ошибка была в девятом знаке после запятой на скрине, сбросьте оригинал условия, чтобы можно было найти по поиску
http://algotester.com/en/Archi... play/40350
0
642 / 444 / 224
Регистрация: 10.06.2016
Сообщений: 2,039
29.05.2018, 11:00 6
Число pi - недостаточное количество разрядов.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
29.05.2018, 14:18 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
int main() 
{
    double x1, y1, r1, x2, y2, r2, d, a1, a2, h, S1, S2, S;    
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = hypot(x1-x2,y1-y2);   
    a1 = (d*d+r1*r1-r2*r2)/(2*d);    
    a2 = (d*d+r2*r2-r1*r1)/(2*d);    
    h = sqrt(r1*r1-a1*a1);    
    S1 = r1*r1*asin(h/r1)-a1*h;
    S2 = r2*r2*asin(h/r2)-a2*h;
    S=S1+S2;    
    cout <<setprecision(9)<<fixed<<S<<endl;      
system("pause");
return 0;
}
1
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
29.05.2018, 17:02  [ТС] 8
Цитата Сообщение от Yetty Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
int main() 
{
    double x1, y1, r1, x2, y2, r2, d, a1, a2, h, S1, S2, S;    
    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    d = hypot(x1-x2,y1-y2);   
    a1 = (d*d+r1*r1-r2*r2)/(2*d);    
    a2 = (d*d+r2*r2-r1*r1)/(2*d);    
    h = sqrt(r1*r1-a1*a1);    
    S1 = r1*r1*asin(h/r1)-a1*h;
    S2 = r2*r2*asin(h/r2)-a2*h;
    S=S1+S2;    
    cout <<setprecision(9)<<fixed<<S<<endl;      
system("pause");
return 0;
}
так а в чем моя ошибка?
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
29.05.2018, 17:54 9
Цитата Сообщение от _Milk_ Посмотреть сообщение
так а в чем моя ошибка?
много текста. если серьёзно не вникал, специально для Вас сделал через сегменты, чтобы Вы сравнили строки со своими и выявили ошибки (так как я бы делал через интеграл). навскидку неправильно определяете угол (не используете арксинус), pi при этом условии не нужно использовать, возможно ещё что-то - посмотрите сами.

кстати в дальнейшем (для других задач) для числа Пи рекомендую вместо
Цитата Сообщение от _Milk_ Посмотреть сообщение
const double pi = 3.1415926535897932384626433832795;
использовать M_PI
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
29.05.2018, 18:02  [ТС] 10
Цитата Сообщение от Yetty Посмотреть сообщение
много текста. если серьёзно не вникал, специально для Вас сделал через сегменты, чтобы Вы сравнили строки со своими и выявили ошибки (так как я бы делал через интеграл). навскидку неправильно определяете угол (не используете арксинус), pi при этом условии не нужно использовать, возможно ещё что-то - посмотрите сами.

кстати в дальнейшем (для других задач) для числа Пи рекомендую вместо

использовать M_PI
Хорого спосибо)
0
29.05.2018, 18:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2018, 18:02
Помогаю со студенческими работами здесь

Определить наличие вложенных кругов
Случайным образом формируются координаты X и Y центра и R – радиус 20 кругов. Диапазон значений...

Класс для рисования кругов
Класс для рисования кругов (хранить радиус R и координаты x,y центра). Вычислять площадь круга и...

Рисование кругов по клику мыши
Всем привет. Прошу у Вас помощи реализовать следующую задачку: По клику мышки появляется красный...

Попадает ли точка А в один из кругов , C1(1, 1); , C2(5, 4)?
Напишите программу разветвляющегося вычислительного процесса. Попадает ли точка А в один из...


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

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