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

Найти координаты точек пересечения двух кругов

03.01.2013, 21:38. Показов 7185. Ответов 12
Метки нет (Все метки)

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

Добавлено через 2 часа 16 минут
ап, очень надо...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2013, 21:38
Ответы с готовыми решениями:

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

Найти координаты точек пересечения
Для заданной окружности и луча в плоскости определить, пересекает ли луч окружность. Найти...

Найти координаты точек пересечения параболы и экспоненты
Есть два задания, которые так и не смог осилить (с остальными справился) Очень нужна помощь. 1 . С...

Найти координаты точек пересечения прямой и окружности
Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром в начале...

12
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
03.01.2013, 22:06 2
а какого типа точки?
0
5 / 5 / 5
Регистрация: 24.10.2012
Сообщений: 102
03.01.2013, 23:44  [ТС] 3
Цитата Сообщение от Nixy Посмотреть сообщение
а какого типа точки?
в задании не сказано, но думаю что "int" если ты про это...
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
04.01.2013, 00:31 4
да про это щас накатаю

Добавлено через 44 минуты
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
 #include <iostream>
 #include <math.h>
 #include "windows.h"
 #include <vector>
 
 using namespace std;
 
 struct point{
     point( int x_,int y_){ x = x_; y = y_ ;};
     int x;
     int y;
 };
 
 bool inCircle(point O,point p,int R){
    return pow((float)(O.x-p.x),2)+pow((float)(O.y-p.y),2) <= R*R ? true : false;
 }
 int main()
 {
     SetConsoleCP(1251);
     SetConsoleOutputCP(1251);
     point O1(0,0),O2(0,0);
     int R1,R2;
     vector<point>  arr;
     cout << "Введите координаты 1 центра" << endl;
     cin >> O1.x >> O1.y ;
     cout << "Введите координаты 2 центра" << endl;
     cin >> O2.x >> O2.y ;
     cout << "Введите радиусы R1 , R2 " << endl;
     cin >> R1 >> R2;
 
     for (int x = O1.x-R1 < O2.x-R2 ? O1.x-R1 : O2.x-R2 ,
              endx =O1.x+R1 > O2.x+R2 ? O1.x+R1 : O2.x+R2;
              x < endx  ; x++) {
        for (int y = O1.y-R1 < O2.y-R2 ? O1.y-R1 : O2.y-R2,
                 endy = O1.y+R1 > O2.y+R2 ? O1.y+R1 : O2.y+R2  ;
              y < endy ; y++) {
             if (inCircle(O1,point(x,y),R1) & inCircle(O2,point(x,y),R2)) {
                arr.push_back(point(x,y));
             }
        }
 
     }
     for (int i = 0; i < arr.size(); ) {
       for (int j = 0; (j < 5 & i < arr.size()) ; j++ ,i++) {
            cout << " x "<< arr[i].x << " y " <<arr[i].y << " ";
       }
       cout << endl;
     }
     system("pause");
     return 0;
 }
как то так
1
5 / 5 / 5
Регистрация: 24.10.2012
Сообщений: 102
04.01.2013, 01:28  [ТС] 5
спасибо большое, но кроме правильных, она находит лишние точки =) например если центр 1 в точке (0;0) , а центр 2 в точке (2;2), и радиусы обоих кругов = 2, то ответ должен быть (0;2) и (2;0), а программа еще выводит (1;1)

Добавлено через 7 минут
может кто попроще сделать? или исправить в этом коде выше описанную ошибку
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
04.01.2013, 10:22 6
Цитата Сообщение от TheVlad Посмотреть сообщение
спасибо большое, но кроме правильных, она находит лишние точки =) например если центр 1 в точке (0;0) , а центр 2 в точке (2;2), и радиусы обоих кругов = 2, то ответ должен быть (0;2) и (2;0), а программа еще выводит (1;1)
это вы заблуждаетесь, можете нарисовать у себя на листочке, и проверить, я же тут могу вам привести формулы расчета чтоб вы убедились
O1 (0,0) p(1,1) (1-0)2+(1-0)2 <=4 уравнение окружности будет чистое равенство, 2<4 верно точка p лежит внутри круга (0,0,2)
O2 (2,2) p(1,1) (1-2)2+(1-2)2 <= 4 2<4 верно точка лежит внутри круга,
для p2(2,0) (2-0)2+(0-0)2<=4 или (2-2)2+(0-2)2 <=4 тоже верно и для третьей точки, просто в 1 ночи вы уже спите по большому счету =)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
04.01.2013, 10:34 7
Цитата Сообщение от Nixy Посмотреть сообщение
это вы заблуждаетесь, можете нарисовать у себя на листочке, и проверить
Название: Безымянный.jpg
Просмотров: 934

Размер: 18.9 Кб
1
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
04.01.2013, 10:47 8
круг а вы мне окружности нарисовали )

Добавлено через 5 минут
ну если ТСу нужны именно координаты пересечения то Окружностей то уберите знак " < "
C++
1
2
3
bool inCircle(point O,point p,int R){
    return pow((float)(O.x-p.x),2)+pow((float)(O.y-p.y),2) <= R*R ? true : false;
 }
1
5 / 5 / 5
Регистрация: 24.10.2012
Сообщений: 102
04.01.2013, 17:57  [ТС] 9
Цитата Сообщение от Nixy Посмотреть сообщение
ну если ТСу нужны именно координаты пересечения то Окружностей то уберите знак " < "
моя вина, да я имел введу именно окружности...спасибо

Добавлено через 21 минуту
Цитата Сообщение от Nixy Посмотреть сообщение
return pow((float)(O.x-p.x),2)+pow((float)(O.y-p.y),2) <= R*R ? true : false;
столкнулся с проблемой, если удалить < , то ругается на pow, думал что из за того что у R тип int, но смена типа не помагает, и еще кажется функция перегружена ...

Добавлено через 13 минут
Цитата Сообщение от TheVlad Посмотреть сообщение
return pow((float)(O.x-p.x),2)+pow((float)(O.y-p.y),2) <= R*R ? true : false;
заменил <= на ==, вроде работает
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
04.01.2013, 17:57 10
правильно это я немного погнал, удалить просто получится присвоение, а нам нужно сравнение замените на = чтоб получить ==
0
5 / 5 / 5
Регистрация: 24.10.2012
Сообщений: 102
26.01.2013, 20:56  [ТС] 11
Цитата Сообщение от Nixy Посмотреть сообщение
правильно это я немного погнал, удалить просто получится присвоение, а нам нужно сравнение замените на = чтоб получить ==
поднимаю вопрос насчет этой программы, можеш пожалуйста пересмотреть, ато она не правильно работает, например если вводить (1;2) (3;5) R1=2 R2=2, то ничего не выводит, ну и в большинстве других случаев.....

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
 #include <cmath>
 #include <Windows.h>
 #include <vector>
 
 using namespace std;
 
 void lines(int, char []);
 
 struct point
 {
     point( float x_,float y_) { x = x_; y = y_;};
     float x;
     float y;
 };
 
 bool inCircle(point O,point p,float R)
 {
    return pow((float)(O.x-p.x),2)+pow((float)(O.y-p.y),2) == R*R ? true : false;
 }
 
 int main()
 {
     setlocale(0,"");
     point O1(0,0), O2(0,0);
     float R1, R2, d;
     vector <point> arr;
 
     cout<<"Введiть координать центра 1-го кола:"<<endl;
     cout<<"x=";
     cin>>O1.x;
     cout<<"y=";
     cin>>O1.y ;
     lines(40,"-");
     cout<<"Введiть координать центра 2-го кола:"<<endl;
     cout<<"x=";
     cin>>O2.x;
     cout<<"y=";
     cin>>O2.y;
     lines(40,"-");
     cout<<"Введiть радiуси двох кiл(1-го та 2-го):"<<endl;
     cout<<"R1=";
     cin>>R1;
     cout<<"R2=";
     cin>>R2;
 
     d = sqrt(pow((O1.x - O2.x),2)+pow((O1.y - O2.y),2));
 
     lines(40,"-");
    if((R1 - R2) < d && d <(R1 + R2))
    {
     for (float x = O1.x-R1 < O2.x-R2 ? O1.x-R1 : O2.x-R2,
              endx =O1.x+R1 > O2.x+R2 ? O1.x+R1 : O2.x+R2;
              x < endx  ; x++)
     {
        for (float y = O1.y-R1 < O2.y-R2 ? O1.y-R1 : O2.y-R2,
                 endy = O1.y+R1 > O2.y+R2 ? O1.y+R1 : O2.y+R2  ;
              y < endy ; y++)
        {
             if (inCircle(O1,point(x,y),R1) & inCircle(O2,point(x,y),R2))
             {
                arr.push_back(point(x,y));
             }
        }
     }
 
     for (int i = 0; i < arr.size();)
     {
       for (int j = 0; (j < 5 & i < arr.size()) ; j++ ,i++)
       {
            cout << "("<< arr[i].x << ";" <<arr[i].y << ")\t";
       }
       cout << endl;
     }
    }
    else cout<<"Кола не перетинаються!\n";
     system("pause");
     return 0;
 }
 
