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

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

Войти
Регистрация
Восстановить пароль
 
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
#1

Класс точки и матрицы - C++

22.09.2013, 18:34. Просмотров 358. Ответов 7
Метки нет (Все метки)

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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <iostream>
#include <cmath>
using namespace std;
class Matrix
{
    private:
        float m[4][4];
 
    public:
        Matrix()
        {
            Clear();
        }
        Matrix(const Matrix &a)
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = a[i][j];
        }
        ~Matrix()
        {
 
        }
        float *operator[](int i)
        {
            return m[i];
        }
        const float *operator[](int i) const
        {
            return m[i];
        }
        //ГЊГ*òðèöГ* Г¬Г*Г±ГёГІГ*áèðîâГ*Г*ГЁГї
        void Scale(float a, float b, float c)
        {
            Clear();
            m[0][0] = a;
            m[1][1] = b;
            m[2][2] = c;
            m[3][3] = 1;
        }
        //ГЊГ*òðèöГ* ïîâîðîòГ*
        void RotateZ(double alpha)
        {
            Clear();
            m[0][0] = cos(alpha);
            m[1][1] = cos(alpha);
            m[0][1] = sin(alpha);
            m[1][0] = -sin(alpha);
            m[2][2] = 1;
            m[3][3] = 1;
        }
        void RotateY(double alpha)
        {
            Clear();
            m[0][0] = cos(alpha);
            m[2][2] = cos(alpha);
            m[2][0] = sin(alpha);
            m[0][2] = -sin(alpha);
            m[1][1] = 1;
            m[3][3] = 1;
        }
        void RotateX(double alpha)
        {
            Clear();
            m[1][1] = cos(alpha);
            m[2][2] = cos(alpha);
            m[1][2] = sin(alpha);
            m[2][1] = -sin(alpha);
            m[0][0] = 1;
            m[3][3] = 1;
        }
        //ГЊГ*òðèöГ* ïåðåìåùåГ*ГЁГї
        void Move(float a, float b, float c)
        {
            Identity();
            m[0][3] = a;
            m[1][3] = b;
            m[2][3] = c;
        }
        //ГЊГ*òðèöГ* Г*Г*êëîГ*Г*
        void Tilt(float a)
        {
            Identity();
            m[0][1] = a;
        }
        //ÅäèГ*ГЁГ·Г*Г*Гї Г¬Г*òðèöГ*
        void Identity()
        {
            Clear();
            m[0][0] = 1;
            m[1][1] = 1;
            m[2][2] = 1;
            m[3][3] = 1;
        }
        //ÍóëåâГ*Гї Г¬Г*òðèöГ*
        void Clear()
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = 0;
        }
        Matrix& operator=(const Matrix& rhs )
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = rhs[i][j];
            return *this;
        }
};
 
class Point
{
    private:
        float p[4];
 
    public:
        Point()
        {
            Clear();
        }
        Point(const Point &a)
        {
            for(int i=0;i<4;i++)
                p[i] = a[i];
        }
 
        ~Point()
        {
        }
        float operator[](int i) const
        {
            return p[i];
        }
        float &operator[](int i)
        {
            return p[i];
        }
        Point operator*(const Matrix& left)
        {
            Point to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = left[i][j]*p[j];
            return to;
        }
        void Clear()
        {
            for(int i=0;i<4;i++)
                p[i] = 0;
        }
        void Lab1(float a, float b, float c, float d, float t)
        {
            p[0] = a*cos(t) - b*cos(c*t);
            p[1] = a*sin(t) - b*sin(c*t);
            p[2] = d - (p[0]*p[0] + p[1]*p[1]);
            p[3] = 1;
        }
        Point& operator=( Point& rhs )
        {
            for(int i=0;i<4;i++)
                p[i] = rhs[i];
            return *this;
        }
        void Debug()
        {
            cout<<"Debug:";
            for(int i=0;i<4;i++)
                cout<<" "<<p[i];
            cout<<endl;
        }
};
/*
void MultiplyMV(Matrix M, Vector V, Vector to)
{
            to.Clear();
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*V[j];
}
 
void MultiplyMP(Matrix M, Point P, Point to)
{
            to.Clear();
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*P[j];
}
 
void MultiplyMM(Matrix M1, Matrix M2, Matrix to)
{
            to.Clear();
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    for(int k=0;k<4;k++)
                        to[i][j] += M1[i][k]*M2[k][j];
}
*/
 
int main()
{
    Point p1,p2;
    Matrix S;
    S.Scale(1,1,1);
    for(float t = 0; t<100;t+=0.001)
    {
        p1 = p1*S;
    }
}
Я уже все мозги сварил с этой перегрузкой. Помогите....компилятор ругается на то что я после умножения сразу присваиваю класс....что не так.... (не удивляйтесь тому что я матрицу на точку умножаю наоборот, на самом деле это просто мой "танец с бубном" вокруг этой ошибки)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 18:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс точки и матрицы (C++):

Подробно прокомментировать класс PolarCoordinates, представляющий собой класс координат точки на плоскости - C++
Написать класс PolarCoordinates, представляющий собой класс координат точки на плоскости, описанной с помощью своих полярных координат...

Класс Point с методами определения симметричной точки - C++
Опишите методы определения точки, симметричной данной относительно осей Ox и Oy, относительно начала координат. Помоги хоть...

Базовый класс (точки в плоскости с целочисленными координатами) - C++
1. Класс точек Базовый класс (точки в плоскости с целочисленными координатами): Конструкторы: по умолчанию, с параметрами и...

Шаблонный класс матрицы. Проверка матрицы на пустоту - C++
Есть задание (приложил картинку - zadanie.png) Вот что уже скодил: massive.h #ifndef MASSIVE_H #define MASSIVE_H #include...

Разработать класс Point для представления точки на плоскости - C++
Разработать класс Point для представления точки на плоскости. Разработать класс, производный от класса Point. Создать гетерогенный массив...

Задачка с классами (Класс точки на плоскости представлен полярными координатами) - C++
В общем такая вот задачка, кто шарит, помогите пожалуйста должны быть реализованы следующие методы: *метод инициализации Init; ...

7
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
22.09.2013, 18:43 #2
Цитата Сообщение от eocron Посмотреть сообщение
float *operator[](int i)
* * * * {
* * * * * * return m[i];
* * * * }
* * * * const float *operator[](int i) const
* * * * {
* * * * * * return m[i];
* * * * }
это вообще что? И вообще, по хорошему, в private нужно держать размеры матрицы, и делать еще конструктор с размерами в качестве параметров.
По хорошему, весь код с нуля нужно переписывать
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
22.09.2013, 18:49  [ТС] #3
Это для того чтобы работало вот это:
C++
1
2
3
4
5
6
7
8
9
        Matrix operator*(const Matrix& rhs )
        {
            Matrix to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    for(int k=0;k<4;k++)
                        to[i][j] += m[i][k]*rhs[k][j];
            return to;
        }
и это, соответсвенно:
C++
1
2
3
4
5
6
       Matrix(const Matrix &a)
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = a[i][j];
        }
По сабжу ответьте, пожалуйста. Или подскажите как правильно переписать, а то экстрасенсорикой я не занимаюсь и понять, как переписать "хорошо" я не могу.
0
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
22.09.2013, 18:52 #4
eocron, предположим, но лучше весь код с нуля переписать.
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
22.09.2013, 19:05  [ТС] #5
Мне не нужны размеры в качестве параметров. Это класс для 3D графики, задание такое мне задали, динамический матрицы, точки и вектора мне не нужны в принципе, потому что компьютер еще не научился рисовать в nD. В однородных координатах если вам это о чем-то говорит.

