Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to rotate a vertex around a certain point?

Imagine you have two points in 2d space and you need to rotate one of these points by X degrees with the other point acting as a center.

float distX = Math.abs( centerX -point2X ); float distY = Math.abs( centerY -point2Y );  float dist = FloatMath.sqrt( distX*distX + distY*distY ); 

So far I just got to finding the distance between the two points... any ideas where should I go from that?

enter image description here

like image 670
Roger Travis Avatar asked Aug 28 '12 14:08

Roger Travis


2 Answers

The easiest approach is to compose three transformations:

  1. A translation that brings point 1 to the origin
  2. Rotation around the origin by the required angle
  3. A translation that brings point 1 back to its original position

When you work this all out, you end up with the following transformation (where x is the desired angle of rotation in radians):

newX = centerX + (point2x-centerX)*Math.cos(x) - (point2y-centerY)*Math.sin(x);  newY = centerY + (point2x-centerX)*Math.sin(x) + (point2y-centerY)*Math.cos(x); 

Note that this makes the assumption that the angle x is negative for clockwise rotation (the so-called standard or right-hand orientation for the coordinate system). If that's not the case, then you would need to reverse the sign on the terms involving sin(x).

like image 191
Ted Hopp Avatar answered Oct 14 '22 15:10

Ted Hopp


You need a 2-d rotation matrix http://en.wikipedia.org/wiki/Rotation_matrix

Your new point will be

 newX = centerX + ( cosX * (point2X-centerX) + sinX * (point2Y -centerY))  newY = centerY + ( -sinX * (point2X-centerX) + cosX * (point2Y -centerY)) 

because you are rotating clockwise rather than anticlockwise

like image 31
mathematician1975 Avatar answered Oct 14 '22 14:10

mathematician1975