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

Определить, какую фигуру образуют 4 точки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.62
kakao
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 34
26.09.2010, 21:12     Определить, какую фигуру образуют 4 точки #1
Ввести 4 точки на плоскости и определить,какую фигуру они образуют:квадрат,ромб,трапеция,прямоугольник,параллелограмм
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2010, 21:12     Определить, какую фигуру образуют 4 точки
Посмотрите здесь:

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& C++
C++ Функция, проверяющая попадание точки с заданными координатами в фигуру
C++ Определить, по какую сторону плоскости точки
Определить, образуют ли числа арифметическую прогрессию C++
C++ Попадание точки в фигуру на плоскости
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.09.2010, 21:15     Определить, какую фигуру образуют 4 точки #2
квадрат,ромб,прямоугольник частный случай параллелограмма
квадрат частный случай прямоугольника и ромба
как быть
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.09.2010, 21:23     Определить, какую фигуру образуют 4 точки #3
Ответ, по-моему, очевиден - printf("Параллелограмм!");
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.09.2010, 21:25     Определить, какую фигуру образуют 4 точки #4
silent_1991, трапещия остается
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.09.2010, 21:29     Определить, какую фигуру образуют 4 точки #5
printf("Параллелограмм или трапеция!..");
kakao
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 34
26.09.2010, 21:29  [ТС]     Определить, какую фигуру образуют 4 точки #6
подскажите алгоритм выполнения пожалуйста
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.09.2010, 21:33     Определить, какую фигуру образуют 4 точки #7
Смотрите основные свойства приведённых вами фигур. Смотрите азы линейной алгебры. Пишете код. Радуетесь.
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,286
Завершенные тесты: 1
26.09.2010, 21:37     Определить, какую фигуру образуют 4 точки #8
определить длины отрезков (формула есть в гугле). Если они равны, то это либо квадрат, либо ромб.
затем определить углы между смежными отрезками (формула тоже есть в гугле). Если все углы равны 90, то это квадрат, иначе ромб. Если все углы равны 90, а длины сторон не равны, то это прямоугольник. Если есть две параллельные прямые и углы при них равны, это параллелограмм, иначе трапеция.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
27.09.2010, 10:39     Определить, какую фигуру образуют 4 точки #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
///////////////////////////////////////////////////////////////////////////////
//Ввести 4 точки на плоскости и определить,какую фигуру они образуют:
//квадрат,ромб,трапеция,прямоугольник,параллелограмм 
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <complex>
#include <iostream>
#include <set>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef double                 T_coord;
typedef std::complex<T_coord>  T_point;
typedef std::vector<T_point>   T_vertexes;
///////////////////////////////////////////////////////////////////////////////
struct T_point_compare
{
    bool operator() (T_point  p1,  T_point  p2)
    {
        if(p1.real() == p2.real())
        {
            return p1.imag() < p2.imag();
        }
        else
        {
            return p1.real() < p2.real();
        }             
    }
};
///////////////////////////////////////////////////////////////////////////////
typedef std::set<T_point, T_point_compare>   T_vertexes_set;
///////////////////////////////////////////////////////////////////////////////
bool  vectors_are_equally_directed(const T_point& V1, const T_point& V2)
{
    return  arg(V1 / V2) == 0; 
}
///////////////////////////////////////////////////////////////////////////////
void  print_tetragon_type(T_vertexes_set  vertexes_set)
{
    T_vertexes  vertexes(vertexes_set.begin(), vertexes_set.end());
    bool is_trapezia = false;
 
    T_point AB;
    T_point CD;
    T_point AC;
    T_point DB;
 
    while(std::next_permutation(vertexes_set.begin(), vertexes_set.end(), 
          T_point_compare()))
    {
        T_point A = vertexes[0];
        T_point B = vertexes[1];
        T_point C = vertexes[2];
        T_point D = vertexes[3];
 
        AB = B - A;
        CD = D - C;
        AC = C - A;
        DB = B - D;
 
        is_trapezia = vectors_are_equally_directed(AB, CD)
                      && !vectors_are_equally_directed(AB, AC);
 
        //      A-------------------B
        //
        //  C-----------------------------D
        //
        //               или
        //
        //  C-----------------------------D
        //
        //      A-------------------B        
 
        if(is_trapezia) break;
 
    }//while(std::next_permutation(vertexes_set.begin(), vertexes_set.end(), 
    if(!is_trapezia)
    {
        std::cout << "Это не трапеция."
                  << std::endl;    
    }
    else
    {
        bool is_parallelogram  = abs(AB) == abs(CD);
        bool is_equilateral    = abs(AB) == abs(AC);
        bool is_rectangular    = abs(arg(AC / CD)) == acos(-1.0) / 2;
        if(!is_parallelogram)
        {
            std::cout << "Это трапеция."
                      << std::endl;                
        }
        else//Это параллелограмм.
        {
            if(!is_equilateral
               && !is_rectangular)
            {
                std::cout << "Это параллелограмм."
                          << std::endl;               
            }
            else//равносторонний или прямоугольный (ромб, квадрат или прямоугольник)
            {
                if(!is_equilateral)
                {
                    std::cout << "Это прямоугольник."
                              << std::endl;                             
                }
                else//равносторонний
                {
                    if(is_rectangular)
                    {
                         std::cout << "Это квадрат."
                                  << std::endl;              
                    }
                    else
                    {
                          std::cout << "Это ромб."
                                  << std::endl;                                 
                    }                
                }//if(!is_equilateral)//else
            }//if(!is_equilateral && !is_rectangular)//else
        }//if(!is_parallelogram)//else
    }//if(!is_trapezia)//else
}
///////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите координаты вершин четырехугольника: "
              << std::endl;
 
    T_vertexes_set  vertexes_set;
    for(int i = 0; i < 4; ++i)
    {
        T_coord  X;
        T_coord  Y;
        do
        {
            std::cout << 'X'
                      << i + 1
                      << " = ";
            
            std::cin >> X; 
 
            std::cout << 'Y'
                      << i + 1
                      << " = ";
            
            std::cin >> Y;         
        }while(vertexes_set.count(T_point(X, Y)) > 0);
        vertexes_set.insert(T_point(X, Y));
        std::cout << std::endl;
    }
    print_tetragon_type(vertexes_set);
}
Добавлено через 9 часов 24 минуты
Пардон, в предыдущую программу вкрались ошибки.
Вот так будет правильно:
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
///////////////////////////////////////////////////////////////////////////////
//Ввести 4 точки на плоскости и определить,какую фигуру они образуют:
//квадрат,ромб,трапеция,прямоугольник,параллелограмм 
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <complex>
#include <iostream>
#include <set>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef double                 T_coord;
typedef std::complex<T_coord>  T_point;
typedef std::vector<T_point>   T_vertexes;
///////////////////////////////////////////////////////////////////////////////
struct T_point_compare
{
    bool operator() (T_point  p1,  T_point  p2)
    {
        if(p1.real() == p2.real())
        {
            return p1.imag() < p2.imag();
        }
        else
        {
            return p1.real() < p2.real();
        }             
    }
};
///////////////////////////////////////////////////////////////////////////////
typedef std::set<T_point, T_point_compare>   T_vertexes_set;
///////////////////////////////////////////////////////////////////////////////
bool  vectors_are_equally_directed(const T_point& V1, const T_point& V2)
{
    return  arg(V1 / V2) == 0; 
}
///////////////////////////////////////////////////////////////////////////////
void  print_tetragon_type(T_vertexes_set  vertexes_set)
{
    T_vertexes  vertexes(vertexes_set.begin(), vertexes_set.end());
    bool is_trapezia = false;
 
    T_point AB;
    T_point CD;
    T_point AC;
    T_point DB;
    
    while(std::next_permutation(vertexes.begin(), vertexes.end(), 
          T_point_compare()))
    {
        T_point A = vertexes[0];
        T_point B = vertexes[1];
        T_point C = vertexes[2];
        T_point D = vertexes[3];
 
        AB = B - A;
        CD = D - C;
        AC = C - A;
        DB = B - D;
 
        is_trapezia = vectors_are_equally_directed(AB, CD)
                      && !vectors_are_equally_directed(AB, AC)
                      && !vectors_are_equally_directed(AB, -AC);
 
        //      A-------------------B
        //
        //  C-----------------------------D
        //
        //               или
        //
        //  C-----------------------------D
        //
        //      A-------------------B        
 
        if(is_trapezia) break;
 
    }//while(std::next_permutation(vertexes_set.begin(), vertexes_set.end(), 
    if(!is_trapezia)
    {
        std::cout << "Это не трапеция."
                  << std::endl;    
    }
    else
    {
        bool is_parallelogram  = abs(AB) == abs(CD);
        bool is_equilateral    = abs(AB) == abs(AC);
        bool is_rectangular    = abs(arg(AC / CD)) == acos(-1.0) / 2;
        if(!is_parallelogram)
        {
            std::cout << "Это трапеция."
                      << std::endl;                
        }
        else//Это параллелограмм.
        {
            if(!is_equilateral
               && !is_rectangular)
            {
                std::cout << "Это параллелограмм."
                          << std::endl;               
            }
            else//равносторонний или прямоугольный (ромб, квадрат или прямоугольник)
            {
                if(!is_equilateral)
                {
                    std::cout << "Это прямоугольник."
                              << std::endl;                             
                }
                else//равносторонний
                {
                    if(is_rectangular)
                    {
                         std::cout << "Это квадрат."
                                  << std::endl;              
                    }
                    else
                    {
                          std::cout << "Это ромб."
                                  << std::endl;                                 
                    }                
                }//if(!is_equilateral)//else
            }//if(!is_equilateral && !is_rectangular)//else
        }//if(!is_parallelogram)//else
    }//if(!is_trapezia)//else
}
///////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите координаты вершин четырехугольника: "
              << std::endl;
 
    T_vertexes_set  vertexes_set;
    for(int i = 0; i < 4; ++i)
    {
        T_coord  X;
        T_coord  Y;
        do
        {
            std::cout << 'X'
                      << i + 1
                      << " = ";
            
            std::cin >> X; 
 
            std::cout << 'Y'
                      << i + 1
                      << " = ";
            
            std::cin >> Y;         
        }while(vertexes_set.count(T_point(X, Y)) > 0);
        vertexes_set.insert(T_point(X, Y));
        std::cout << std::endl;
    }
    print_tetragon_type(vertexes_set);
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.09.2010, 11:11     Определить, какую фигуру образуют 4 точки #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
как быть
Элементарно. Выявляй сначала общий случай (четырёхугольник, условие - все точки различны и лежат в одной плоскости), потом последовательно всё частные. Первый частный случай - параллелограм (частный случай четырёхугольника), вторых два: ромб и прямоугольник (частные случаи параллелограма), третий квадрат (частный случай сразу и ромба и прямоугольника). Если наблюдается какой нибудь частный случай, но не следующий за ним, то пиши только его. Например, если выявлены четырёхугольник, параллелограм и прямоугольник, но не ромб и не квадрат, то пиши только "прямоугольник", но не пиши ни "четырёхугольник" ни "параллелограм". А если выявлен только общий случай и не выявлен ни один частный, то пиши "четырёхугольник". И никаких гвоздёв. Если точки не лежат на одной прямой, но две совпадают, то придётся написать "треугольник", а если из четырёх точек одна не лежит в плоскости остальных трёх, то пиши "треугольная пирамида", можно ещё для неё анализировать частный случай - тетраэдр и если выявляется именно он, то писать "тетраэдр", но не писать "треугольная пирамида", а если предположение о тетраэдре не подтверждается, то тогда "треугольная пирамида". Но проверка принадлежности точек одной плоскости должна выполняться только в том случае, если даны точки в пространстве (с тремя координатами).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2010, 14:21     Определить, какую фигуру образуют 4 точки
Еще ссылки по теме:

Определить, образуют ли элементы массива прогрессию C++
C++ Определить, образуют ли элементы массива арифметическую прогрессию
По заданным целочисленным координатам на плоскости определить какую геометрическую фигуру они образуют C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.09.2010, 14:21     Определить, какую фигуру образуют 4 точки #11
taras atavin,
Да мы с alex_x_x, извиняюсь за выражение, прикалывались)))
Yandex
Объявления
27.09.2010, 14:21     Определить, какую фигуру образуют 4 точки
Ответ Создать тему
Опции темы

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