Ĺadny brzuch
Witam potrzebuje znaleść jakąś klasę macierz która miała by metodę słóżącą do odwracania. Niestety szukałem i googlowałem ale nie znalazlem. Tzn byly jakies klasy, ale niestety jak chcialem dodac wymagana przestrzen poprzez using to kompilator wywalal blad, ze nie ma takiego namespace. Pomoze mi ktos?
Solution Explorer -> P-klik na nazwie projektu -> References -> Add New Reference i dodaj to czego potrzebujesz :P
I jak to nie ma kodu na odwracanie???? Trzeba po prostu głębiej szukać, lub zrozumieć macierze :]
void InvertMatrix( mat4& M1 ) { //float d12 = ((*this)[0][2] * (*this)[1][3] - (*this)[0][3] * (*this)[1][2]); //float d13 = ((*this)[0][2] * (*this)[2][3] - (*this)[0][3] * (*this)[2][2]); //float d23 = ((*this)[1][2] * (*this)[2][3] - (*this)[1][3] * (*this)[2][2]); //float d24 = ((*this)[1][2] * (*this)[3][3] - (*this)[1][3] * (*this)[3][2]); //float d34 = ((*this)[2][2] * (*this)[3][3] - (*this)[2][3] * (*this)[3][2]); //float d41 = ((*this)[3][2] * (*this)[0][3] - (*this)[3][3] * (*this)[0][2]); //float tmp[4][4]; //tmp[0][0] = ((*this)[1][1] * d34 - (*this)[2][1] * d24 + (*this)[3][1] * d23); //tmp[0][1] = -((*this)[0][1] * d34 + (*this)[2][1] * d41 + (*this)[3][1] * d13); //tmp[0][2] = ((*this)[0][1] * d24 + (*this)[1][1] * d41 + (*this)[3][1] * d12); //tmp[0][3] = -((*this)[0][1] * d23 - (*this)[1][1] * d13 + (*this)[2][1] * d12); //float det = (*this)[0][0] * tmp[0][0] + // (*this)[1][0] * tmp[0][1] + // (*this)[2][0] * tmp[0][2] + // (*this)[3][0] * tmp[0][3]; // //if( det == 0.0 ) // return LoadIdentity(); //float invDet = 1.0f / det; //tmp[0][0] *= invDet; //tmp[0][1] *= invDet; //tmp[0][2] *= invDet; //tmp[0][3] *= invDet; //tmp[1][0] = -((*this)[1][0] * d34 - (*this)[2][0] * d24 + (*this)[3][0] * d23) * invDet; //tmp[1][1] = ((*this)[0][0] * d34 + (*this)[2][0] * d41 + (*this)[3][0] * d13) * invDet; //tmp[1][2] = -((*this)[0][0] * d24 + (*this)[1][0] * d41 + (*this)[3][0] * d12) * invDet; //tmp[1][3] = ((*this)[0][0] * d23 - (*this)[1][0] * d13 + (*this)[2][0] * d12) * invDet; //d12 = (*this)[0][0] * (*this)[1][1] - (*this)[0][1] * (*this)[1][0]; //d13 = (*this)[0][0] * (*this)[2][1] - (*this)[0][1] * (*this)[2][0]; //d23 = (*this)[1][0] * (*this)[2][1] - (*this)[1][1] * (*this)[2][0]; //d24 = (*this)[1][0] * (*this)[3][1] - (*this)[1][1] * (*this)[3][0]; //d34 = (*this)[2][0] * (*this)[3][1] - (*this)[2][1] * (*this)[3][0]; //d41 = (*this)[3][0] * (*this)[0][1] - (*this)[3][1] * (*this)[0][0]; //tmp[2][0] = ((*this)[1][3] * d34 - (*this)[2][3] * d24 + (*this)[3][3] * d23) * invDet; //tmp[2][1] = -((*this)[0][3] * d34 + (*this)[2][3] * d41 + (*this)[3][3] * d13) * invDet; //tmp[2][2] = ((*this)[0][3] * d24 + (*this)[1][3] * d41 + (*this)[3][3] * d12) * invDet; //tmp[2][3] = -((*this)[0][3] * d23 - (*this)[1][3] * d13 + (*this)[2][3] * d12) * invDet; //tmp[3][0] = -((*this)[1][2] * d34 - (*this)[2][2] * d24 + (*this)[3][2] * d23) * invDet; //tmp[3][1] = ((*this)[0][2] * d34 + (*this)[2][2] * d41 + (*this)[3][2] * d13) * invDet; //tmp[3][2] = -((*this)[0][2] * d24 + (*this)[1][2] * d41 + (*this)[3][2] * d12) * invDet; //tmp[3][3] = ((*this)[0][2] * d23 - (*this)[1][2] * d13 + (*this)[2][2] * d12) * invDet; //memcpy( &M1[0][0], &tmp[0][0], 16*sizeof(float) ); M1.AxisX.V.X = AxisX.V.X; M1.AxisX.V.Y = AxisY.V.X; M1.AxisX.V.Z = AxisZ.V.X; M1.AxisY.V.X = AxisX.V.Y; M1.AxisY.V.Y = AxisY.V.Y; M1.AxisY.V.Z = AxisZ.V.Y; M1.AxisZ.V.X = AxisX.V.Z; M1.AxisZ.V.Y = AxisY.V.Z; M1.AxisZ.V.Z = AxisZ.V.Z; M1.Pos.V.X = -(Pos.V.Dot(AxisX.V)); M1.Pos.V.Y = -(Pos.V.Dot(AxisY.V)); M1.Pos.V.Z = -(Pos.V.Dot(AxisZ.V)); }; Dwa sposoby z mojej klasy :]
Fajnie tylko ja potrzebuje macierz o zmiennym wymiarze, coś jak vector. Tzn rozmiar może być podawany przy tworzeniu i juz nie będzie zmieniany.
To jest możliwe - tyle że musisz wykorzystać tą zakomentowaną część kodu. Nie wiem jak to się robi w C#, ale w C++ to:template< int _iSize > class matrix{ .... };
A wszędzie, gdzie jest jakieś obliczenia, trzeba je sprytnie zastąpić pętlami. Coś jak:void Transpose(){ matrix<_iSize> temp = *this; for( int i = 0; i < _iSize * _iSize; i++ ){ *this[i/_iSize][i%_iSize] = temp[i%_iSize][i/_iSize]; } }
Chociaż z punktu widzenia wydajności, tworzenie takiej klasy jest bez sensu - pętle będą niepotrzebnie wydłużać czas działania metod - lepiej sobie napisac te mat2, mat3, mat4 oddzielnie.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Solution Explorer -> P-klik na nazwie projektu -> References -> Add New Reference i dodaj to czego potrzebujesz :P
I jak to nie ma kodu na odwracanie???? Trzeba po prostu głębiej szukać, lub zrozumieć macierze :]
void InvertMatrix( mat4& M1 ) { //float d12 = ((*this)[0][2] * (*this)[1][3] - (*this)[0][3] * (*this)[1][2]); //float d13 = ((*this)[0][2] * (*this)[2][3] - (*this)[0][3] * (*this)[2][2]); //float d23 = ((*this)[1][2] * (*this)[2][3] - (*this)[1][3] * (*this)[2][2]); //float d24 = ((*this)[1][2] * (*this)[3][3] - (*this)[1][3] * (*this)[3][2]); //float d34 = ((*this)[2][2] * (*this)[3][3] - (*this)[2][3] * (*this)[3][2]); //float d41 = ((*this)[3][2] * (*this)[0][3] - (*this)[3][3] * (*this)[0][2]); //float tmp[4][4]; //tmp[0][0] = ((*this)[1][1] * d34 - (*this)[2][1] * d24 + (*this)[3][1] * d23); //tmp[0][1] = -((*this)[0][1] * d34 + (*this)[2][1] * d41 + (*this)[3][1] * d13); //tmp[0][2] = ((*this)[0][1] * d24 + (*this)[1][1] * d41 + (*this)[3][1] * d12); //tmp[0][3] = -((*this)[0][1] * d23 - (*this)[1][1] * d13 + (*this)[2][1] * d12); //float det = (*this)[0][0] * tmp[0][0] + // (*this)[1][0] * tmp[0][1] + // (*this)[2][0] * tmp[0][2] + // (*this)[3][0] * tmp[0][3]; // //if( det == 0.0 ) // return LoadIdentity(); //float invDet = 1.0f / det; //tmp[0][0] *= invDet; //tmp[0][1] *= invDet; //tmp[0][2] *= invDet; //tmp[0][3] *= invDet; //tmp[1][0] = -((*this)[1][0] * d34 - (*this)[2][0] * d24 + (*this)[3][0] * d23) * invDet; //tmp[1][1] = ((*this)[0][0] * d34 + (*this)[2][0] * d41 + (*this)[3][0] * d13) * invDet; //tmp[1][2] = -((*this)[0][0] * d24 + (*this)[1][0] * d41 + (*this)[3][0] * d12) * invDet; //tmp[1][3] = ((*this)[0][0] * d23 - (*this)[1][0] * d13 + (*this)[2][0] * d12) * invDet; //d12 = (*this)[0][0] * (*this)[1][1] - (*this)[0][1] * (*this)[1][0]; //d13 = (*this)[0][0] * (*this)[2][1] - (*this)[0][1] * (*this)[2][0]; //d23 = (*this)[1][0] * (*this)[2][1] - (*this)[1][1] * (*this)[2][0]; //d24 = (*this)[1][0] * (*this)[3][1] - (*this)[1][1] * (*this)[3][0]; //d34 = (*this)[2][0] * (*this)[3][1] - (*this)[2][1] * (*this)[3][0]; //d41 = (*this)[3][0] * (*this)[0][1] - (*this)[3][1] * (*this)[0][0]; //tmp[2][0] = ((*this)[1][3] * d34 - (*this)[2][3] * d24 + (*this)[3][3] * d23) * invDet; //tmp[2][1] = -((*this)[0][3] * d34 + (*this)[2][3] * d41 + (*this)[3][3] * d13) * invDet; //tmp[2][2] = ((*this)[0][3] * d24 + (*this)[1][3] * d41 + (*this)[3][3] * d12) * invDet; //tmp[2][3] = -((*this)[0][3] * d23 - (*this)[1][3] * d13 + (*this)[2][3] * d12) * invDet; //tmp[3][0] = -((*this)[1][2] * d34 - (*this)[2][2] * d24 + (*this)[3][2] * d23) * invDet; //tmp[3][1] = ((*this)[0][2] * d34 + (*this)[2][2] * d41 + (*this)[3][2] * d13) * invDet; //tmp[3][2] = -((*this)[0][2] * d24 + (*this)[1][2] * d41 + (*this)[3][2] * d12) * invDet; //tmp[3][3] = ((*this)[0][2] * d23 - (*this)[1][2] * d13 + (*this)[2][2] * d12) * invDet; //memcpy( &M1[0][0], &tmp[0][0], 16*sizeof(float) ); M1.AxisX.V.X = AxisX.V.X; M1.AxisX.V.Y = AxisY.V.X; M1.AxisX.V.Z = AxisZ.V.X; M1.AxisY.V.X = AxisX.V.Y; M1.AxisY.V.Y = AxisY.V.Y; M1.AxisY.V.Z = AxisZ.V.Y; M1.AxisZ.V.X = AxisX.V.Z; M1.AxisZ.V.Y = AxisY.V.Z; M1.AxisZ.V.Z = AxisZ.V.Z; M1.Pos.V.X = -(Pos.V.Dot(AxisX.V)); M1.Pos.V.Y = -(Pos.V.Dot(AxisY.V)); M1.Pos.V.Z = -(Pos.V.Dot(AxisZ.V)); }; Dwa sposoby z mojej klasy :]
Fajnie tylko ja potrzebuje macierz o zmiennym wymiarze, coś jak vector. Tzn rozmiar może być podawany przy tworzeniu i juz nie będzie zmieniany.
To jest możliwe - tyle że musisz wykorzystać tą zakomentowaną część kodu. Nie wiem jak to się robi w C#, ale w C++ to:template< int _iSize > class matrix{ .... };
A wszędzie, gdzie jest jakieś obliczenia, trzeba je sprytnie zastąpić pętlami. Coś jak:void Transpose(){ matrix<_iSize> temp = *this; for( int i = 0; i < _iSize * _iSize; i++ ){ *this[i/_iSize][i%_iSize] = temp[i%_iSize][i/_iSize]; } }
Chociaż z punktu widzenia wydajności, tworzenie takiej klasy jest bez sensu - pętle będą niepotrzebnie wydłużać czas działania metod - lepiej sobie napisac te mat2, mat3, mat4 oddzielnie.