旋转矩阵的理解和使用

旋转矩阵的表现形式

点A以列表示且右乘旋转矩阵


原坐标轴改变至新坐标轴

旋转矩阵M={新x轴x,新y轴x,

                        新x轴y,新y轴y}


绕原坐标轴原点旋转角度a

旋转矩阵M={ cos(a), -sin(a),

                        sin(a),   cos(a) }


以上两者意思一样,不难证明


绕特定点旋转

不论绕哪点旋转,物体旋转相同角度后的形状均相同。

要绕特定点旋转,只需要在旋转后将同样进行旋转变化后的旋转中心移动回原本的旋转中心即可。

#pragma once

#include"CPoint.h"
#include<cmath>

#define PI 3.1415926

Point *Rotate(const Point *pts,int numPts, Point center,
				float angle, float t[2] , float zoom = 1.0F);//顺时针旋转 平移 放大
float ( *GetM(float angle, float zoom = 1.0F) )[2];//根据旋转角度获取旋转矩阵

Point *Rotate(const Point *pts,int numPts, Point center,
	 float angle, float t[2], float zoom )
{
	//绕中心点顺时针旋转angle度放大zoom倍
	//同时平移t
	Point *new_pts = new Point[numPts];
	float (*m)[2] = GetM(angle, zoom);//获取旋转矩阵

	//计算中心点移动
	//把t的计算放到c_move中,减少点循环中t的加次数
	float c_new_x  = center.x * m[0][0] + center.y * m[0][1];
	float c_new_y  = center.x * m[1][0] + center.y * m[1][1];
	float c_x_move = center.x - c_new_x + t[0];
	float c_y_move = center.y - c_new_y + t[1];

	for(int i = 0; i < numPts; i++){//对点进行旋转和平移
		new_pts[i].x = pts[i].x * m[0][0] + pts[i].y * m[0][1] + c_x_move;
		new_pts[i].y = pts[i].x * m[1][0] + pts[i].y * m[1][1] + c_y_move;
	}

	return new_pts;
}

float ( *GetM(float angle, float zoom ) )[2] {
	float m[2][2];
	float radian = angle/180 * PI;

	m[0][0] = cos(radian) * zoom;
	m[0][1] = 0 - sin(radian) * zoom;
	m[1][0] = sin(radian) * zoom;
	m[1][1] = cos(radian) * zoom;

	return m;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值