旋转矩阵C++

这篇博客介绍了如何使用C++将给定的N×N矩阵原地旋转90度。提供了两种解法,包括暴力法和翻转法。暴力法通过观察矩阵变化找出规律,而翻转法则利用矩阵的上下翻转和主对角线翻转来实现旋转。
摘要由CSDN通过智能技术生成

旋转矩阵C++

题目介绍

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例 1:

给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],

原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:

给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],

原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/clpgd/
来源:力扣(LeetCode)

解法一 暴力法

本人太拉了,只能想出这种暴力解题法,观察矩阵变化,可以看出变换前的列与变换后的行是相等的,然后再继续观察每一列的数,可以找到对应的规律,新矩阵【j】【n-i-1】=原矩阵【i】【j】


                
欧拉角分解旋转矩阵是将旋转矩阵分解为三个绕不同轴向旋转的角度的过程。在C++中,可以使用以下代码实现: ```c++ #include <iostream> #include <cmath> using namespace std; // 定义旋转矩阵 typedef double Matrix[3][3]; // 定义欧拉角 typedef double Euler[3]; // 将欧拉角转换为旋转矩阵 void euler2matrix(const Euler &euler, Matrix &matrix) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); matrix[0][0] = cz * cy; matrix[0][1] = sz * cy; matrix[0][2] = -sy; matrix[1][0] = cz * sy * sx - sz * cx; matrix[1][1] = sz * sy * sx + cz * cx; matrix[1][2] = cy * sx; matrix[2][0] = cz * sy * cx + sz * sx; matrix[2][1] = sz * sy * cx - cz * sx; matrix[2][2] = cy * cx; } // 将旋转矩阵分解为欧拉角 void matrix2euler(const Matrix &matrix, Euler &euler) { euler[1] = asin(-matrix[0][2]); double cy = cos(euler[1]); if (fabs(cy) > 1e-6) { euler[0] = atan2(matrix[1][2] / cy, matrix[2][2] / cy); euler[2] = atan2(matrix[0][1] / cy, matrix[0][0] / cy); } else { euler[0] = atan2(-matrix[2][1], matrix[1][1]); euler[2] = 0; } } // 输出欧拉角 void print_euler(const Euler &euler) { cout << "Yaw: " << euler[0] << " Pitch: " << euler[1] << " Roll: " << euler[2] << endl; } int main() { Matrix matrix; Euler euler = {0, 0, 0}; // 将欧拉角转换为旋转矩阵 euler2matrix(euler, matrix); // 输出旋转矩阵 cout << "Rotation matrix:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << matrix[i][j] << " "; } cout << endl; } // 将旋转矩阵分解为欧拉角 matrix2euler(matrix, euler); // 输出欧拉角 cout << "Euler angles:" << endl; print_euler(euler); return 0; } ``` 此代码将欧拉角和旋转矩阵定义为结构体,并提供了将欧拉角转换为旋转矩阵和将旋转矩阵分解为欧拉角的函数。主函数中将欧拉角初始化为0,并输出生成的旋转矩阵和分解出的欧拉角。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值