We have to rotate an object by a given angle about a given pivot point and print the new co-ordinates.
Examples:
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)

In order to rotate an object we need to rotate each vertex of the figure individually.
On rotating a point P(x, y) by an angle A about the origin we get a point P'(x', y'). The values of x' and y' can be calculated as follows:-

We know that,
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
Rotational Matrix Equation:-
// 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;
}
// Java program to rotate an object by
// a given angle about a given point
public class rotation {
static void rotate(double a[][], 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 = (int)a[i][0] - x_pivot;
int y_shifted = (int)a[i][1] - y_pivot;
// Calculating the rotated point co-ordinates
// and shifting it back
double x = Math.toRadians(angle);
a[i][0] = x_pivot
+ (x_shifted * Math.cos(x)
- y_shifted * Math.sin(x));
a[i][1] = y_pivot
+ (x_shifted * Math.sin(x)
+ y_shifted * Math.cos(x));
System.out.printf("(%f, %f) ", a[i][0],
a[i][1]);
i++;
}
}
// Driver Code
public static void main(String[] args)
{
// 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
double points_list1[][] = { { 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
double points_list2[][2] = {{100, 100}, {100, 200},
{200, 200}};
rotate(points_list2, size2, 50, -50, -45);*/
}
}
// This code is contributed by karandeep1234
# Python3 program to rotate an object by
# a given angle about a given point
import math
SIN=lambda x: int(math.sin(x * 3.141592653589 / 180))
COS=lambda x: int(math.cos(x * 3.141592653589 / 180))
# To rotate an object
def rotate(a, n, x_pivot, y_pivot, angle):
i = 0
while (i < n) :
# Shifting the pivot point to the origin
# and the given points accordingly
x_shifted = a[i][0] - x_pivot
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))
print("({}, {}) ".format(a[i][0], a[i][1]),end=" ")
i+=1
# Driver Code
if __name__=='__main__':
# 1st Example
# The following figure is to be
# rotated about (0, 0) by 90 degrees
size1 = 4 # No. of vertices
# Vertex co-ordinates must be in order
points_list1 = [[ 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
# size2 = 3#No. of vertices
# points_list2 = [[100, 100],
# [100, 200],
# [200, 200]]
# rotate(points_list2, size2, 50, -50, -45)
// Javascript program to rotate an object by
// a given angle about a given point
const SIN = (x) => Math.sin(x * Math.PI / 180);
const COS = (x) => Math.cos(x * Math.PI / 180);
function rotate(a, n, x_pivot, y_pivot, angle) {
let i = 0;
while (i < n) {
// Shifting the pivot point to the origin
// and the given points accordingly
const x_shifted = a[i][0] - x_pivot;
const 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));
console.log(`(${a[i][0]}, ${a[i][1]}) `);
i++;
}
}
// Driver Code
// 1st Example
// The following figure is to be
// rotated about (0, 0) by 90 degrees
const size1 = 4; // No. of vertices
// Vertex co-ordinates must be in order
const points_list1 = [[ 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
// const size2 = 3; // No. of vertices
// const points_list2 = [[100, 100],
// [100, 200],
// [200, 200]];
// rotate(points_list2, size2, 50, -50, -45);
// C# Program to rotate an object by
// a given angle about a given point
using System;
class rotation
{
// Function to rotate the given points
// about the pivot point by angle
static void rotate(double[,] a, 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 = (int)a[i, 0] - x_pivot;
int y_shifted = (int)a[i, 1] - y_pivot;
// Calculating the rotated point co-ordinates
// and shifting it back
double x = Math.PI * angle / 180.0;
a[i, 0] = x_pivot + (x_shifted *
Math.Cos(x) - y_shifted *
Math.Sin(x));
a[i, 1] = y_pivot + (x_shifted *
Math.Sin(x) + y_shifted *
Math.Cos(x));
Console.Write("({0}, {1}) ",
a[i, 0], a[i, 1]);
i++;
}
}
// Driver Code
public static void Main(String[] args)
{
// 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
double[,] points_list1 = { { 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
double[,] points_list2 = { { 100, 100 },
{ 100, 200 },
{ 200, 200 } };
rotate(points_list2, size2, 50, -50, -45);*/
}
}
Output:
(-100, 100), (-200, 150), (-200, 200), (-150, 200)
Time Complexity: O(N)
Auxiliary Space: O(1)
References: Rotation matrix