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

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

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

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

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

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

Добавлено через 2 часа 16 минут
ап, очень надо...
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++
С клавиатуры вводится радиус окружности с центром в начале координат. Найти координаты точек пересечения окружности с экспонентой и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nixy
ComfyMobile
400 / 281 / 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
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;
 }
как то так
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
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 ночи вы уже спите по большому счету =)
Croessmah
Модератор
Эксперт CЭксперт С++
13154 / 7417 / 831
Регистрация: 27.09.2012
Сообщений: 18,254
Записей в блоге: 3
Завершенные тесты: 1
04.01.2013, 10:34 #7
Цитата Сообщение от Nixy Посмотреть сообщение
это вы заблуждаетесь, можете нарисовать у себя на листочке, и проверить
Название: Безымянный.jpg
Просмотров: 860

Размер: 18.9 Кб
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;
 }
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
400 / 281 / 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
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;
}
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;
}
спасибо большое, в даном случае скорость мне не очень важна...
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-х...


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

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

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