青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專職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 冬瓜 閱讀(2173) 評論(0)  編輯 收藏 引用 所屬分類: 原創DirectX
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美另类在线| 国产精品毛片va一区二区三区| 亚洲第一在线综合网站| 午夜一区二区三区在线观看| 一区二区久久久久| 一区二区三区回区在观看免费视频 | 久久亚洲电影| 久久综合伊人77777蜜臀| 另类综合日韩欧美亚洲| 亚洲精品1区2区| 在线观看欧美日本| 亚洲国产精品一区制服丝袜 | 欧美日韩高清在线观看| 国产精品劲爆视频| 在线国产日韩| 亚洲欧美日韩一区| 蜜桃伊人久久| 一本大道av伊人久久综合| 亚洲综合国产精品| 欧美 日韩 国产在线| 国产精品视频网址| 日韩视频一区二区三区| 久久精品视频在线免费观看| 91久久精品一区| 欧美一区二区在线免费观看| 欧美国产日本韩| 国产在线播放一区二区三区| 亚洲激情自拍| 久久久亚洲精品一区二区三区 | 亚洲国产精品一区在线观看不卡| 日韩亚洲在线| 久久综合五月| 国产亚洲毛片| 亚洲一区二区三| 亚洲丶国产丶欧美一区二区三区| 亚洲在线网站| 欧美经典一区二区| 一区二区三区在线视频免费观看| 这里只有精品视频| 欧美国产亚洲另类动漫| 亚洲欧美一级二级三级| 欧美日韩国产综合一区二区| 亚洲国产高潮在线观看| 久久久久久久久久久久久女国产乱| 亚洲精品资源美女情侣酒店| 久久夜色撩人精品| 在线不卡中文字幕播放| 久久婷婷综合激情| 欧美一级久久久久久久大片| 国产精品久久久久久久app| 久久国产加勒比精品无码| 欧美激情第一页xxx| 久久久久女教师免费一区| 国产嫩草一区二区三区在线观看 | 久久狠狠亚洲综合| 亚洲一区二区三区激情| 欧美午夜无遮挡| 中文av一区二区| 亚洲麻豆一区| 欧美视频一区二区在线观看 | 日韩午夜中文字幕| 国产精品久久网| 欧美视频在线观看| 亚洲免费av网站| 欧美成人小视频| 欧美成人国产va精品日本一级| 亚洲乱码国产乱码精品精天堂| 免费美女久久99| 另类天堂av| 91久久一区二区| 欧美激情影院| 欧美精品在线视频观看| 一区二区三区四区精品| 亚洲视频精选在线| 国产精品一区二区久久精品| 欧美一级网站| 久久亚洲视频| 亚洲精品护士| 亚洲女ⅴideoshd黑人| 国产亚洲一区二区三区在线播放| 久久久国产91| 欧美激情综合在线| 亚洲欧美一区二区精品久久久| 午夜激情综合网| 亚洲第一页中文字幕| 亚洲日本国产| 国产网站欧美日韩免费精品在线观看| 欧美一区二区女人| 蜜桃久久av一区| 亚洲欧美视频| 免费成人性网站| 亚洲欧美日韩国产中文在线| 欧美在线视频观看| 亚洲精品久久| 午夜久久电影网| 亚洲精选一区二区| 亚洲欧美国产日韩中文字幕| 亚洲二区视频| 午夜精品久久久久久久久久久| 一区二区亚洲欧洲国产日韩| 一本久道久久久| 亚洲精品国产精品国自产在线 | 欧美一区二区三区在线播放| 久久久久久久一区二区三区| 一区二区三区日韩欧美| 久久亚洲私人国产精品va| 午夜在线成人av| 欧美理论视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美色道久久88综合亚洲精品| 麻豆成人小视频| 国产无一区二区| 一区二区高清在线观看| 亚洲欧洲在线免费| 欧美一区免费| 欧美一区二区三区免费观看视频| 欧美成人小视频| 久久综合色播五月| 国产欧美日本一区二区三区| 亚洲免费激情| 日韩一区二区高清| 欧美成人精品福利| 国产欧美在线| 亚洲美洲欧洲综合国产一区| 欧美伊人久久大香线蕉综合69| 亚洲一区二区三区四区五区午夜| 美女网站久久| 女同性一区二区三区人了人一 | 一区二区三区久久久| 久久免费偷拍视频| 噜噜噜在线观看免费视频日韩 | 欧美日韩另类丝袜其他| 欧美华人在线视频| 亚洲国产片色| 欧美激情第三页| 亚洲人成77777在线观看网| 亚洲欧洲一区二区在线观看| 欧美freesex8一10精品| 亚洲国产精品成人综合色在线婷婷| 在线观看久久av| 猛男gaygay欧美视频| 亚洲国产欧美一区| 一区二区三区|亚洲午夜| 欧美日韩国产限制| 在线一区二区视频| 欧美在线一级视频| 国产一区自拍视频| 久久婷婷国产综合精品青草| 欧美91福利在线观看| 亚洲日韩欧美一区二区在线| 欧美极品一区| 亚洲一区二区三区777| 久久久91精品国产一区二区三区| 狠狠88综合久久久久综合网| 狼狼综合久久久久综合网| 亚洲国产成人久久综合| 亚洲特黄一级片| 国产一区二区三区最好精华液| 久久狠狠亚洲综合| 亚洲人成网站777色婷婷| 亚洲在线观看免费| 国产欧美日韩视频一区二区三区| 欧美在线网站| 亚洲精品久久在线| 久久精品国产一区二区三区免费看| 精品动漫3d一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 99riav1国产精品视频| 久久久久久免费| 亚洲作爱视频| 黄色一区三区| 国产精品成人一区二区三区吃奶| 欧美一区二区在线免费播放| 亚洲福利专区| 久久爱www| 一区二区欧美国产| 一区二区三区在线视频免费观看| 欧美日韩国产区| 久久久999国产| 亚洲天堂av图片| 亚洲国产成人久久综合| 久久精品国产69国产精品亚洲| 日韩一区二区高清| 国内欧美视频一区二区| 欧美精品一区二区三区一线天视频| 一区二区三区精密机械公司 | 午夜精品免费| 娇妻被交换粗又大又硬视频欧美| 亚洲婷婷国产精品电影人久久 | aa级大片欧美三级| 久久视频在线看| 午夜激情综合网| 999在线观看精品免费不卡网站| 国产一区二区精品久久91| 欧美午夜精彩| 欧美国产视频在线观看| 开心色5月久久精品| 久久久久久久久久久久久久一区| 亚洲一区二区毛片| 亚洲一区二区三区高清|