void lines(int x, char p[])
{
    for(int i = 0; i < x; i++)
    {
        cout<<p;
    }
    cout<<endl;
}
вот скрин...

думаю что из за того, что типы все таки должны быть не целочисельные, но исправил на флоат, ничего не изменилось....
Миниатюры
Найти координаты точек пересечения двух кругов  
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
26.01.2013, 22:32 12
если менять на плавуюшую запятую то нужна определенная точность, так как при этом у нас в мантисе числа всегда есть мусор и в общем случае два числа с плавающей запятой не равны друг другу даже если при подсчете должны были бы быть

Добавлено через 6 минут
так же придется перебирать точки с заданой точностью, это сильно скажется на скорости программы

Добавлено через 29 минут
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
 #include <cmath>
 #include <Windows.h>
 #include <vector>
 
 using namespace std;
 
 const double epsilon = 1E-2;
 
 void lines(int, char []);
 
 struct point
 {
     point( double x_,double y_) { x = x_; y = y_;};
     double x;
     double y;
 };
 
 bool inCircle(point O,point p,double R)
 {
    return abs(pow((O.x-p.x),2)+pow((O.y-p.y),2) - R*R) <= epsilon  ? true : false;
 }
 
 int main()
 {
     setlocale(0,"");
     point O1(0,0), O2(0,0);
     float R1, R2, d;
     vector <point> arr;
 
     cout<<"Введiть координать центра 1-го кола:"<<endl;
     cout<<"x=";
     cin>>O1.x;
     cout<<"y=";
     cin>>O1.y ;
     lines(40,"-");
     cout<<"Введiть координать центра 2-го кола:"<<endl;
     cout<<"x=";
     cin>>O2.x;
     cout<<"y=";
     cin>>O2.y;
     lines(40,"-");
     cout<<"Введiть радiуси двох кiл(1-го та 2-го):"<<endl;
     cout<<"R1=";
     cin>>R1;
     cout<<"R2=";
     cin>>R2;
 
     d = sqrt(pow((O1.x - O2.x),2)+pow((O1.y - O2.y),2));
 
     lines(40,"-");
    if((R1 - R2) < d && d <(R1 + R2))
    {
     for (double x = O1.x-R1 < O2.x-R2 ? O1.x-R1 : O2.x-R2,
              endx =O1.x+R1 > O2.x+R2 ? O1.x+R1 : O2.x+R2;
              x < endx  ; x+=epsilon)
     {
        for (double y = O1.y-R1 < O2.y-R2 ? O1.y-R1 : O2.y-R2,
                 endy = O1.y+R1 > O2.y+R2 ? O1.y+R1 : O2.y+R2  ;
              y < endy ; y+=epsilon)
        {
             if (inCircle(O1,point(x,y),R1) & inCircle(O2,point(x,y),R2))
             {
                arr.push_back(point(x,y));
             }
        }
     }
 
     for (int i = 0; i < arr.size();)
     {
       for (int j = 0; (j < 5 & i < arr.size()) ; j++ ,i++)
       {
            cout << "("<< arr[i].x << ";" <<arr[i].y << ")\t";
       }
       cout << endl;
     }
    }
    else cout<<"Кола не перетинаються!\n";
     system("pause");
     return 0;
 }
 
