Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249

Неправильно определяется вхождение точки в пятиугольник или площадь пятиугольника

13.12.2014, 14:51. Показов 1413. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
См. pentagon.cpp, строка 55. Считается сумма площадей треугольников, которые состоят из двух последовательных точек пятиугольника, и искомой точки, и из этой суммы вычитается площадь пятиугольника, которая тоже считается через треугольники.
Программа работает некорректно при прямоугольнике из точек (1, 0), (1, 2), (4, 2), (4, 0) и пятиугольнике из точек (0, 0), (1, 2), (4, 4), (5, 2), (5, 0). Ошибка уже на точке (1, 0). Помогите пожалуйста найти ошибку.
 Комментарий модератора 
Задачу, коды программ и формулы надо переписывать!
Редактор формул внизу страницы.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2014, 14:51
Ответы с готовыми решениями:

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

HDD определяется в BIOS но не запускается и неправильно определяется объем диска
Всем доброго времени суток, прошу вас о помощи в борьбе с моим винтом от ноута. Попробую описать подробно, как все было. В один прекрасный...

Площадь пятиугольника
Даны действительные числа a,b,c,d. Найти площадь пятиугольника, изображенного на рисунке. Определить процедуру вычисления площади ...

2
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
13.12.2014, 14:57  [ТС]
Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

pentagon.cpp:
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
#include "pentagon.h"
 
Pentagon::Pentagon(string i, float x1_, float y1_, float x2_, float y2_, float x3_, float y3_, float x4_, float y4_, float x5_, float y5_)
{
    x1 = x1_;
    y1 = y1_;
    x2 = x2_;
    y2 = y2_;
    x3 = x3_;
    y3 = y3_;
    x4 = x4_;
    y4 = y4_;
    x5 = x5_;
    y5 = y5_;
}
 
Pentagon::Pentagon(const Pentagon &right) : Rectangle(right)
{
    x5 = right.x5;
    y5 = right.y5;
}
 
ostream& operator << (ostream &out, const Pentagon &right)
{
    out << "(" << right.x1 << ", " << right.y1 << "), (" << right.x2 << ", " << right.y2 << "), ("
        << right.x3 << ", " << right.y3 << "), (" << right.x4 << ", " << right.y4 << "), ("
        << right.x5 << ", " << right.y5 << ")";
    return out;
}
 
void Pentagon::Move(float dx, float dy)
{
    Rectangle::Move(dx, dy);
    x5 += dx, y5 += dy;
}
 
bool Pentagon::IsInclude(const Pentagon &right) const
{
    if (IsInclude(right.x1, right.y1) && IsInclude(right.x2, right.y2) &&
        IsInclude(right.x3, right.y3) && IsInclude(right.x4, right.y4) && IsInclude(right.x5, right.y5))
        return true;
    else
        return false;
}
 
bool Pentagon::IsInclude(const Rectangle &right) const
{
    if (IsInclude(right.x1, right.y1) && IsInclude(right.x2, right.y2) &&
        IsInclude(right.x3, right.y3) && IsInclude(right.x4, right.y4))
        return true;
    else
        return false;
}
 
bool Pentagon::IsInclude(float x, float y) const
{
    return (abs(S(x1, y1, x2, y2, x, y) + S(x2, y2, x3, y3, x, y) + S(x3, y3, x4, y4, x, y) + S(x4, y4, x5, y5, x, y) + S(x1, y1, x5, y5, x, y) -
        S(x1, y1, x2, y2, x3, y3) - S(x1, y1, x3, y3, x4, y4) - S(x1, y1, x4, y4, x5, y5)) < E);
}
 
float Pentagon::minX() const
{
    float res = x1;
    if (x2 <= res)
        res = x2;
    if (x3 <= res)
        res = x3;
    if (x4 <= res)
        res = x4;
    if (x5 <= res)
        res = x5;
    return res;
}
 
float Pentagon::maxX() const
{
    float res = x1;
    if (x2 >= res)
        res = x2;
    if (x3 >= res)
        res = x3;
    if (x4 >= res)
        res = x4;
    if (x5 >= res)
        res = x5;
    return res;
}
 
float Pentagon::maxY() const
{
    float res = y1;
    if (y2 >= res)
        res = y2;
    if (y3 >= res)
        res = y3;
    if (y4 >= res)
        res = y4;
    if (y5 >= res)
        res = y5;
    return res;
}
 
float Pentagon::minY() const
{
    float res = y1;
    if (y2 <= res)
        res = y2;
    if (y3 <= res)
        res = y3;
    if (y4 <= res)
        res = y4;
    if (y5 <= res)
        res = y5;
    return res;
}
 
void Pentagon::Clear()
{
    Rectangle::Clear();
    x5 = 0, y5 = 0;
}
 
bool Pentagon::IsEmpty()
{
    return (Rectangle::IsEmpty() && x5 == 0 && y5 == 0);
}
rectangle.cpp (тут считается площадь):
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
#include "rectangle.h"
#include "pentagon.h"
#include <iostream>
using namespace std;
 
Rectangle::Rectangle(string i, float x1_, float y1_, float x2_, float y2_, float x3_, float y3_, float x4_, float y4_)
{
    id = i;
    if (IsRectangle(x1_, y1_, x2_, y2_, x3_, y3_, x4_, y4_))
    {
        x1 = x1_;
        y1 = y1_;
        x2 = x2_;
        y2 = y2_;
        x3 = x3_;
        y3 = y3_;
        x4 = x4_;
        y4 = y4_;
    }
    else
        x1 = x2 = x3 = x4 = y1 = y2 = y3 = y4 = 0;
}
 
bool Rectangle::IsRectangle(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
{
    if (abs(d(x1, y1, x4, y4) - d(x2, y2, x3, y3)) <= E && abs(d(x1, y1, x2, y2) - d(x3, y3, x4, y4)) <= E &&
        abs(d(x1, y1, x3, y3) - d(x2, y2, x4, y4)) <= E) // у прямоугольника равны противоположные стороны и диагонали. сравниваем разность с точностью
        return true;
    else
        return false;
}
 
float Rectangle::d(float x1, float y1, float x2, float y2)
{
    return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
}
 
float Rectangle::S(float x1, float y1, float x2, float y2, float x3, float y3) // площать треугольника
{
    float p = (d(x1, y1, x2, y2) + d(x2, y2, x3, y3) + d(x1, y1, x3, y3)) / 2;
    return sqrt(p*(p - d(x1, y1, x2, y2))*(p - d(x2, y2, x3, y3))*(p - d(x1, y1, x3, y3)));
}
 
const float Rectangle::E = 10e-7;
 
Rectangle::Rectangle(const Rectangle &right)
{
    x1 = right.x1;
    y1 = right.y1;
    x2 = right.x2;
    y2 = right.y2;
    x3 = right.x3;
    y3 = right.y3;
    x4 = right.x4;
    y4 = right.y4;
}
 
ostream& operator << (ostream &out, const Rectangle &right)
{
    out << "(" << right.x1 << ", " << right.y1 << "), (" << right.x2 << ", " << right.y2 << "), ("
        << right.x3 << ", " << right.y3 << "), (" << right.x4 << ", " << right.y4 << ")";
    return out;
}
 
void Rectangle::Move(float dx, float dy)
{
    x1 += dx, x2 += dx, x3 += dx, x4 += dx;
    y1 += dy, y2 += dy, y3 += dy, y4 += dy;
}
 
bool Rectangle::IsInclude(const Rectangle &right) const
{
    if (IsInclude(right.x1, right.y1) && IsInclude(right.x2, right.y2) &&
        IsInclude(right.x3, right.y3) && IsInclude(right.x4, right.y4))
        return true;
    else
        return false;
}
 
bool Rectangle::IsInclude(const Pentagon &right) const
{
    if (IsInclude(right.x1, right.y1) && IsInclude(right.x2, right.y2) && IsInclude(right.x3, right.y3) &&
        IsInclude(right.x4, right.y4) && IsInclude(right.x5, right.y5))
        return true;
    else
        return false;
}
 
bool Rectangle::IsInclude(float x, float y) const
{
    return (abs(S(x1, y1, x2, y2, x, y) + S(x2, y2, x3, y3, x, y) + S(x3, y3, x4, y4, x, y) + S(x1, y1, x4, y4, x, y) -
        S(x1, y1, x2, y2, x3, y3) - S(x1, y1, x3, y3, x4, y4)) < E);
}
 
float Rectangle::minX() const
{
    float res = x1;
    if (x2 <= res)
        res = x2;
    if (x3 <= res)
        res = x3;
    if (x4 <= res)
        res = x4;
    return res;
}
 
float Rectangle::maxX() const
{
    float res = x1;
    if (x2 >= res)
        res = x2;
    if (x3 >= res)
        res = x3;
    if (x4 >= res)
        res = x4;
    return res;
}
 
float Rectangle::maxY() const
{
    float res = y1;
    if (y2 >= res)
        res = y2;
    if (y3 >= res)
        res = y3;
    if (y4 >= res)
        res = y4;
    return res;
}
 
float Rectangle::minY() const
{
    float res = y1;
    if (y2 <= res)
        res = y2;
    if (y3 <= res)
        res = y3;
    if (y4 <= res)
        res = y4;
    return res;
}
 
void Rectangle::Clear()
{
    x1 = 0, x2 = 0, x3 = 0, x4 = 0;
    y1 = 0, y2 = 0, y3 = 0, y4 = 0;
}
 
bool Rectangle::IsEmpty()
{
    return (x1 == 0 && x2 == 0 && x3 == 0 && x4 == 0 &&
        y1 == 0 && y2 == 0 && y3 == 0 && y4 == 0);
}
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
13.12.2014, 15:58  [ТС]
Остальные файлы программы:
main.cpp:
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
#include "factory.h"
#include <iostream>
using namespace std;
 
int Menu()
{
    system("cls");
    cout << "1 - Вывести информацию о фигурах\n"
        << "2 - Очистить фигуры\n"
        << "3 - Создать фигуры\n"
        << "4 - Передвинуть прямоугольник\n"
        << "5 - Передвинуть пятиугольник\n"
        << "6 - Проверить, входят ли фигуры друг в друга\n"
        << "0 - Выйти из программы\n"
        << "Выберите действие: ";
    int vybor;
    cin >> vybor;
    cout << endl;
    return vybor;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    cout << "СОЗДАНИЕ ПРЯМОУГОЛЬНИКА...\n";
    Rectangle r = Factory::CreateRectangle();
    cout << "СОЗДАНИЕ ПЯТИУГОЛЬНИКА...\n";
    Pentagon p = Factory::CreatePentagon();
    float dx, dy;
 
    while (true)
    {
        switch (Menu())
        {
        case 1: if (r.IsEmpty())
                {
                    cout << "Фигуры еще не созданы!\n";
                    break;
                }
            cout << "Точки прямоугольника: " << r << endl
                << "Точки пятиугольника: " << p << endl;
            break;
        case 2: if (r.IsEmpty())
                {
                    cout << "Фигуры еще не созданы!\n";
                    break;
                }
                r.Clear(); p.Clear(); break;
        case 3: if (!r.IsEmpty())
                {
                    cout << "Фигуры уже созданы!\n";
                    break;
                }
                cout << "СОЗДАНИЕ ПРЯМОУГОЛЬНИКА...\n";
                r = Factory::CreateRectangle();
                cout << "СОЗДАНИЕ ПЯТИУГОЛЬНИКА...\n";
                p = Factory::CreatePentagon();
                break;
        case 4: if (r.IsEmpty())
                {
                    cout << "Прямоугольник еще не создан!\n";
                    break;
                }
            cout << "dx dy: ";
            cin >> dx >> dy;
            r.Move(dx, dy);
            break;
        case 5: if (p.IsEmpty())
                {
                    cout << "Пятиугольник еще не создан!\n";
                    break;
                }
            cout << "dx dy: ";
            cin >> dx >> dy;
            p.Move(dx, dy);
            break;
        case 6: if (r.IsEmpty())
                {
                    cout << "Фигуры еще не созданы!\n";
                    break;
                }
            if (r.IsInclude(p))
                cout << "Пятиугольник входит в прямоугольник\n";
            if (p.IsInclude(r))
                cout << "Прямоугольник входит в пятиугольник\n";
            if (!r.IsInclude(p) && !p.IsInclude(r))
                cout << "Ни одна из фигур не входит в другую\n";
            break;
        case 0: return 0;
        }
        system("pause");
    }
}
rectangle.h:
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
#ifndef RECTANGLE_H
#define RECTANGLE_H
 
#include <string>
using namespace std;
 
class Rectangle
{
    friend class Pentagon;
    friend class Factory;
public:
    Rectangle(string i = "", float x1_ = 0, float y1_ = 0, float x2_ = 0, float y2_ = 0,
        float x3_ = 0, float y3_ = 0, float x4_ = 0, float y4_ = 0);
    Rectangle(const Rectangle &right);
 
    void Clear();
    bool IsEmpty();
    friend ostream& operator << (ostream &out, const Rectangle &right);
 
    void Move(float dx, float dy);
    bool IsInclude(const Rectangle &right) const;
    bool IsInclude(const Pentagon &right) const;
 
    static bool IsRectangle(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);
 
protected:
    string id;
    float x1, y1, x2, y2, x3, y3, x4, y4;
     float minX() const;
     float minY() const;
     float maxX() const;
     float maxY() const;
    static float d(float x1, float y1, float x2, float y2);
    static const float E; // точность - вычисленные дробные числа нельзя сравнивать, т.к. очень часто есть погрешность.
    static float S(float x1, float y1, float x2, float y2, float x3, float y3); // площать треугольника - потребуется при определении вхождения
    bool IsInclude(float x, float y) const; // вхождение точки в прямоугольник
    // поэтому проверяем, чтобы модуль разности чисел был меньше точности
};
 
#endif
pentagon.h:
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
#ifndef PENTAGON_H
#define PENTAGON_H
 
#include "rectangle.h"
#include <string>
using namespace std;
 
class Pentagon : public Rectangle
{
    friend class Factory;
    friend class Rectangle;
public:
    Pentagon(string i = "", float x1_ = 0, float y1_ = 0, float x2_ = 0, float y2_ = 0,
        float x3_ = 0, float y3_ = 0, float x4_ = 0, float y4_ = 0, float x5_ = 0, float y5_ = 0);
    Pentagon(const Pentagon &right);
 
    void Clear();
    bool IsEmpty();
    friend ostream& operator << (ostream &out, const Pentagon &right);
 
    void Move(float dx, float dy);
    bool IsInclude(const Pentagon &right) const;
    bool IsInclude(const Rectangle &right) const;
protected:
    float x5, y5;
    float minX() const;
    float minY() const;
    float maxX() const;
    float maxY() const;
    bool IsInclude(float x, float y) const;
};
 
#endif
factory.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef FACTORY_H
#define FACTORY_H
 
#include "pentagon.h"
#include <iostream>
using namespace std;
 
class Factory
{
public:
    static Rectangle CreateRectangle();
    static Pentagon CreatePentagon();
};
 
#endif
factory.cpp:
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
#include "factory.h"
 
Rectangle Factory::CreateRectangle()
{
    string id;
    float x1, y1, x2, y2, x3, y3, x4, y4;
    while (true)
    {
        cout << "Введите идентификатор объекта: ";
        getline(cin, id);
        cout << "Введите координаты точек прямоугольника (в порядке. в котором они находятся в самом прямоугольнике)\n"
            << "x1 y1: ";
        cin >> x1 >> y1;
        cout << "x2 y2: ";
        cin >> x2 >> y2;
        cout << "x3 y3: ";
        cin >> x3 >> y3;
        cout << "x4 y4: ";
        cin >> x4 >> y4;
        if (Rectangle::IsRectangle(x1, y1, x2, y2, x3, y3, x4, y4))
            return Rectangle(id, x1, y1, x2, y2, x3, y3, x4, y4);
        else
            cout << "Это не прямоугольник!\n";
    }
}
 
Pentagon Factory::CreatePentagon()
{
    Pentagon res;
    fflush(stdin);
    cout << "Введите идентификатор объекта: ";
    getline(cin, res.id);
    cout << "Введите координаты точек пятиугольника (в порядке, в котором они находятся в самом пятиугольнике)\n"
        << "x1 y1: ";
    cin >> res.x1 >> res.y1;
    cout << "x2 y2: ";
    cin >> res.x2 >> res.y2;
    cout << "x3 y3: ";
    cin >> res.x3 >> res.y3;
    cout << "x4 y4: ";
    cin >> res.x4 >> res.y4;
    cout << "x5 y5: ";
    cin >> res.x5 >> res.y5;
    return res;
}
Добавлено через 58 минут
актуально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2014, 15:58
Помогаю со студенческими работами здесь

Площадь пятиугольника
составить прогр для вычисления площади пятиугольника.заданного координатами вершин.вычисление расстояния между двумя точками на ...

Площадь пятиугольника
Как найти площадь пятиугольника, зная длины сторон и координаты вершин? Не могу найти формулу подходящую. Знаю формулу S = 0.5*P*r, ...

площадь пятиугольника
задача: Написать программу решения следующей задачи: Даны вещественные числа a, b, c, d, e, f, g. Найти площадь пятиугольника (S),...

Найти площадь пятиугольника
Даны вещественные числа а, b, с, d, e. Найти площадь пятиугольника, изображенного на рис.2. (Определить функцию для расчета площади...

Найти площадь пятиугольника
как это можно реализовать в коде, именно с использованием нескольких модулей?что бы вычитывал площадь Даны действительные числа a, b,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru