2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
1

Класс, который производит действия с координатами многоугольника

09.05.2019, 13:50. Показов 1477. Ответов 15
Метки нет (Все метки)

У меня есть выпуклый многоугольник. Я должен создать класс Локус, где действия будут происходить с копией координат многоугольника. (Поворот многоугольника вокруг центра, сдвиг и нахождения минимальных и максимальных координат). Вывод это массив изменённых координат. Я создал только скелет кода, с большим количеством ошибок (долгое отсутствие практики), хотел многое подправить. Я прошу помочь мне именно, основными проблемами кода, остальное я могу изменить сам.
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
#include <iostream>
#include <iomanip>
#include <math.h>
#include <fstream>
using namespace std;
//Функции для поворота
double Xrotate(int x, int y, double angle){
    double c = cos(angle);
    double s = sin(angle);
    return c*x-s*y;
}
 
double Yrotate(int x,int y, double angle){
    double c = cos(angle);
    double s = sin(angle);
    return s*x+c*y;
}
 
class Locus{
    double angle = pi/6;
    int i;
    int n;
    int = x;
    int = y;
    int xx=0;
    int yy=0;
    double Yc;
    double Xc;
    int xdata[]; //координаты многоугольника
    int ydata[];
    int xxdata[];
    int yydata[];
public:
    //копирую данный массив, для дальнейшей работы с копией
    Locus(int xdata, int ydata){
        if sizeof(xdata) != sizeof(ydata)
            break
        cout << "Данные должны быть представлены массивами одного размера"<< endl;
 
        for (i=0; i<n+1;i++){
            xxdata[i] = xdata[i];
            yydata[i] = ydata[i]; 
        }
        return *this; // это не правильно, но вместо пустоты)
    }  
    //поворачиваю нашу фигуру на угол
    double rot(int xdata, int ydata, double angle, double center){
        for (i=0;i<n+1;i++){
            xx += xdata[i];
            yy += ydata[i];
        }
        Xc = xx/n; //нахожу координаты центра
        Yc = yy/n;
        for (i=0;i<n+1;i++){
            xxdata[i] = xdata[i] - Xc; //помещаю центр в начало координат
            yydata[i] = ydata[i] - Yc; //чтобы легче было поворачивать
            x[i]=Xrotate(xxdata[i],yydata[i], angle);
            y[i]=Yrotate(xxdata[i],yydata[i], angle);
            xxdata[i] = x[i] + Xc; //возвращаю координаты на место
            yydata[i] = y[i] + Yc;
        }       
        return *this; 
    }
    //сдвигаю наш многоугольник на заданный вектор
    double shift(int xdata, int ydata, int Xvec_shift, int Yvec_shift){
        for (i=0; i<n+1;i++){
            xxdata[i] = xdata[i]+Xvec_shift;
            yydata[i] = ydata[i]+Yvec_shift; 
 
        }
        return *this; 
 
    }
    // нахожу минимальные и максимальные координаты
    double min_coords(int xdata, int ydata){
        double f[], g[], h=99999999, r;
        for(i=0;i<n+1;i++){
            f[i]=pow(xdata,2)+pow(ydata,2);
            g[i]=sqrt(f[i]);
        }
        for(i=0;i<n+1;i++){
            if(g[i]<h){
                h=g[i];
                r=i;
            }
        }
        xxdata = g[r];
        yydata = g[r];
        return *this;
    }
    double max_coords(int xdata, int ydata){
        double f[], g[], h=0, r;
        for(i=0;i<n+1;i++){
            f[i]=pow(xdata,2)+pow(ydata,2);
            g[i]=sqrt(f[i]);
        }
        for(i=0;i<n+1;i++){
            if(g[i]>h){
                h=g[i];
                r=i;
            }
        }
        xxdata = g[r];
        yydata = g[r];
        return *this;
    }
 
};
int main()
{
 
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2019, 13:50
Ответы с готовыми решениями:

Создать класс, который производит обработку двумерного массива
Создать класс, который производит обработку двумерного массива. Выбивает две ошибки: 1)...

На основе созданного класса OPERATION, создать класс-потомок OP_SUMMATOR, который производит сложение двух полей
Я создал класс OPERATION, который является абстрактной операцией над двумя числами типа ...

Класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами
Создайте класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами....

Проверить принадлежность точки с заданными координатами (x0, y0) прямоугольнику, который задан координатами диагонали
Помогите решить задачу по VBA, пожалуйста!!!! Проверить принадлежность точки с заданными...

15
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
09.05.2019, 14:18 2
Knzj, вот наброски, не тестил:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
struct flat_vector
{
    double x;
    double y;
};
 
typedef double(flat_matrix)[2][2];
 
flat_vector operator*(const flat_vector& v, const flat_matrix& m)
{
    return flat_vector
    {
        v.x*m[0][0] + v.y*m[0][1],
        v.x*m[1][0] + v.y*m[1][1]
    };
}
 
flat_vector operator+(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x + rh.x,
        lh.y + rh.y
    };
}
 
double length(const flat_vector& v) { return sqrt(v.x*v.x + v.y*v.y); }
 
struct Locus
{
    std::vector<flat_vector> points;
    
    void rotate(double rad)
    {
        flat_matrix rotate_matrix
        {
            {cos(rad), -sin(rad)},
            {sin(rad),  cos(rad)}
        };
        for (auto& p : points)
            p = p * rotate_matrix;
    }
 
    void move(const flat_vector& v)
    {
        for (auto& p : points)
            p = p + v;
    }
 
    flat_vector& min()
    {
        return *std::min_element(points.begin(), points.end(), [](const auto& lh, const auto& rh)
        {
            return length(lh) < length(rh);
        });
    }
};
1
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
09.05.2019, 20:43  [ТС] 3
Спасибо, попробую разобраться
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
09.05.2019, 21:01 4
Knzj, спрашивайте, что не понятно.
Если нужно поворот вокруг произвольной точки, заданной вектором v, используйте уже определенные методы:
C++
1
2
3
4
5
6
    void rotate(double rad, const flat_vector& v)
    {
        move({ -v.x, -v.y }); // хотя можно определить унарный минус для вектора
        rotate(rad);
        move(v);
    }
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
11.05.2019, 18:31  [ТС] 5
Цитата Сообщение от zayats80888 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
flat_vector operator*(const flat_vector& v, const flat_matrix& m)
{
* * return flat_vector
* * {
* * * * v.x*m[0][0] + v.y*m[0][1],
* * * * v.x*m[1][0] + v.y*m[1][1]
* * };
}
Здесь есть проблема, так же, как и с оператором +, мы обозначаем оператор *, но внутри уже есть *, но это решаемо.
Главная проблема в другом, как правильно задать координаты Х и У, чтобы это всё заработало, у меня пока не получилось
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
11.05.2019, 18:54 6
Лучший ответ Сообщение было отмечено Knzj как решение

Решение

Цитата Сообщение от Knzj Посмотреть сообщение
Здесь есть проблема, так же, как и с оператором +, мы обозначаем оператор *, но внутри уже есть *, но это решаемо.
чего, чего???

Добавлено через 17 секунд
Цитата Сообщение от Knzj Посмотреть сообщение
Главная проблема в другом, как правильно задать координаты Х и У, чтобы это всё заработало, у меня пока не получилось
Ща напишу

Добавлено через 6 минут
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 <vector>
#include <algorithm>
 
struct flat_vector
{
    double x;
    double y;
};
 
typedef double(flat_matrix)[2][2];
 
flat_vector operator*(const flat_vector& v, const flat_matrix& m)
{
    return flat_vector
    {
        v.x*m[0][0] + v.y*m[0][1],
        v.x*m[1][0] + v.y*m[1][1]
    };
}
 
flat_vector operator+(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x + rh.x,
        lh.y + rh.y
    };
}
 
double length(const flat_vector& v) { return sqrt(v.x*v.x + v.y*v.y); }
 
struct Locus
{
    std::vector<flat_vector> points;
 
    void rotate(double rad)
    {
        flat_matrix rotate_matrix
        {
            {cos(rad), -sin(rad)},
            {sin(rad),  cos(rad)}
        };
        for (auto& p : points)
            p = p * rotate_matrix;
    }
 
    void rotate(double rad, const flat_vector& v)
    {
        move({ -v.x, -v.y });
        rotate(rad);
        move(v);
    }
 
    void move(const flat_vector& v)
    {
        for (auto& p : points)
            p = p + v;
    }
 
    flat_vector& min()
    {
        return *std::min_element(points.begin(), points.end(), [](const auto& lh, const auto& rh)
        {
            return length(lh) < length(rh);
        });
    }
};
 
void print(const Locus& l)
{
    for (const auto& p : l.points)
        std::cout << '(' << p.x << ", " << p.y << ") ";
    std::cout << std::endl;
}
 
int main()
{
    const double pi = std::acos(-1);
    Locus poly{ {{1,2}, {2,6}, {-8,-10}} };
    print(poly);
 
    poly.rotate(pi); // поворот на 180 вокруг начала отсчета
    print(poly);
 
    poly.rotate(pi, poly.points[0]); // поворот на 180 вокруг первой точки
    print(poly);
}
1
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
11.05.2019, 19:55  [ТС] 7
Странно, выдаёт ошибку, что не может открыть файл, а в списке ошибок следующее:
Ошибка C1010 непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include "pch.h"" в источник.
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
11.05.2019, 20:10 8
Цитата Сообщение от Knzj Посмотреть сообщение
Возможно, вы забыли добавить директиву "#include "pch.h"" в источник.
Ну так добавьте

Добавлено через 22 секунды
в саааааааамый верх

Добавлено через 1 минуту
и еще косяк увидел, там передача по ссылке, поэтому исправьте стр. 86 на
C++
1
2
    auto point = poly.points[0];
    poly.rotate(pi, point); // поворот на 180 вокруг первой точки
1
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
11.05.2019, 20:18  [ТС] 9
Спасибо, очень помог)
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
13.05.2019, 17:58  [ТС] 10
Последнее недопонимание, как работает в 57 строке двоеточие?

Добавлено через 1 минуту
Точнее я догадываюсь, но разве в с++ так пишут? (Хотя, если работает, то пишут)
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
13.05.2019, 18:09 11
Цитата Сообщение от Knzj Посмотреть сообщение
Последнее недопонимание, как работает в 57 строке двоеточие?
https://en.cppreference.com/w/... /range-for
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
13.05.2019, 19:47  [ТС] 12
Понял, спасибо

Добавлено через 1 час 37 минут
У меня осталась последняя проблема, у меня не получается правильно вывести минимальный элемент(
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
13.05.2019, 20:01 13
Цитата Сообщение от Knzj Посмотреть сообщение
У меня осталась последняя проблема, у меня не получается правильно вывести минимальный элемент(
C++
1
2
    flat_vector min = poly.min();
    std::cout << "min = (" << min.x << ", " << min.y << ")\n";
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
13.05.2019, 20:29  [ТС] 14
Я так же делал, только через принт, не додумался исправить
0
2 / 2 / 0
Регистрация: 19.10.2017
Сообщений: 214
29.05.2019, 20:36  [ТС] 15
Цитата Сообщение от zayats80888 Посмотреть сообщение
flat_vector& min()
* * {
* * * * return *std::min_element(points.begin(), points.end(), [](const auto& lh, const auto& rh)
* * * * {
* * * * * * return length(lh) < length(rh);
* * * * });
* * }
А можно таким же образом сделать, только чтобы минимальной было не расстояние от начала координат до точки, а минимальное значение отдельно по х и отдельно по у.
0
5675 / 3120 / 1300
Регистрация: 07.02.2019
Сообщений: 7,824
29.05.2019, 21:00 16
Цитата Сообщение от Knzj Посмотреть сообщение
А можно таким же образом сделать
C++
1
2
3
4
5
6
7
flat_vector& min_x()
{
    return *std::min_x(points.begin(), points.end(), [](const auto& lh, const auto& rh)
    {
        return lh.x < rh.x;
    });
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2019, 21:00
Помогаю со студенческими работами здесь

Есть код который производит поиск файлов по диапазону размеров
Есть код который производит поиск файлов по диапазону размеров, но есть 2 проблемы не выполняет...

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

Определить периметр многоугольника, заданного координатами вершин
Составить программу для определения периметра многоугольника, заданного координатами вершин (X1,...

Найти площадь многоугольника с заданными координатами вершин
. Даны натуральное число n, действительные числа x(0), y(0), x(1), y(1),...,x(n), y(n). ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru