2020-08-16三维空间下任意三角形到二维的矩阵变换

三维空间下任意三角形到二维的矩阵变换

**为了获得三维空间中 三角形平面上的点和三角形三个点的位置关系,并将其展现在平面上(纹理映射用),需要将三维空间中的三角形做矩阵变换,使其一点在原点上,一边在坐标轴上,平铺在xoz平面上。
解决方法:需要做一次平移矩阵变换与三次旋转矩阵变换。
加载eigen库,代码如下:

#include
#include <Eigen/Dense>
#include <math.h>
using namespace Eigen;
using namespace std;

struct Point
{
double x, y, z;
};

int main() {
//假设有三个点
Point A = {0,4.3,6};
Point B = {1,0.32,1};
Point C = { -1,0,3.9 };
//四次矩阵变换
Matrix4d m1,m2,m3,m4;
//装载点至向量
Vector4d PointA = { A.x,A.y,A.z,1 };
Vector4d PointB = { B.x,B.y,B.z,1 };
Vector4d PointC = { C.x,C.y,C.z,1 };
Vector4d TEMP;
double cos0, sin0;

m1 <<
	1, 0, 0, -A.x,
	0, 1, 0, -A.y,
	0, 0, 1, -A.z,
	0, 0, 0, 1;
TEMP = m1 * PointB;
cos0 = cos(atan(  (TEMP[2] ) / (-(TEMP[1]))  ));
sin0 = sin(atan(  (TEMP[2] ) / (-(TEMP[1]))  ));

m2 <<
	1, 0, 0, 0,
	0, cos0,-sin0, 0,
	0, sin0, cos0, 0,
	0, 0, 0, 1;

TEMP = m2 * (m1 * PointB);
cos0= cos(atan(    -(TEMP[1]) / (TEMP[0])   ));
sin0= sin(atan(    -(TEMP[1]) / (TEMP[0])   ));

m3 <<
	cos0,-sin0, 0, 0,
	sin0, cos0, 0, 0,
	0, 0, 1, 0,
	0, 0, 0, 1;

TEMP = m3*(m2 * (m1 * PointC));
cos0 = cos(atan(   (TEMP[1]) / (TEMP[2])   ));
sin0 = sin(atan(   (TEMP[1]) / (TEMP[2])   ));
m4 <<
	1, 0, 0, 0,
	0, cos0, -sin0, 0,
	0, sin0, cos0, 0,
	0, 0, 0, 1;


Vector4d projectedA, projectedB, projectedC;
projectedA =  m4*(m3*(m2*(m1*PointA)));
projectedB =  m4*(m3*(m2*(m1*PointB)));
projectedC =  m4*(m3*(m2*(m1*PointC)));
cout << projectedA << endl << endl;
cout << projectedB << endl << endl;
cout << projectedC << endl << endl;
cout << endl;
cout << "变换前三角形AB边长的平方:" << (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) + (A.z - B.z) * (A.z - B.z) << endl;
cout << "变换后三角形AB边长的平方:"<< (projectedA.x() - projectedB.x()) * (projectedA.x() - projectedB.x()) + (projectedA.y() - projectedB.y()) * (projectedA.y() - projectedB.y()) + (projectedA.z() - projectedB.z()) * (projectedA.z() - projectedB.z()) << endl;

cout << "变换前三角形BC边长的平方:" << (C.x - B.x) * (C.x - B.x) + (C.y - B.y) * (C.y - B.y) + (C.z - B.z) * (C.z - B.z) << endl;
cout << "变换后三角形BC边长的平方:" << (projectedC.x() - projectedB.x()) * (projectedC.x() - projectedB.x()) + (projectedC.y() - projectedB.y()) * (projectedC.y() - projectedB.y()) + (projectedC.z() - projectedB.z()) * (projectedC.z() - projectedB.z()) << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值