三维点坐标绕任意轴旋转后坐标

//old:旋转前点坐标
//theta:旋转角度
//v1V2 :旋转轴
//newPoint: 旋转后点坐标
void LithoMath::GetRotatePointByVector(double old[3], double theta, double v1[3], double v2[3], double newPoint[3])
{
	double a = v1[0];
	double b = v1[1];
	double c = v1[2];

	double vector[3];
	for (int i = 0; i < 3; i++) {
		vector[i] = v2[i] - v1[i];
	}
	normalize(vector);

	double u = vector[0];
	double v = vector[1];
	double w = vector[2];

	double uu = u * u;
	double uv = u * v;
	double uw = u * w;
	double vv = v * v;
	double vw = v * w;
	double ww = w * w;
	double au = a * u;
	double av = a * v;
	double aw = a * w;
	double bu = b * u;
	double bv = b * v;
	double bw = b * w;
	double cu = c * u;
	double cv = c * v;
	double cw = c * w;

	float costheta = cosf(theta);
	float sintheta = sinf(theta);


	double matrix_00 = uu + (vv + ww) * costheta;
	double matrix_01 = uv * (1 - costheta) + w * sintheta;
	double matrix_02 = uw * (1 - costheta) - v * sintheta;
	double matrix_03 = 0;
	

	double matrix_10 = uv * (1 - costheta) - w * sintheta;
	double matrix_11 = vv + (uu + ww) * costheta;
	double matrix_12 = vw * (1 - costheta) + u * sintheta;
	double matrix_13 = 0;
	

	double matrix_20 = uw * (1 - costheta) + v * sintheta;
	double matrix_21 = vw * (1 - costheta) - u * sintheta;
	double matrix_22 = ww + (uu + vv) * costheta;
	double matrix_23 = 0;
	

	double matrix_30 = (a * (vv + ww) - u * (bv + cw)) * (1 - costheta) + (bw - cv) * sintheta;
	double matrix_31 = (b * (uu + ww) - v * (au + cw)) * (1 - costheta) + (cu - aw) * sintheta;
	double matrix_32 = (c * (uu + vv) - w * (au + bv)) * (1 - costheta) + (av - bu) * sintheta;
	double matrix_33 = 1;

	double old_x = old[0];
	double old_y = old[1];
	double old_z = old[2];

	newPoint[0] = old_x * matrix_00 + old_y * matrix_10 + old_z * matrix_20 + matrix_30;
	newPoint[1] = old_x * matrix_01 + old_y * matrix_11 + old_z * matrix_21 + matrix_31;
	newPoint[2] = old_x * matrix_02 + old_y * matrix_12 + old_z * matrix_22 + matrix_32;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在MATLAB中实现三维坐标任意旋转需要使用旋转矩阵来进行计算。以下是一个简单的步骤: 1. 定义旋转旋转角度:首先需要确定旋转向量,这个向量应该是一个单位向量,并且需要确定旋转的角度。 2. 构建旋转矩阵:根据给定的旋转旋转角度,可以用 Rodrigues' rotation formula 计算旋转矩阵。例如,对于向量 axis = [x, y, z] 旋转 angle 度的情况,旋转矩阵可以用下式给出: ``` cos_angle = cosd(angle); sin_angle = sind(angle); rotation_matrix = [cos_angle + axis(1)^2 * (1 - cos_angle), axis(1) * axis(2) * (1 - cos_angle) - axis(3) * sin_angle, axis(1) * axis(3) * (1 - cos_angle) + axis(2) * sin_angle; axis(2) * axis(1) * (1 - cos_angle) + axis(3) * sin_angle, cos_angle + axis(2)^2 * (1 - cos_angle), axis(2) * axis(3) * (1 - cos_angle) - axis(1) * sin_angle; axis(3) * axis(1) * (1 - cos_angle) - axis(2) * sin_angle, axis(3) * axis(2) * (1 - cos_angle) + axis(1) * sin_angle, cos_angle + axis(3)^2 * (1 - cos_angle)]; ``` 3. 对三维坐标进行旋转:利用计算得到的旋转矩阵,可以将每个三维坐标通过矩阵乘法进行旋转。假设三维坐标为 point = [x, y, z],则旋转后的坐标可以通过下式给出: ``` new_point = rotation_matrix * transpose(point); ``` 其中,transpose(point) 将三维坐标 point 转置为列向量。 使用以上步骤,就可以在MATLAB中实现对三维坐标任意旋转了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*Heygirl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值