• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專職C++

            不能停止的腳步

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(28)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            在看DX過程中,沒有想到矩陣做用這么大。以前學的數學基本上忘光了。看到矩陣競然有點云里來,霧里去!是于沉下來,好好看了一下矩陣,并用C++模板了它。在這里只考慮使用,不考慮性能的問題。代碼如下。

              1 #ifndef _X_MATRIX_H_
              2 #define _X_MATRIX_H_
              3 #include <iostream>
              4 #include <cassert>
              5 
              6 using namespace std;
              7 
              8 template<class T>
              9 class XMatrix
             10 {
             11 public:
             12     //
             13     XMatrix()
             14         :m_Col(0),m_Row(0),m_Data(0)
             15     {}
             16     
             17     XMatrix(int parmaRow,int paramCol)
             18         :m_Col(0),m_Row(0),m_Data(0)
             19     {
             20         assert(paramCol >0 && parmaRow >0);
             21         InitMatrix(parmaRow,paramCol);    
             22     }
             23     
             24     XMatrix(const XMatrix<T> & paramMatrix)
             25         :m_Col(0),m_Row(0),m_Data(0)
             26     {
             27         InitMatrix(paramMatrix.m_Row, paramMatrix.m_Col);
             28         SetValue(paramMatrix.m_Data);
             29     }
             30     //
             31     ~XMatrix()
             32     {
             33         FreeMatrix();
             34     }
             35     //重載=
             36     XMatrix & operator = (const XMatrix<T> & paramMatrix)
             37     {
             38         ifthis != & paramMatrix)
             39         {
             40             InitMatrix(paramMatrix.m_Row, paramMatrix.m_Col);
             41             SetValue(paramMatrix.m_Data);
             42         }
             43         return *this;
             44     }
             45     //重載(),用于取矩陣的元素
             46     T & operator()(int paramRow, int paramCol)
             47     {
             48         return GetValue(paramRow, paramCol);
             49     }
             50     
             51     const T & operator()(int paramRow, int paramCol) const
             52     {
             53         return GetValue(paramRow, paramCol);
             54     }
             55     //
             56     void SetValue(const T * paramValueList)
             57     {
             58         assert(paramValueList != NULL);
             59         for(int i = 1; i <= m_Row; i++)
             60         {
             61             for(int j = 1; j <= m_Col; j++)
             62             {
             63                 SetValue(i,j,*paramValueList);
             64                 paramValueList ++;
             65             }
             66         }
             67     }
             68     void SetValue(int paramRow,int paramCol, const T & paramValue)
             69     {
             70         GetValue(paramRow,paramCol) = paramValue;
             71     }
             72     //
             73     int GetRow() const
             74     {
             75         return m_Row;
             76     }
             77 
             78     int GetCol() const
             79     {
             80         return m_Col;
             81     }
             82     //
             83     XMatrix<T> operator * ( const T & paramValue) const
             84     {
             85         XMatrix<T> r(*this);
             86         for(int i = 1; i <= r.GetRow(); i++)
             87         {
             88             for(int j = 1; j <= r.GetCol(); j++)
             89             {
             90                 r(i,j) = r(i,j) * paramValue;
             91             }
             92         }
             93         return r;
             94     }
             95 
             96     XMatrix<T> operator + (const XMatrix<T> & paramMatrix) const
             97     {
             98         assert(m_Col == paramMatrix.m_Col && m_Row == paramMatrix.m_Row);
             99         XMatrix<T> r(*this);
            100         for(int i = 1; i <= r.GetRow(); i++)
            101         {
            102             for(int j = 1; j <= r.GetCol(); j++)
            103             {
            104                 r(i,j) = r(i,j) + paramMatrix(i,j);
            105             }
            106         }        
            107         return r;
            108     }
            109     XMatrix<T> operator - (const XMatrix<T> & paramMatrix) const
            110     {
            111         assert(m_Col == paramMatrix.m_Col && m_Row == paramMatrix.m_Row);
            112         XMatrix<T> r(*this);
            113         for(int i = 1; i <= r.GetRow(); i++)
            114         {
            115             for(int j = 1; j <= r.GetCol(); j++)
            116             {
            117                 r(i,j) = r(i,j) - paramMatrix(i,j);
            118             }
            119         }        
            120         return r;
            121     }
            122     XMatrix<T> operator * ( const XMatrix<T> & paramMatrix ) const
            123     {
            124         assert(m_Col == paramMatrix.m_Row );
            125         XMatrix<T> r(m_Row, paramMatrix.m_Col);
            126         r.Clear(0);
            127         int n = paramMatrix.m_Row;
            128         for(int i = 1; i <= r.GetRow(); i++)
            129         {
            130             for(int j = 1; j <= r.GetCol(); j++)
            131             {
            132                 forint k = 1; k <= n; k ++)
            133                 {
            134                     r(i,j) = r(i,j) + GetValue(i,k) * paramMatrix(k,j);
            135                 }
            136             }
            137         }
            138         return r;
            139     }
            140     void Clear(const T & paramValue)
            141     {
            142         for(int i = 1; i <= GetRow(); i++)
            143         {
            144             for(int j = 1; j <= GetCol(); j++)
            145             {
            146                 SetValue(i,j,paramValue);
            147             }
            148         }    
            149     }
            150 
            151 
            152     const T & GetValue(int paramRow,int paramCol) const 
            153     {
            154         assert(paramCol > 0 && paramRow > 0);
            155         assert( paramRow <= GetRow() && paramCol <= GetCol() );
            156         return m_Data[(paramRow - 1)*m_Col + (paramCol-1)];
            157     }
            158 
            159     T & GetValue(int paramRow,int paramCol)
            160     {
            161         assert(paramCol > 0 && paramRow > 0);
            162         assert( paramRow <= GetRow() && paramCol <= GetCol() );
            163         return m_Data[(paramRow - 1)*m_Col + (paramCol-1)];
            164     }
            165 
            166     bool operator == (const XMatrix<T> &paramMatrix) const
            167     {
            168         assert(m_Col == paramMatrix.m_Col && m_Row == paramMatrix.m_Row);
            169         for(int i = 1; i <= GetRow(); i++)
            170         {
            171             for(int j = 1; j <= GetCol(); j++)
            172             {
            173                 if( GetValue(i,j) != paramMatrix(i,j) ) 
            174                 {
            175                     return false;
            176                 }
            177             }
            178         }
            179         return false;
            180     }
            181 
            182     bool operator != (const XMatrix<T> &paramMatrix) const
            183     {
            184         return !(*this == paramMatrix);
            185     }
            186 
            187     XMatrix<T> Transpose() const //矩陣轉置
            188     {
            189         XMatrix<T> r( GetCol(), GetRow() );
            190         for(int i = 1; i <= GetRow(); i++ )
            191         {
            192             for(int j = 1; j <= GetCol(); j++)
            193             {
            194                 r(j,i) = GetValue(i,j);
            195             }
            196         }
            197         return r;
            198     }
            199     //
            200     void Reset(int parmaRow,int paramCol)
            201     {
            202         assert(paramCol >0 && parmaRow >0);
            203         InitMatrix(parmaRow, paramCol);
            204     }
            205 private:
            206     void InitMatrix(int parmaRow,int paramCol)
            207     {
            208         FreeMatrix();
            209         m_Col = paramCol;
            210         m_Row = parmaRow;
            211         m_Data = new T[parmaRow * paramCol];
            212         Zero();
            213     }
            214 
            215     void FreeMatrix()
            216     {
            217         if(m_Data != NULL)
            218         {
            219             delete[] m_Data;
            220             m_Data = NULL;
            221         }
            222         m_Col = 0;
            223         m_Row = 0;
            224     }
            225 
            226     void Zero()
            227     {
            228         unsigned char * pC = (unsigned char *)m_Data;
            229         int iBytes = GetRow() * GetCol() * sizeof(T);
            230         for(int i = 0; i < iBytes; i++,pC++)
            231         {
            232             *pC = 0;
            233         }        
            234     }
            235 private:
            236     T * m_Data;
            237     int m_Col;
            238     int m_Row;
            239 };
            240 
            241 
            242 template<class T>
            243 XMatrix<T> operator * (const T & paramValue, const XMatrix<T> & paramMatrix)
            244 {
            245     return paramMatrix * paramValue;
            246 }
            247 
            248 template<class T>
            249 ostream & operator << (ostream & o,const XMatrix<T> & paramMatrix)
            250 {
            251     for(int i = 1; i <= paramMatrix.GetRow(); i++)
            252     {
            253         for(int j = 1; j <= paramMatrix.GetCol(); j++)
            254         {
            255             o << paramMatrix(i,j);
            256             if( j < paramMatrix.GetCol() ) cout<<",";
            257         }
            258         cout<<endl;
            259     }
            260     return o;
            261 }
            262 
            263 #endif
            264 

            浮點數矩陣定義
            typedef XMatrix<float> FloatMatrix;

            為了驗證,特別寫了一組個DX中仿D3DX矩陣生成函數。只需把函數名的X換成D3DX就變成對就的DX的函數定義了。
             1 FloatMatrix * XMatrixIndentity( FloatMatrix * paramMatrixOut);
             2 FloatMatrix * XMatrixScaling(FloatMatrix * paramMatrixOut,float paramX, float paramY, float paramZ);
             3 FloatMatrix * XMatrixTranslation(FloatMatrix * paramMatrixOut,float paramX, float paramY, float paramZ);
             4 FloatMatrix * XMatrixMultiply(FloatMatrix * paramMatrixOut, FloatMatrix * paramM1, FloatMatrix * paramM2);
             5 FloatMatrix * XMatrixRotationX(FloatMatrix * paramMatrixOut, float paramAngle);
             6 FloatMatrix * XMatrixRotationY(FloatMatrix * paramMatrixOut, float paramAngle);
             7 FloatMatrix * XMatrixRotationZ(FloatMatrix * paramMatrixOut, float paramAngle);
             8 FloatMatrix * XMatrixOrthoOffCenterLH(FloatMatrix * paramMatrixOut, float paramLeft, float paramRight, float paramBottom, float paramTop, float paramZ_Near, float paramZ_Far);
             9 
            10 FloatMatrix * XMatrixScaling(FloatMatrix * paramMatrixOut,float paramX, float paramY, float paramZ)
            11 {
            12     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            13     XMatrixIndentity(paramMatrixOut);
            14     paramMatrixOut->SetValue(1,1,paramX);
            15     paramMatrixOut->SetValue(2,2,paramY);
            16     paramMatrixOut->SetValue(3,3,paramZ);
            17     paramMatrixOut->SetValue(4,4,1);
            18     return paramMatrixOut;
            19 }
            20 
            21 FloatMatrix * XMatrixIndentity( FloatMatrix * paramMatrixOut)
            22 {
            23     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            24     paramMatrixOut->Clear(0.0f);
            25     paramMatrixOut->SetValue(1,1,1.0f);
            26     paramMatrixOut->SetValue(2,2,1.0f);
            27     paramMatrixOut->SetValue(3,3,1.0f);
            28     paramMatrixOut->SetValue(4,4,1.0f);
            29     return paramMatrixOut;
            30 }
            31 
            32 FloatMatrix * XMatrixTranslation(FloatMatrix * paramMatrixOut,float paramX, float paramY, float paramZ)
            33 {
            34     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            35     XMatrixIndentity(paramMatrixOut);
            36     paramMatrixOut->SetValue(4,1,paramX);
            37     paramMatrixOut->SetValue(4,2,paramY);
            38     paramMatrixOut->SetValue(4,3,paramZ);
            39     return paramMatrixOut;
            40 }
            41 
            42 FloatMatrix * XMatrixMultiply(FloatMatrix * paramMatrixOut, FloatMatrix * paramM1, FloatMatrix * paramM2)
            43 {
            44     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            45     assert(paramM1 != NULL&& paramM1->GetCol() == 4 && paramM1->GetRow() == 4);
            46     assert(paramM2 != NULL&& paramM2->GetCol() == 4 && paramM2->GetRow() == 4);
            47     *paramMatrixOut = (*paramM1) * (*paramM2);
            48     return paramMatrixOut;
            49 }
            50 
            51 FloatMatrix * XMatrixRotationX(FloatMatrix * paramMatrixOut, float paramAngle)
            52 {
            53     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            54     XMatrixIndentity(paramMatrixOut);
            55     paramMatrixOut->GetValue(2,2= cosf(paramAngle);
            56     paramMatrixOut->GetValue(2,3= sinf(paramAngle);
            57     paramMatrixOut->GetValue(3,2= -sinf(paramAngle);
            58     paramMatrixOut->GetValue(3,3= cosf(paramAngle);
            59     return paramMatrixOut;
            60 }
            61 
            62 FloatMatrix * XMatrixRotationY(FloatMatrix * paramMatrixOut, float paramAngle)
            63 {
            64     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            65     XMatrixIndentity(paramMatrixOut);
            66     paramMatrixOut->GetValue(1,1= cosf(paramAngle);
            67     paramMatrixOut->GetValue(1,3= -sinf(paramAngle);
            68     paramMatrixOut->GetValue(3,1= sinf(paramAngle);
            69     paramMatrixOut->GetValue(3,3= cosf(paramAngle);
            70     return paramMatrixOut;
            71 }
            72 
            73 
            74 FloatMatrix * XMatrixRotationZ(FloatMatrix * paramMatrixOut, float paramAngle)
            75 {
            76     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            77     XMatrixIndentity(paramMatrixOut);
            78     paramMatrixOut->GetValue(1,1= cosf(paramAngle);
            79     paramMatrixOut->GetValue(1,2= sinf(paramAngle);
            80     paramMatrixOut->GetValue(2,1= -sinf(paramAngle);
            81     paramMatrixOut->GetValue(2,2= cosf(paramAngle);
            82     return paramMatrixOut;
            83 }
            84 // 2/(r-l)      0            0           0
            85 // 0            2/(t-b)      0           0
            86 // 0            0            1/(zf-zn)   0
            87 // (l+r)/(l-r)  (t+b)/(b-t)  zn/(zn-zf)  1
            88 FloatMatrix * XMatrixOrthoOffCenterLH(FloatMatrix * paramMatrixOut, float paramLeft, float paramRight, float paramBottom, float paramTop, float paramZ_Near, float paramZ_Far)
            89 {
            90     assert(paramMatrixOut != NULL&& paramMatrixOut->GetCol() == 4 && paramMatrixOut->GetRow() == 4);
            91     XMatrixIndentity(paramMatrixOut);
            92     paramMatrixOut->GetValue(1,1= 2.0f /( paramRight - paramLeft);
            93     paramMatrixOut->GetValue(2,2= 2.0f /( paramTop - paramBottom);
            94     paramMatrixOut->GetValue(3,3= 1.0f /( paramZ_Far - paramZ_Near);
            95     paramMatrixOut->GetValue(4,1= (paramLeft + paramRight) / (paramLeft - paramRight);
            96     paramMatrixOut->GetValue(4,2= (paramTop + paramBottom) / (paramBottom - paramTop);
            97     paramMatrixOut->GetValue(4,3= paramZ_Near/(paramZ_Near-paramZ_Far);
            98     return paramMatrixOut;
            99 }




            posted on 2010-02-03 09:47 冬瓜 閱讀(2150) 評論(0)  編輯 收藏 引用 所屬分類: 原創DirectX
            亚洲精品乱码久久久久久按摩 | 国产高清国内精品福利99久久| 亚洲日本va午夜中文字幕久久| 91精品无码久久久久久五月天| 色欲久久久天天天综合网| 开心久久婷婷综合中文字幕| 99久久99久久精品国产片| 99久久99久久精品国产| 国产成人精品久久免费动漫| 亚洲AV无码一区东京热久久| 99精品国产综合久久久久五月天| 中文字幕无码久久精品青草| 久久久91人妻无码精品蜜桃HD| 久久午夜福利电影| 开心久久婷婷综合中文字幕| 日本高清无卡码一区二区久久| 久久久久亚洲av毛片大| 久久中文字幕精品| 午夜久久久久久禁播电影| 国产精品久久久久AV福利动漫| 国产精品久久久久久影院| 香蕉久久夜色精品国产小说| 国产精品午夜久久| 要久久爱在线免费观看| 久久精品国产免费观看三人同眠| 婷婷伊人久久大香线蕉AV| 9久久9久久精品| 欧美麻豆久久久久久中文| 无码人妻精品一区二区三区久久| 91视频国产91久久久| 久久99精品久久久久久水蜜桃| 思思久久99热只有频精品66| 精品久久人妻av中文字幕| www亚洲欲色成人久久精品| 亚洲国产精品成人AV无码久久综合影院| 中文字幕久久亚洲一区| 97久久香蕉国产线看观看| 久久久久亚洲精品男人的天堂| 国产精品99久久久精品无码| AV狠狠色丁香婷婷综合久久| 天天综合久久一二三区|