void lines(int x, char p[])
{
    for(int i = 0; i < x; i++)
    {
        cout<<p;
    }
    cout<<endl;
}
1
5 / 5 / 5
Регистрация: 24.10.2012
Сообщений: 102
26.01.2013, 23:54  [ТС] 13
Цитата Сообщение от Nixy Посмотреть сообщение
если менять на плавуюшую запятую то нужна определенная точность, так как при этом у нас в мантисе числа всегда есть мусор и в общем случае два числа с плавающей запятой не равны друг другу даже если при подсчете должны были бы быть

Добавлено через 6 минут
так же придется перебирать точки с заданой точностью, это сильно скажется на скорости программы

Добавлено через 29 минут
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <cmath>
#include <Windows.h>
#include <vector>
 
 using namespace std;
 
 const double epsilon = 1E-2;
 
 void lines(int, char []);
 
 struct point
 {
     point( double x_,double y_) { x = x_; y = y_;};
     double x;
     double y;
 };
 
 bool inCircle(point O,point p,double R)
 {
    return abs(pow((O.x-p.x),2)+pow((O.y-p.y),2) - R*R) <= epsilon  ? true : false;
 }
 
 int main()
 {
     setlocale(0,"");
     point O1(0,0), O2(0,0);
     float R1, R2, d;
     vector <point> arr;
 
     cout<<"Введiть координать центра 1-го кола:"<<endl;
     cout<<"x=";
     cin>>O1.x;
     cout<<"y=";
     cin>>O1.y ;
     lines(40,"-");
     cout<<"Введiть координать центра 2-го кола:"<<endl;
     cout<<"x=";
     cin>>O2.x;
     cout<<"y=";
     cin>>O2.y;
     lines(40,"-");
     cout<<"Введiть радiуси двох кiл(1-го та 2-го):"<<endl;
     cout<<"R1=";
     cin>>R1;
     cout<<"R2=";
     cin>>R2;
 
     d = sqrt(pow((O1.x - O2.x),2)+pow((O1.y - O2.y),2));
 
     lines(40,"-");
    if((R1 - R2) < d && d <(R1 + R2))
    {
     for (double x = O1.x-R1 < O2.x-R2 ? O1.x-R1 : O2.x-R2,
              endx =O1.x+R1 > O2.x+R2 ? O1.x+R1 : O2.x+R2;
              x < endx  ; x+=epsilon)
     {
        for (double y = O1.y-R1 < O2.y-R2 ? O1.y-R1 : O2.y-R2,
                 endy = O1.y+R1 > O2.y+R2 ? O1.y+R1 : O2.y+R2  ;
              y < endy ; y+=epsilon)
        {
             if (inCircle(O1,point(x,y),R1) & inCircle(O2,point(x,y),R2))
             {
                arr.push_back(point(x,y));
             }
        }
     }
 
     for (int i = 0; i < arr.size();)
     {
       for (int j = 0; (j < 5 & i < arr.size()) ; j++ ,i++)
       {
            cout << "("<< arr[i].x << ";" <<arr[i].y << ")\t";
       }
       cout << endl;
     }
    }
    else cout<<"Кола не перетинаються!\n";
     system("pause");
     return 0;
 }
 
void lines(int x, char p[])
{
    for(int i = 0; i < x; i++)
    {
        cout<<p;
    }
    cout<<endl;
}
спасибо большое, в даном случае скорость мне не очень важна...
0
26.01.2013, 23:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2013, 23:54
Помогаю со студенческими работами здесь

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

Найти координаты точек пересечения прямой y=kx+b и окружности
Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром в начале...

Найти координаты точек пересечения окружности с экспонентой и сформировать из них множество А
С клавиатуры вводится радиус окружности с центром в начале координат. Найти координаты точек...

Нужно найти количество общих(целых) точек(координат) у двух кругов
Нужно найти количество общих(целых) точек(координат) у двух кругов. Координаты центра окружности и...


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

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