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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
#1

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

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

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

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

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

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

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

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

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

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

12
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
03.01.2013, 22:06 #2
а какого типа точки?
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
03.01.2013, 23:44  [ТС] #3
Цитата Сообщение от Nixy Посмотреть сообщение
а какого типа точки?
в задании не сказано, но думаю что "int" если ты про это...
0
Nixy
ComfyMobile
400 / 281 / 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;
 }
как то так
1
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 минут
может кто попроще сделать? или исправить в этом коде выше описанную ошибку
0
Nixy
ComfyMobile
400 / 281 / 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 ночи вы уже спите по большому счету =)
0
Croessmah
Эксперт CЭксперт С++
13411 / 7561 / 855
Регистрация: 27.09.2012
Сообщений: 18,611
Записей в блоге: 3
Завершенные тесты: 1
04.01.2013, 10:34 #7
Цитата Сообщение от Nixy Посмотреть сообщение
это вы заблуждаетесь, можете нарисовать у себя на листочке, и проверить
Название: Безымянный.jpg
Просмотров: 861

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

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

Определить координаты точек пересечения высот - C++
Составить программу,которая по заданным координатам вершин треугольника(Xi,Yi,i=1,2,3) определяла бы координаты точек пересечения высот...

Динамическая матрица (Найти координаты двух точек, наиболее удалённых друг от друга) - C++
Дана динамическая матрица размера N*2 (N вводится). Каждая строка матрицы содержит значения координат X и Y одной точки на плоскости,...

Координаты пересечения двух окружностей - C++
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не меньше 1 и не больше, чем 1000. Они...

Координаты пересечения двух прямоугольников - C++
здравствуйте. сегодня наткнулся на такую задачу: определить координаты левого верхнего и правого нижнего углов общей части 2-х...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
26.01.2013, 23:54
Ответ Создать тему
Опции темы

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