Добавлено через 10 минут
Неужели никто не знает почему выпадает такая ошибка? :
C++
1
2
3
In function `int main()': 
no match for 'operator=' in 'p2 = operator*(const Matrix&, const Point&)(((const Point&)((const Point*)(&p1))))' 
candidates are: Point& Point::operator=(Point&)
0
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
22.09.2013, 19:10 #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
//по хорошему здесь надо делать что-то такое
Vector MultiplyMV(Matrix M, Vector V)
{
            Vector to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*V[j];
            return to;
}
 //здесь аналогично
Point MultiplyMP(Matrix M, Point P)
{
            Point to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*P[j];
              return to;
}
 
Matrix MultiplyMM(Matrix M1, Matrix M2)
{
            Matrix to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    for(int k=0;k<4;k++)
                        to[i][j] += M1[i][k]*M2[k][j];
}
Когда Вы объявляете переменную типа точка, вектор, матрица - срабатывает конструктор по умолчанию, и метод Clear не нужен, кроме того, можно, и нужно, просто возвращать результат вычислений.
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
22.09.2013, 20:28  [ТС] #7
Допустим я так и сделал:
C++
1
2
3
4
5
6
7
8
Point MultiplyMP(Matrix M, Point P)
{
            Point to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*P[j];
            return to;
}
Получился вот такой код:

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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <cmath>
using namespace std;
class Matrix
{
    private:
        float m[4][4];
 
    public:
        Matrix()
        {
            Clear();
        }
        Matrix(const Matrix &a)
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = a[i][j];
        }
        ~Matrix()
        {
 
        }
        float *operator[](int i)
        {
            return m[i];
        }
        const float *operator[](int i) const
        {
            return m[i];
        }
        //ГЊГ*òðèöГ* Г¬Г*Г±ГёГІГ*áèðîâГ*Г*ГЁГї
        void Scale(float a, float b, float c)
        {
            Clear();
            m[0][0] = a;
            m[1][1] = b;
            m[2][2] = c;
            m[3][3] = 1;
        }
        //ГЊГ*òðèöГ* ïîâîðîòГ*
        void RotateZ(double alpha)
        {
            Clear();
            m[0][0] = cos(alpha);
            m[1][1] = cos(alpha);
            m[0][1] = sin(alpha);
            m[1][0] = -sin(alpha);
            m[2][2] = 1;
            m[3][3] = 1;
        }
        void RotateY(double alpha)
        {
            Clear();
            m[0][0] = cos(alpha);
            m[2][2] = cos(alpha);
            m[2][0] = sin(alpha);
            m[0][2] = -sin(alpha);
            m[1][1] = 1;
            m[3][3] = 1;
        }
        void RotateX(double alpha)
        {
            Clear();
            m[1][1] = cos(alpha);
            m[2][2] = cos(alpha);
            m[1][2] = sin(alpha);
            m[2][1] = -sin(alpha);
            m[0][0] = 1;
            m[3][3] = 1;
        }
        //ГЊГ*òðèöГ* ïåðåìåùåГ*ГЁГї
        void Move(float a, float b, float c)
        {
            Identity();
            m[0][3] = a;
            m[1][3] = b;
            m[2][3] = c;
        }
        //ГЊГ*òðèöГ* Г*Г*êëîГ*Г*
        void Tilt(float a)
        {
            Identity();
            m[0][1] = a;
        }
        //ÅäèГ*ГЁГ·Г*Г*Гї Г¬Г*òðèöГ*
        void Identity()
        {
            Clear();
            m[0][0] = 1;
            m[1][1] = 1;
            m[2][2] = 1;
            m[3][3] = 1;
        }
        //ÍóëåâГ*Гї Г¬Г*òðèöГ*
        void Clear()
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = 0;
        }
        Matrix& operator=(const Matrix& rhs )
        {
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    m[i][j] = rhs[i][j];
            return *this;
        }
        Matrix operator*(const Matrix& rhs )
        {
            Matrix to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    for(int k=0;k<4;k++)
                        to[i][j] += m[i][k]*rhs[k][j];
            return to;
        }
};
 
class Point
{
    private:
        float p[4];
 
    public:
        Point()
        {
            Clear();
        }
        Point(const Point &a)
        {
            for(int i=0;i<4;i++)
                p[i] = a[i];
        }
 
        ~Point()
        {
        }
        float operator[](int i) const
        {
            return p[i];
        }
        float &operator[](int i)
        {
            return p[i];
        }
        void Clear()
        {
            for(int i=0;i<4;i++)
                p[i] = 0;
        }
        void Lab1(float a, float b, float c, float d, float t)
        {
            p[0] = a*cos(t) - b*cos(c*t);
            p[1] = a*sin(t) - b*sin(c*t);
            p[2] = d - (p[0]*p[0] + p[1]*p[1]);
            p[3] = 1;
        }
        Point& operator=( Point& rhs )
        {
            for(int i=0;i<4;i++)
                p[i] = rhs[i];
            return *this;
        }
        void Debug()
        {
            cout<<"Debug:";
            for(int i=0;i<4;i++)
                cout<<" "<<p[i];
            cout<<endl;
        }
};
 
//То же самое что и ниже (сделал перегрузку глобальной)
/*Point operator*(const Matrix& left, const Point& p)
{
            Point to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = left[i][j]*p[j];
            return Point(to);
}*/
 
Point MultiplyMP(Matrix M, Point P)
{
            Point to;
            for(int i=0;i<4;i++)
                for(int j=0;j<4;j++)
                    to[i] = M[i][j]*P[j];
            return to;
}
int main()
{
    Point p1,p2;
    Matrix S;
    S.Scale(1,2,3);
    for(float t = 0; t<100;t+=0.001)
    {
        p2 = MultiplyMP(S,p1);
    }
}
По сути переписал то, что уже и так было (вы, наверное, не заметили перегруженный оператор * в классе Point)
Ошибка не исчезла.
Все так же, класс Point не может вызвать оператор =. Хотя если я напишу p1 = p2; все сработает.
И, да, эти три функции я не даром заковычкал. Они в первозданном виде помогли мне избежать данной ошибки.

Добавлено через 48 минут
Неужели, я первый кто столкнулся с этой ошибкой? =/ Столько людей уже просмотрело, а никто не отвечает.
0
gray_fox
What a waste!
1536 / 1241 / 71
Регистрация: 21.04.2012
Сообщений: 2,608
Завершенные тесты: 3
22.09.2013, 21:58 #8
Цитата Сообщение от eocron Посмотреть сообщение
C++
1
Point& operator=( Point& rhs )
C++
1
Point& operator=( Point const& rhs )
1
22.09.2013, 21:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 21:58
Привет! Вот еще темы с ответами:

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

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

Небольшой шаблонный класс matrix: комментарии/критика относительно кода с точки зрения правильности написания - C++
В плане своего общего развития написал не большой шаблонный класс matrix. Хочу поделиться своей работой с остальными, - может кому то это...

Седловые точки матрицы - C++
Найти седловые точки матрицы. Седловой точкой называется элемент, являющийся минимальным в строке и максимальным в столбце. Я тут...


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

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

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