📄 matrix.html
字号:
<html>
<head>
<title>计算机图形学-光栅图形学</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script type="text/javascript" src="mtmtrack.js">
</script>
</head>
<body background="../snow.GIF">
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" height="48" width="739">
<tr align="left">
<td bgcolor="#009eea" height="30" width="457">
<p style="line-height: 150%"><small><font color="#000000">您现在的位置>></font><font
color="#FFFFFF">网上教程</font><font color="#000080">>></font></small><font face="宋体" color="#000080" size="2">计算机图形学>>附录D
矩阵运算类</font></td>
<td height="30" width="282">
<p style="line-height: 150%"></td>
</tr>
<tr align="center">
<td colspan="2" height="1" width="739">
<p style="line-height: 150%"><br>
</p>
<table border="1" bordercolor="#009eea" cellpadding="0" cellspacing="0" width="652">
<tbody>
<tr>
<td width="648">
<table border="0" cellpadding="0" cellspacing="0" height="962"
width="101%" style="border-top-width: 0; border-bottom-width: 0">
<tbody>
<tr>
<td bgcolor="#009eea" colspan="3" height="25" width="100%">
<p align="center" style="line-height: 150%">
<font color="#FFFFFF">矩阵运算及其在C++中的实现</font>
</td>
</tr>
<tr>
<td height="937" width="4%" style="border-right-style: none; border-right-width: medium">
<p style="line-height: 150%"></td>
<td height="937" width="91%" valign="top" style="border-style: none; border-width: medium">
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150%">
<font face="宋体" size="3"> </font></p>
<p style="LINE-HEIGHT: 150%">
<b><font face="宋体" size="5"><a name="001"></a>D.1 矩阵类定义</font></b></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150%">
<font face="宋体" size="3">
在计算机图形学中,很多运算都可以用矩阵运算(特别是矩阵乘)来描述,在程序设计过程中也不可避免的要使用到矩阵。一个比较自然的思路是用二维数组表示矩阵,但这样一来,矩阵的加,乘,拷贝等一系列运算都不方便实现。考虑面向对象程序设计技术,在C++语言中可以设计一个矩阵类,以完成矩阵的加,乘,拷贝等一系列运算是一个比较好的办法。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150%">
<font face="宋体" size="3"> 可以如下来定义一个矩阵类:</font></p>
<blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体"><font color="#008000">// CMatrix.h: interface for
the CMatrix class.<br>
//<br>
//////////////////////////////////////////////////////////////////////</font><br>
<br>
<font color="#0000FF">#if</font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体">!<font color="#0000FF">defined</font>(AFX_CMATRIX_H__CC2F3E15_9F82_11D4_A203_0000E81BB9DD__INCLUDED_)<br>
<font color="#0000FF">#define</font>
AFX_CMATRIX_H__CC2F3E15_9F82_11D4_A203_0000E81BB9DD__INCLUDED_<br>
<br>
<font color="#0000FF">#if</font> _MSC_VER > 1000<br>
<font color="#0000FF">#pragma once</font><br>
<font color="#0000FF">#endif</font> // _MSC_VER > 1000<br>
<br>
<font color="#008000">//用TYPE来定义double数据类型</font><br>
<font color="#0000FF">#define</font> TYPE <font color="#0000FF">
double</font><br>
<br>
<font color="#0000FF">class</font> CMatrix <br>
{</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体"><font color="#0000FF">public</font>:</font></p>
<blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体"><font color="#008000">//构造函数<br>
//无参构造函数</font><br>
CMatrix();<br>
<font color="#008000">//利用参数RowNumber和ColumnNumber构造矩阵</font><br>
CMatrix(<font color="#0000FF">int</font> RowNumber,
<font color="#0000FF">int</font> ColumnNumber);<br>
<font color="#008000">//拷贝构造函数,利用传入的矩阵Matrix拷贝构造另一个矩阵</font><br>
CMatrix(CMatrix& Matrix);<br>
<br>
<font color="#008000">//析构函数</font><br>
<font color="#0000FF">virtual</font> ~CMatrix();<br>
<br>
<font color="#008000">//用指定的RowNumber和ColumnNumber创建矩阵</font><br>
Create(<font color="#0000FF">int</font> RowNumber,
<font color="#0000FF">int</font> ColumnNumber);<br>
<br>
<font color="#008000">//获得矩阵的行数</font><br>
<font color="#0000FF">int</font> GetRowNumber();<br>
<font color="#008000">//获得矩阵的列数</font><br>
<font color="#0000FF">int</font> GetColumnNumber();<br>
<br>
<font color="#008000">//操作符重载<br>
// * 操作符</font><br>
CMatrix <font color="#0000FF">operator</font> *(CMatrix &Num2);<br>
<font color="#008000">// [] 操作符</font><br>
TYPE* CMatrix::<font color="#0000FF">operator</font>[](int Row);<br>
<font color="#008000">// *= 操作符</font><br>
<font color="#0000FF">void</font> CMatrix::<font color="#0000FF">operator</font>
*=(TYPE Number);<br>
<font color="#008000">// += 操作符</font><br>
<font color="#0000FF">void</font> CMatrix::<font color="#0000FF">operator</font>
+=(CMatrix& Other);<br>
<font color="#008000">// = 操作符</font><br>
<font color="#0000FF">void</font> CMatrix::<font color="#0000FF">operator</font>
=(CMatrix& Other);<br>
<font color="#008000">// + 操作符</font><br>
CMatrix CMatrix::<font color="#0000FF">operator</font> +(CMatrix
&Other);<br>
<br>
<font color="#008000">//用于调试的转储函数</font><br>
<font color="#0000FF">void</font> Dump();<br>
<font color="#0000FF">void</font> Fill(TYPE FillNumber);<br>
<font color="#008000">//生成单位阵</font><br>
<font color="#0000FF">void</font> MakeUnit();</font></p>
</blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体"><br>
<font color="#0000FF">private</font>:</font></p>
<blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体"><font color="#008000">//矩阵列数</font><br>
<font color="#0000FF">int</font> ColumnNumber;<br>
<font color="#008000">//矩阵行数</font><br>
<font color="#0000FF">int</font> RowNumber;<br>
<font color="#008000">//矩阵元素</font><br>
TYPE *data;</font></p>
</blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; ">
<font face="宋体">};<br>
<br>
<font color="#0000FF">#endif</font> // !<font color="#0000FF">defined</font>(AFX_CMATRIX_H__CC2F3E15_9F82_11D4_A203_0000E81BB9DD__INCLUDED_)</font></p>
</blockquote>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 150%">
<font face="宋体" size="3">
由上述类结构可见,这个类实际上主要是重载了很多的运算符,这样一来,在程序中可以类似于这样去写:</font></p>
<p style="line-height: 150%; margin-top: 0px; margin-bottom: 0px">
<font face="宋体" size="3"> Matrix3 = Matrix1 * Matrix2;</font></p>
<p style="line-height: 150%; margin-top: 0px; margin-bottom: 0px">
<font face="宋体" size="3">以实现两个矩阵的相乘。这样的写法无疑是非常清晰明了的,而且利于代码重用。</font></p>
<p style="line-height: 150%; margin-top: 0px; margin-bottom: 0px">
<font face="宋体" size="3"> 在矩阵设计的过程中规定了每个元素必须是double(</font><font face="宋体"><font color="#0000FF">#define</font>
TYPE <font color="#0000FF">double</font></font><font face="宋体" size="3">)型,其实这里更好的写法是使用类模板。这个类是很多图形学算法的基础,希望大家能够将其进一步扩展以实现矩阵运算的更多功能。</font></p>
<p style="MARGIN-TOP: 10px; MARGIN-BOTTOM: 10px; LINE-HEIGHT: 150%">
<b><font face="宋体" size="5"><a name="002"></a>D.2 矩阵类关键技术的实现</font></b></p>
<p style="line-height: 150%; margin-top: 0px; margin-bottom: 0px">
在CMatrix类中主要是类的创建和操作符的重载。</p>
<p style="line-height: 150%; margin-top: 0px; margin-bottom: 0px">
<b><font face="宋体" size="3">D.2.1 构造函数</font></b></p>
<blockquote>
<p style="margin-top: 0px; margin-bottom: 0px">
<font color="#008000">
////////////////////////////////////////////////////////////////////////<br>
//构造函数CMatrix()<br>
//----------------------------------------------------------------------<br>
//基本功能:用传入的参数构造矩阵类对象。这里动态生成一个二维数组,用于存<br>
//
储矩阵数据,数组类形已定义为double型。<br>
//----------------------------------------------------------------------<br>
//参数说明:int RowNumber 矩阵的行数<br>
// int
ColumnNumber 矩阵的列数<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -