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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
03.01.2013, 21:38     Найти координаты точек пересечения двух кругов #1
Помогите, пожалуйста, решить такую задачу, очень нужен код ...
С клавиатуры вводятся радиусы и координаты центров двух кругов. Найти координаты точек пересечения этих кругов и сформировать из них множество А.

Добавлено через 2 часа 16 минут
ап, очень надо...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 21:38     Найти координаты точек пересечения двух кругов
Посмотрите здесь:

координаты пересечения двух прямоугольников C++
координаты точек пересечения прямой y=kx+b и окружности радиуса R C++
C++ Динамическая матрица (Найти координаты двух точек, наиболее удалённых друг от друга)
C++ Определить, сколько точек пересечения имеют прямая и окружность и найти координаты этих точек
C++ найти точки пересечения 2 кругов с вводом с клавиатуры центрами и радиусами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
03.01.2013, 22:06     Найти координаты точек пересечения двух кругов #2
а какого типа точки?
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
03.01.2013, 23:44  [ТС]     Найти координаты точек пересечения двух кругов #3
Цитата Сообщение от Nixy Посмотреть сообщение
а какого типа точки?
в задании не сказано, но думаю что "int" если ты про это...
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 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;
 }
как то так
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
04.01.2013, 01:28  [ТС]     Найти координаты точек пересечения двух кругов #5
спасибо большое, но кроме правильных, она находит лишние точки =) например если центр 1 в точке (0;0) , а центр 2 в точке (2;2), и радиусы обоих кругов = 2, то ответ должен быть (0;2) и (2;0), а программа еще выводит (1;1)

Добавлено через 7 минут
может кто попроще сделать? или исправить в этом коде выше описанную ошибку
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 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 ночи вы уже спите по большому счету =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11840 / 6819 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 10:34     Найти координаты точек пересечения двух кругов #7
Цитата Сообщение от Nixy Посмотреть сообщение
это вы заблуждаетесь, можете нарисовать у себя на листочке, и проверить
Название: Безымянный.jpg
Просмотров: 851

Размер: 18.9 Кб
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 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;
 }
TheVlad
5 / 5 / 1
Регистрация: 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;
заменил <= на ==, вроде работает
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
04.01.2013, 17:57     Найти координаты точек пересечения двух кругов #10
правильно это я немного погнал, удалить просто получится присвоение, а нам нужно сравнение замените на = чтоб получить ==
TheVlad
5 / 5 / 1
Регистрация: 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;
}
вот скрин...

думаю что из за того, что типы все таки должны быть не целочисельные, но исправил на флоат, ничего не изменилось....
Миниатюры
Найти координаты точек пересечения двух кругов  
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2013, 23:54     Найти координаты точек пересечения двух кругов
Еще ссылки по теме:

Найти координаты точек пересечения окружности с экспонентой и сформировать из них множество А C++
C++ Найти координаты точек пересечения параболы и экспоненты
Найти количество и координаты точек пересечения 2-х эллипсов C++

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

Или воспользуйтесь поиском по форуму:
TheVlad
5 / 5 / 1
Регистрация: 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;
}
спасибо большое, в даном случае скорость мне не очень важна...
Yandex
Объявления
26.01.2013, 23:54     Найти координаты точек пересечения двух кругов
Ответ Создать тему
Опции темы

Текущее время: 21:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru