下面程序,容易看出行主序在坐标点变换中效率更高
#include <WINDOWS.H>
#include <IOSTREAM>
using namespace std;
enum MatrixIndex
{
Xx, Xy, Xz, Xi, // X方向
Yx, Yy, Yz, Yi, // y方向
Zx, Zy, Zz, Zi, // z方向
Tx, Ty, Tz, Ii, // 移动
};
struct POINT3D
{
double x, y, z;
POINT3D() { ZeroMemory(this, sizeof(POINT3D)); }
POINT3D(double tx, double ty, double tz) {x = tx; y = ty; z = tz;}
void Modify(float *pglM)
{
double x1=0.0, y1=0.0, z1=0.0;
x1 = x*pglM[Xx] + y*pglM[Yx] + z*pglM[Zx] + pglM[Tx];
y1 = x*pglM[Xy] + y*pglM[Yy] + z*pglM[Zy] + pglM[Ty];
z1 = x*pglM[Xz] + y*pglM[Yz] + z*pglM[Zz] + pglM[Tz];
x = x1;
y = y1;
z = z1;
}
void ModifyT(float *pglM)
{
double x1=0.0, y1=0.0, z1=0.0;
x1 = x*(*pglM++); x1 += y*(*pglM++); x1 += z*(*pglM++); x1 += (*pglM++);
y1 = x*(*pglM++); y1 += y*(*pglM++); y1 += z*(*pglM++); y1 += (*pglM++);
z1 = x*(*pglM++); z1 += y*(*pglM++); z1 += z*(*pglM++); z1 += (*pglM++);
x = x1;
y = y1;
z = z1;
}
};
void main()
{
// 列主序
float M[16] =
{
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
2.0, 2.0, 2.0, 1.0 // Trans
};
POINT3D pt(1.0, 2.0, 3.0);
pt.Modify(M);
cout << pt.x << " " << pt.y << " " << pt.z << endl;
// 行主序
float MT[16] =
{ //Trans
1.0, 0.0, 0.0, 2.0,
0.0, 1.0, 0.0, 2.0,
0.0, 0.0, 1.0, 2.0,
0.0, 0.0, 0.0, 1.0
};
POINT3D pt2(1.0, 2.0, 3.0);
pt2.ModifyT(MT);
cout << pt2.x << " " << pt2.y << " " << pt2.z << endl;
}