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

專職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 冬瓜 閱讀(2172) 評論(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>
            亚洲午夜激情网站| 亚洲欧美日韩在线播放| 欧美极品一区二区三区| 另类av一区二区| 麻豆国产精品一区二区三区| 久久久久久亚洲精品不卡4k岛国| 欧美专区福利在线| 久久久美女艺术照精彩视频福利播放 | 欧美成年人网站| 欧美黄污视频| 亚洲精品色婷婷福利天堂| 国产精品一区二区在线| 国产视频自拍一区| 影音先锋中文字幕一区二区| 亚洲精品少妇| 亚洲欧美成人| 美女诱惑一区| 一本久道久久综合狠狠爱| 亚洲免费影视| 免费不卡亚洲欧美| 国产精品欧美日韩一区| 亚洲第一网站| 亚洲女人av| 亚洲电影免费观看高清| 亚洲免费av电影| 久久大综合网| 欧美日韩在线精品| 亚洲电影免费观看高清完整版| 一区二区三区国产盗摄| 另类天堂av| 亚洲一区二区三区精品视频| 另类春色校园亚洲| 国产欧美日韩精品a在线观看| 精品成人乱色一区二区| 亚洲免费网站| 亚洲高清久久| 久久久久国产精品厨房| 欧美亚洲成人精品| 亚洲免费观看| 欧美成人亚洲成人| 欧美专区中文字幕| 国产精品视频yy9099| 亚洲精品久久久久久下一站 | 国产精品99久久久久久人| 国产精品大片| 欧美国产视频在线| 激情成人av在线| 午夜精品久久久久久久久久久久| 亚洲国产精品成人久久综合一区 | 日韩一级欧洲| 欧美国产免费| 亚洲第一精品夜夜躁人人躁| 久久精品91久久香蕉加勒比| 日韩午夜在线| 欧美成人免费va影院高清| 1000部精品久久久久久久久| 欧美一级二区| 亚洲一区二区精品| 欧美视频一区| 亚洲已满18点击进入久久| 日韩视频久久| 欧美性猛交99久久久久99按摩 | 激情综合激情| 久久人人九九| 久久精品99国产精品酒店日本| 国产欧美日韩精品a在线观看| 午夜在线视频观看日韩17c| 一区二区三区av| 国产精品久久久久久久电影| 亚洲影视中文字幕| 午夜在线一区二区| 激情偷拍久久| 亚洲国产日本| 欧美日韩一区免费| 欧美一区激情视频在线观看| 欧美一激情一区二区三区| 激情欧美一区二区三区| 亚洲高清视频在线| 欧美三区在线观看| 欧美在线视频a| 欧美一级视频精品观看| 尤物精品在线| 亚洲蜜桃精久久久久久久| 国产精品色午夜在线观看| 玖玖国产精品视频| 欧美成人激情视频| 亚洲一区二区影院| 久久激情网站| 亚洲视频在线播放| 午夜欧美精品久久久久久久| 国外视频精品毛片| 亚洲精品视频免费观看| 国产视频观看一区| 亚洲欧洲视频在线| 国产欧美在线视频| 欧美激情一区二区三区蜜桃视频| 欧美日韩亚洲视频一区| 久久久久欧美精品| 欧美视频一区在线| 欧美jjzz| 国产精品视频免费一区| 欧美国产三区| 亚洲午夜久久久久久久久电影网| 亚洲一区二区三区免费在线观看| 亚洲无线观看| 亚洲国产视频一区| 午夜在线精品偷拍| 亚洲一区在线播放| 欧美激情视频给我| 免费h精品视频在线播放| 欧美性做爰猛烈叫床潮| 欧美激情按摩| 国产一区二区三区在线播放免费观看| 欧美激情国产日韩精品一区18| 国产精品亚洲综合一区在线观看| 亚洲国产综合91精品麻豆| 国内成+人亚洲| 亚洲欧美日韩在线不卡| 亚洲伊人网站| 欧美日韩精品伦理作品在线免费观看| 久久综合九色综合欧美狠狠| 国产日韩欧美一区二区三区四区| 亚洲黄色高清| 亚洲国产精品99久久久久久久久| 欧美在线观看一区| 欧美一区二区免费视频| 欧美视频中文字幕在线| 亚洲美女性视频| 一道本一区二区| 免费试看一区| 免费观看日韩av| 一区久久精品| 久久精品国产第一区二区三区| 午夜精品福利视频| 国产精品视频久久一区| 亚洲欧美日韩一区在线| 亚洲欧美日韩网| 国产伦精品一区二区三区免费迷| 亚洲天堂av高清| 午夜精品一区二区三区电影天堂| 欧美日韩在线高清| 9l国产精品久久久久麻豆| 亚洲视频在线二区| 国产精品视频yy9099| 欧美亚洲一级| 欧美~级网站不卡| 亚洲三级影片| 欧美日韩精品一区二区三区四区| 亚洲毛片在线观看| 亚洲一区二区在| 国产欧美日本| 久久久亚洲国产天美传媒修理工| 老色批av在线精品| 亚洲精品乱码久久久久| 欧美日韩在线精品| 午夜精品区一区二区三| 久久久噜噜噜久久人人看| 亚洲丰满在线| 欧美屁股在线| 欧美一区二区在线看| 欧美二区在线看| 这里只有精品丝袜| 国产欧美精品一区| 美国成人直播| 一区二区三区四区五区精品| 久久久久久综合| 一本综合久久| 韩国av一区二区三区四区| 欧美成人久久| 香蕉久久国产| 亚洲日本免费| 久久亚洲电影| 亚洲综合大片69999| 亚洲国产精品一区二区尤物区| 夜夜爽99久久国产综合精品女不卡 | 久久亚洲综合网| 一本久久综合| 欧美国产免费| 久久国产欧美| 国产精品99久久久久久久久久久久| 国产精品亚洲综合色区韩国| 另类激情亚洲| 欧美一区二区免费视频| 亚洲精品视频在线| 麻豆精品在线视频| 亚洲欧美国产日韩中文字幕| 国产综合精品一区| 欧美亚洲第一页| 欧美激情精品久久久久久大尺度| 亚洲欧美日韩一区二区| 亚洲久久视频| 亚洲福利视频在线| 免费成人黄色| 久久xxxx| 亚洲欧美日韩精品久久久| 日韩午夜精品| 亚洲精品国产精品国自产观看| 国产无遮挡一区二区三区毛片日本| 欧美精品二区| 欧美高清在线播放|