Function to rotate 2d objects?

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

As far as I understand, this would be possible only by calculating the distance of the point from symmetric points and the axis, and therefore it would always change and, therefore, would be impossible, except for two-dimensional structures consisting of standard shapes (triangles, rectangles, squares, etc.). d.)

Good examples will be appreciated.

+6
source share
2 answers

First, we need a function to rotate a point around the beginning.

When we rotate the point (x, y) around the beginning in 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 move it so that 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 each 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 

Output Example:

 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)] 
+17
source

You can rotate 2-dimensional arrays of points around an arbitrary point on the plane, first moving all the points so that the turning point becomes the beginning, applying the standard rotation formula to each x and y coordinate point, and then not transferring it to the opposite amount made initially.

In computer graphics, this is often done using transformation matrices .

The same concept can also be easily applied to a point in 3-D.

Edit:

See my answer to the question Rotating a line around a center point defined by two vertices for a developed example using them.

+3
source

Source: https://habr.com/ru/post/958216/


All Articles