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

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

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

Что нужно сделать, чтобы это скомпилировалось? - C++

22.09.2013, 20:53. Просмотров 422. Ответов 8
Метки нет (Все метки)

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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 20:53     Что нужно сделать, чтобы это скомпилировалось?
Посмотрите здесь:

Конструкторы - что это и зачем нужно? - C++
Объясните, пожалуйста, для чего нужны конструкторы и деструкторы? Что это вообще?

Нужно удалить слова как это сделать? - C++
Есть такой текст &quot;for do while int void using while&quot; нужно удалить слова &quot;while&quot; как это сделать?

Нужно сделать что бы давало рандомно числа и нужно написать ответ - C++
В командной строке. Тоесть примерно так: Запускаешь программу, показывает числа что выбрались рандомно : 15*3=? После этого...

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

точку нужно отобразить в виде пикселя. как это сделать - C++
/*Реализовать класс Graphic, который позволяет рисовать на экране консоли различные геометрические фигуры. Разнести проект по файлам. ...

Нужно найти строки в фале, которые заканчиваются на восклицательный знак, как это сделать? - C++
Вот код, нужна строчка, которая будет искать строки с восклицательными знаками #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
22.09.2013, 20:55     Что нужно сделать, чтобы это скомпилировалось? #2
Цитата Сообщение от eocron Посмотреть сообщение
Что нужно сделать, чтобы это скомпилировалось?
для этого класса можно обойтись без оператора =. присваивание по умолчанию будет
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 21:15     Что нужно сделать, чтобы это скомпилировалось? #3
C++
1
2
3
4
5
6
        Point& operator=( const Point& rhs )
        {
            for(int i=0;i<4;i++)
                p[i] = rhs[i];
            return *this;
        }
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
22.09.2013, 22:03     Что нужно сделать, чтобы это скомпилировалось? #4
Цитата Сообщение от eocron Посмотреть сообщение
Что нужно сделать, чтобы это скомпилировалось?
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
5
6
Point& operator=( const Point& rhs )
{
    for(int i=0;i<4;i++)
        p[i] = rhs[i];
    return *this;
}
мне кажется что это тоже не скомпилируется. rhs ведь не массив а объект класса Point
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.09.2013, 22:13     Что нужно сделать, чтобы это скомпилировалось? #5
Цитата Сообщение от _ Посмотреть сообщение
мне кажется что это тоже не скомпилируется. rhs ведь не массив а объект класса Point
Если бы не компилировалось, я бы и не выложил код. В классе Point, оператор [], перегружен.
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
22.09.2013, 22:32  [ТС]     Что нужно сделать, чтобы это скомпилировалось? #6
Все, всем спасибо )
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
22.09.2013, 22:42     Что нужно сделать, чтобы это скомпилировалось? #7
eocron, можно спросить? что такое матрица поворота? она вроде в играх используется? просто я где то видел это. не могу вспомнить
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
22.09.2013, 23:05     Что нужно сделать, чтобы это скомпилировалось? #8
_, матрица поворота используется всюду в графике. Во многих графический либах она присутсвует, например в том же OpenGL или DirectX. Представь себе, что картинка это массив пикселей. И тебе нужно повернуть изображение на н-градусов. Вот тут то и матрица поворота пригодится. А вообще, вот http://ru.wikipedia.org/wiki/%CC%E0%...EE%F0%EE%F2%E0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 23:30     Что нужно сделать, чтобы это скомпилировалось?
Еще ссылки по теме:

Что нужно выучить, чтобы легче понять C++? - C++
Что для этого нужно сделать,может выучить какой-нибудь другой язык?Мне говорили что нужно сначала выучить паскаль и html потом будет просто...

нужно сделать так, чтобы золотые не падали на стены - C++
void PlusGold(Game &amp;g) //Функция разброски золота { int i,x,y; int n = g.hero.PCount; do { x = rand() % 73+3; // y =...

Что нужно знать, чтобы создать класс String? - C++
Здравствуйте! Подскажите, про какие функции и разделы прочитать, чтобы сделать данное задание: &quot;Разработать класс String определив для...

Что нужно знать, чтобы взяли на работу C++-программистом? - C++
всем привет. Я учу С++ уже 10 месяцев. по двум книгам, первую я закончил это Джес либерти 21 день. Вторая Это стивен прата 9 издание...


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

Или воспользуйтесь поиском по форуму:
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
22.09.2013, 23:30  [ТС]     Что нужно сделать, чтобы это скомпилировалось? #9
Да, coloc, вообщем-то все сказал.У тебя есть 3D объект , обратившись к которому ты можешь получить любую из его координат, так вот ,допустим, ты этот объект проецируешь на плоскость виджета по координатам xy - получается плоская картинка.

Чтобы увидеть координаты z этого объекта, тебе, логично, нужно повернуть его: - Как это сделать? - домножить всю его координатную архитектуру на одну из трех или несколько матриц поворота и эта z-координата в какой-то мере перейдет в x и y, которые проецируются на твою плоскость.

С помощью всех этих матриц можно легко объект вертеть, крутить, растягивать, сжимать и прочий изврат. Другой вопрос в производительности такого дела. Там все намного сложнее и очень много проблем с одновременным использованием нескольких матриц (упрощать приходится - чистая математика).

В играх, кстати, очень популярны кватернионы, как замена данного кошмара, они как раз используются усиленно на всяких крайенжайнах, юнити и прочих.
Yandex
Объявления
22.09.2013, 23:30     Что нужно сделать, чтобы это скомпилировалось?
Ответ Создать тему
Опции темы

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