ПрограммированиеФорумГрафика

Реализация операций с матрицами. Поделитесь кодом...[c++]

Страницы: 1 2 Следующая »
#0
16:06, 22 авг 2005

Поделитесь кодом – хочу разобраться, что и как. И как правильно. Свое написать – не сложно, но чужое посмотреть – полезно.

Буду очень благодарен.

#1
16:16, 22 авг 2005

мою можно тут скачать http://asires.nm.ru/download.html

#2
16:51, 22 авг 2005

Flox
D3 Game SDK тебе поможет ;)

#3
21:05, 22 авг 2005

[kis-kis]
Разбирался вашим исходником.
Если я правильно понял, вы реализуете класс «вектор размеренности N»  (при том не динамически – т.е. все необходимые векторы нужно писать вручную и заново) и затем, на основе него, создаете класс «матрица размера M на N».
Это не очень изящно, не так ли?

#4
22:55, 22 авг 2005

Flox
>Это не очень изящно, не так ли?
Изящнее всего - использовать функции из DX SDK (они и работают быстрее). А вообще топик странный какой-то... что такого сложного в матричных операциях то?! Берешь формулы и кодишь... :)

#5
11:35, 23 авг 2005

_loki_
>А вообще топик странный какой-то...
Такие вопросы кажутся странными, когда уже неплохо владеешь языком. =)

p.s.
А если конкретно, то меня мучает вопрос:
«Как оптимальным образом организовать класс матрица?»

#6
11:38, 23 авг 2005

Flox
>Такие вопросы кажутся странными, когда уже неплохо владеешь языком
Разве запись мат. формул на С++ требует каких-то особых знаний этого самого С++??? :)

#7
11:40, 23 авг 2005

_loki_

смотрите постскриптум.

#8
11:44, 23 авг 2005

Flox
>Как оптимальным образом организовать класс матрица?
Что значит "оптимальным образом"? Должна ли матрица быть динамической? Как часто будет изменяться размерность матрицы?

#9
11:52, 23 авг 2005

для графики нужны только 2, 3 и 4 вектора и 2х2, 3х3 и 4х4 матрицы
следовательно самое простое - сделать

typedef float Vector2[2];
typedef float Vector3[3];
typedef float Vector4[4];
typedef Vector2 Matrix2[2];
typedef Vector3 Matrix3[3];
typedef Vector4 Matrix4[4];

и функции типа

inline void Vector2Add (Vector2 dest, Vector2 a, Vector2 b) {
dest[0]=a[0]+b[0];
dest[1]=a[1]+b[1];
}

inline void Matrix2Add (Matrix2 dest, Matrix2 a, Matrix2 b) {
Vector2Add(dest[0], a[0], b[0]);
Vector2Add(dest[1], a[1], b[1]);
}

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

#10
12:10, 23 авг 2005

>Должна ли матрица быть динамической?
  Видимо да.

>Как часто будет изменяться размерность матрицы?
  Заранее не известно.

Это дурацкая привычка ставить задачу наиболее общим образом, что бы потом принять N=2 ,3 ,4.  =)
Хотя эта привычка позволила мне многому научиться…

#11
12:52, 23 авг 2005

Flox
Тогда std::vector для данных и перегруженный оператор operator()(size_t row, size_t col) для индексирования.
Но это для  сферической матрицы в вакууме. Для геймдева матрица - это float[16] ;)

#12
13:06, 23 авг 2005

Вот, из моего старого проекта. Я тогда ещё программил на C++.
http://www.gamedev.ru/download/?id=2514

На шаблонах. Поддерживаются матрицы любых размеров. Перевод матрицы поворота в кватернионы, и наоборот. Матрицы не используют класс вектора(с целью увелечения быстродействия). Все базовые операции необходимые для геймдева там есть(и даже чуть-чуть больше). Код не оптимизирован(оптимизация принесена в жертву читабельности). Но оптимизировать его очень легко.
Доступ к элементам матрицы осуществляется не так, как это принято в математике, а так как принято в двумерной графике.

#13
13:16, 23 авг 2005

Теперь знаю в каком направлении идти дальше.
Благодарен за высказанные мнения и предоставленные исходники.

#14
13:57, 23 авг 2005

Flox
>[kis-kis]
>Разбирался вашим исходником.
>Если я правильно понял, вы реализуете класс «вектор размеренности N» (при том
>не динамически – т.е. все необходимые векторы нужно писать вручную и заново) и
>затем, на основе него, создаете класс «матрица размера M на N».
>Это не очень изящно, не так ли?
Это изящно и очень быстро в отличи от "динамической" реализации, если скорость тебя не волнует - юзай шаблоны.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.