Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function for rotating 2d objects?

Is it possible to write a function in python that could rotate any 2d structure with the arguments being only the coordinates (x,y) of the points in the structure? Additional arguments would be included for axis, speed and direction.

To my understanding it would only be possible by calculating point distance from symmetrical points and the axis and therefore it would always vary and is thus impossible except for 2d structures made up of standard shapes (triangles, rectangles, squares etc)

Good examples would be appreciated.

like image 738
CodeHard_or_HardCode Avatar asked Nov 16 '13 20:11

CodeHard_or_HardCode


People also ask

What is the function of rotation?

The rotation function is the eigenfunction describing such a motion of the molecule. Figure C.I. Relation between the fixed x, y, z axes and the rotating £, TJ, f axes. of the state that includes both the rotation of the molecular axis and the rotation of the electrons in the molecule.

What is rotation 2d transformation?

2D Rotation is a process of rotating an object with respect to an angle in a two dimensional plane. Consider a point object O has to be rotated from one angle to another in a 2D plane. Let- • Initial coordinates of the object O = (Xold, Yold)


1 Answers

First, we need a function to rotate a point around origin.

When we rotate a point (x,y) around origin by theta degrees, we get the coordinates:

(x*cos(theta)-y*sin(theta), x*sin(theta)+y*cos(theta))

If we want to rotate it around a point other than the origin, we just need to shift it so the center point becomes the origin. Now, we can write the following function:

from math import sin, cos, radians

def rotate_point(point, angle, center_point=(0, 0)):
    """Rotates a point around center_point(origin by default)
    Angle is in degrees.
    Rotation is counter-clockwise
    """
    angle_rad = radians(angle % 360)
    # Shift the point so that center_point becomes the origin
    new_point = (point[0] - center_point[0], point[1] - center_point[1])
    new_point = (new_point[0] * cos(angle_rad) - new_point[1] * sin(angle_rad),
                 new_point[0] * sin(angle_rad) + new_point[1] * cos(angle_rad))
    # Reverse the shifting we have done
    new_point = (new_point[0] + center_point[0], new_point[1] + center_point[1])
    return new_point

Some outputs:

print(rotate_point((1, 1), 90, (2, 1)))
# This prints (2.0, 0.0)
print(rotate_point((1, 1), -90, (2, 1)))
# This prints (2.0, 2.0)
print(rotate_point((2, 2), 45, (1, 1)))
# This prints (1.0, 2.4142) which is equal to (1,1+sqrt(2))

Now, we just need to rotate every corner of the polygon using our previous function:

def rotate_polygon(polygon, angle, center_point=(0, 0)):
    """Rotates the given polygon which consists of corners represented as (x,y)
    around center_point (origin by default)
    Rotation is counter-clockwise
    Angle is in degrees
    """
    rotated_polygon = []
    for corner in polygon:
        rotated_corner = rotate_point(corner, angle, center_point)
        rotated_polygon.append(rotated_corner)
    return rotated_polygon

Example output:

my_polygon = [(0, 0), (1, 0), (0, 1)]
print(rotate_polygon(my_polygon, 90))
# This gives [(0.0, 0.0), (0.0, 1.0), (-1.0, 0.0)]
like image 160
Sweeney Todd Avatar answered Sep 30 '22 18:09

Sweeney Todd