平移矩阵、点绕轴的旋转矩阵、平面直角坐标系旋转矩阵、点绕向量旋转公式(罗德里格斯旋转公式)

平移矩阵

点绕轴的旋转矩阵

平面直角坐标系旋转矩阵

点绕向量旋转公式(罗德里格斯旋转公式)

代码

cpp 复制代码
#include "myPoint.h"
#include <cmath>
myPoint::myPoint()
{
	m_x = m_y = m_z = 0;
}

myPoint::myPoint(double x, double y, double z):m_x(x),m_y(y),m_z(z)
{
}

myPoint::myPoint(const myPoint& ref) : m_x(ref.X()), m_y(ref.Y()), m_z(ref.Z())
{
}

myPoint myPoint::operator=(const myPoint& rhs)
{
	SetX(rhs.X());
	SetY(rhs.Y());
	SetZ(rhs.Z());
	return *this;
}

void myPoint::SetX(double x)
{
	m_x = x;
}

void myPoint::SetY(double y)
{
	m_y = y;
}

void myPoint::SetZ(double z)
{
	m_z = z;
}

double myPoint::X()const
{
	return m_x;
}

double myPoint::Y()const
{
	return m_y;
}

double myPoint::Z()const
{
	return m_z;
}

myPoint myPoint::add(myPoint& rhs)const
{
	myPoint ret(0.0, 0.0, 0.0);
	ret.SetX(m_x + rhs.X());
	ret.SetY(m_y + rhs.Y());
	ret.SetZ(m_z + rhs.Z());
	return ret;
}

myPoint myPoint::Sub(myPoint& rhs)const
{
	myPoint ret(0.0, 0.0, 0.0);
	ret.SetX(m_x - rhs.X());
	ret.SetY(m_y - rhs.Y());
	ret.SetZ(m_z - rhs.Z());
	return ret;
}

myPoint myPoint::cross(myPoint& rhs)const
{
	myPoint ret(0.0, 0.0, 0.0);
	ret.SetX(m_y * rhs.Z() - m_z * rhs.Y());
	ret.SetY(m_z * rhs.X() - m_x * rhs.Z());
	ret.SetZ(m_x * rhs.Y() - m_y * rhs.X());
	return ret;
}

myPoint myPoint::Normalize() const
{
	myPoint ret(0.0, 0.0, 0.0);
	ret.SetX(m_x / Length());
	ret.SetY(m_y / Length());
	ret.SetZ(m_z / Length());
	return ret;
}

double myPoint::Length() const
{
	return sqrt(m_x * m_x + m_y * m_y + m_z * m_z);
}

myPoint myPoint::Scale(const double& rhs) const
{
	myPoint ret(0.0, 0.0, 0.0);
	ret.SetX(m_x * rhs);
	ret.SetY(m_y * rhs);
	ret.SetZ(m_z * rhs);
	return ret;
}

double myPoint::Dot(const myPoint& rhs) const
{
	return m_x * rhs.X() + m_y * rhs.Y() + m_z * rhs.Z();
}

myPoint myPoint::Reversal() const
{
	return myPoint(-X(), -Y(), -Z());
}


#include "myMatrix4x4.h"
#include <cmath>
myMatrix4x4::myMatrix4x4()
{
	Identity();
}

void myMatrix4x4::Zero()
{
	for (int i = 0; i < 4; ++i)
	{
		for (int j = 0; j < 4; ++j)
		{
			m_Element[i][j] = 0;
		}
	}
}

void myMatrix4x4::Identity()
{
	for (int i = 0; i < 4; ++i)
	{
		for (int j = 0; j < 4; ++j)
		{
			if (i == j)
			{
				m_Element[i][j] = 1.0;
			}
			else
			{
				m_Element[i][j] = 0.0;
			}
		}
	}
}

void myMatrix4x4::SetElement(int i, int j, double value)
{
	m_Element[i][j] = value;
}

void myMatrix4x4::Move(const myPoint& vec)
{
	Identity();
	SetElement(0, 3, vec.X());
	SetElement(1, 3, vec.Y());
	SetElement(2, 3, vec.Z());
}
//绕vec向量旋转radian度的矩阵
void myMatrix4x4::Rotate(const myPoint& vec, const double& radian)
{
	Identity();
	float dx = vec.X() / vec.Length();
	float dY = vec.Y() / vec.Length();
	float dZ = vec.Z() / vec.Length();

	SetElement(0, 0, cos(radian) + (dx * dx) * (1 - cos(radian)));
	SetElement(1, 0, dx * dY * (1 - cos(radian)) - dZ * sin(radian));
	SetElement(2, 0, dx * dZ * (1 - cos(radian)) + dY * sin(radian));
	SetElement(0, 1, dx * dY * (1 - cos(radian)) + dZ * sin(radian));
	SetElement(1, 1, cos(radian) + dY * dY * (1 - cos(radian)));
	SetElement(2, 1, dY * dZ * (1 - cos(radian)) - dx * sin(radian));
	SetElement(0, 2, dx * dZ * (1 - cos(radian)) - dY * sin(radian));
	SetElement(1, 2, dZ * dY * (1 - cos(radian)) + dx * sin(radian));
	SetElement(2, 2, cos(radian) + dZ * dZ * (1 - cos(radian)));
}
//点按this矩阵运算返回运算结果
myPoint myMatrix4x4::MultiplyPoint(const myPoint& pt)const
{
	myPoint retPt;
	double v0 = pt.X();
	double v1 = pt.Y();
	double v2 = pt.Z();
	double v3 = 1;
	double ret[4];
	for (int i=0;i<4;i++)
	{
		ret[i] = m_Element[i][0] * v0 + m_Element[i][1] * v1 + m_Element[i][2] * v2 + m_Element[i][3] * v3;
	}
	retPt.SetX(ret[0]);
	retPt.SetY(ret[1]);
	retPt.SetZ(ret[2]);
	return retPt;
}
相关推荐
Jmyd012317 分钟前
手持激光三维扫描仪技术解析:三角测量数据链路、材质适配矩阵与点云处理流程
数码相机·矩阵·材质·三维数字化
HIT_Weston8 小时前
14、【数学】【线性代数】one-hot 与基向量:分类目标为什么能当概率分布
线性代数·数学
微三云 - 廖会灵 (私域系统开发)7 天前
企业大模型应用工程化思考:跳出 Demo 陷阱,构建「业务‑资产‑Agent」三层落地架构
人工智能·矩阵·重构
tryxr7 天前
矩阵的几种基础变换
java·数据结构·算法·矩阵
老鱼说AI7 天前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模
俗人六哥AI企业获客盈利系统8 天前
知识库才是AI落地的分水岭
人工智能·线性代数·矩阵·自动化
船厂电气自动化ai大模型8 天前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
微三云 - 廖会灵 (私域系统开发)9 天前
私域电商多端商城系统架构实践:小程序 / APP / H5 一套后端如何落地
矩阵·重构·零售
微三云 - 廖会灵 (私域系统开发)10 天前
多端商城统一账号体系设计实践:小程序 / APP / H5 登录打通与账号合并
矩阵·重构·自动化·零售
xfilm埃利测量10 天前
四探针法测电阻:原理讲透 + 常见问题一次说清
测试工具·平面·四探针·薄膜电阻测量