本文概述
- C
- CPP
例子:
Input : {(100, 100), (150, 200), (200, 200), (200, 150)} is to be rotated about
(0, 0) by 90 degrees
Output : (-100, 100), (-200, 150), (-200, 200), (-150, 200)
文章图片
Input : {(100, 100), (100, 200), (200, 200)}
is to be rotated about (50, -50) by
-45 degrees
Output : (191.421, 20.7107), (262.132, 91.4214), (332.843, 20.7107)
文章图片
为了旋转对象, 我们需要分别旋转图形的每个顶点。
将点P(x, y)绕原点旋转角度A, 我们得到一个点P'(x', y')。 x’和y’的值可以如下计算:
文章图片
【如何实现图像2D转换(|物体旋转)】我们知道,
x = rcosB, y = rsinB
x’ = rcos(A+B) = r(cosAcosB – sinAsinB) = rcosBcosA – rsinBsinA = xcosA – ysinA
y’ = rsin(A+B) = r(sinAcosB + cosAsinB) = rcosBsinA + rsinBcosA = xsinA + ycosA
旋转矩阵方程:-
C
// C program to rotate an object by
// a given angle about a given point
#include <
math.h>
#include <
stdio.h>
// Using macros to convert degree to radian
// and call sin() and cos() as these functions
// take input in radians
#define SIN(x) sin(x * 3.141592653589 / 180)
#define COS(x) cos(x * 3.141592653589 / 180)
// To rotate an object
void rotate( float a[][2], int n, int x_pivot, int y_pivot, int angle)
{
int i = 0;
while (i <
n) {
// Shifting the pivot point to the origin
// and the given points accordingly
int x_shifted = a[i][0] - x_pivot;
int y_shifted = a[i][1] - y_pivot;
// Calculating the rotated point co-ordinates
// and shifting it back
a[i][0] = x_pivot
+ (x_shifted * COS(angle)
- y_shifted * SIN(angle));
a[i][1] = y_pivot
+ (x_shifted * SIN(angle)
+ y_shifted * COS(angle));
printf ( "(%f, %f) " , a[i][0], a[i][1]);
i++;
}
}
// Driver Code
int main()
{
// 1st Example
// The following figure is to be
// rotated about (0, 0) by 90 degrees
int size1 = 4;
// No. of vertices
// Vertex co-ordinates must be in order
float points_list1[][2] = { { 100, 100 }, { 150, 200 }, { 200, 200 }, { 200, 150 } };
rotate(points_list1, size1, 0, 0, 90);
// 2nd Example
// The following figure is to be
// rotated about (50, -50) by -45 degrees
/*int size2 = 3;
//No. of vertices
float points_list2[][2] = {{100, 100}, {100, 200}, {200, 200}};
rotate(points_list2, size2, 50, -50, -45);
*/
return 0;
}
CPP
// C++ program to rotate an object by
// a given angle about a given point
#include <
iostream>
#include <
math.h>
using namespace std;
// Using macros to convert degree to radian
// and call sin() and cos() as these functions
// take input in radians
#define SIN(x) sin(x * 3.141592653589 / 180)
#define COS(x) cos(x * 3.141592653589 / 180)
// To rotate an object given as order set of points in a[]
// (x_pivot, y_pivot)
void rotate( float a[][2], int n, int x_pivot, int y_pivot, int angle)
{
int i = 0;
while (i <
n) {
// Shifting the pivot point to the origin
// and the given points accordingly
int x_shifted = a[i][0] - x_pivot;
int y_shifted = a[i][1] - y_pivot;
// Calculating the rotated point co-ordinates
// and shifting it back
a[i][0] = x_pivot
+ (x_shifted * COS(angle)
- y_shifted * SIN(angle));
a[i][1] = y_pivot
+ (x_shifted * SIN(angle)
+ y_shifted * COS(angle));
cout <
<
"(" <
<
a[i][0] <
<
", " <
<
a[i][1] <
<
") " ;
i++;
}
}
// Driver Code
int main()
{
// 1st Example
// The following figure is to be
// rotated about (0, 0) by 90 degrees
int size1 = 4;
// No. of vertices
// Vertex co-ordinates must be in order
float points_list1[][2] = { { 100, 100 }, { 150, 200 }, { 200, 200 }, { 200, 150 } };
rotate(points_list1, size1, 0, 0, 90);
// 2nd Example
// The following figure is to be
// rotated about (50, -50) by -45 degrees
/*int size2 = 3;
//No. of vertices
float points_list2[][2] = {{100, 100}, {100, 200}, {200, 200}};
rotate(points_list2, size2, 50, -50, -45);
*/
return 0;
}
输出如下:
(-100, 100), (-200, 150), (-200, 200), (-150, 200)
参考文献:旋转矩阵
推荐阅读
- 算法设计(如何解决2-可满足性(2-SAT)问题())
- 计算机图形学中的2D转换算法实现|S1(对象缩放)
- 2D和2.5D内存组织是什么(有什么区别?)
- 算法题(如何实现1和2的二进制补码())
- 计算将N表示为1,3和4的和的方法|算法题
- 算法题(如何连接树中相同层级的节点())
- 算法题(如何实现求和树())
- 如何解决0-1背包问题(| DP-10(动态规划))
- C/C++棘手程序集锦和详细介绍