如果你有一个点(在2D中),你如何在python中围绕另一个点(原点)逐步旋转那个点?
例如,您可以将第一个点绕原点倾斜10度。
基本上,你有一个点,PointA和原点,它绕着它旋转。代码可能如下所示:
PointA=(200,300)
origin=(100,100)
NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees
发布于 2015-12-20 03:18:11
以下rotate
函数将点point
在笛卡尔平面中绕origin
旋转角度angle
(逆时针,以弧度为单位),并遵循通常的轴约定:x从左向右递增,y垂直向上递增。所有点都表示为(x_coord, y_coord)
形式的长度为2的元组。
import math
def rotate(origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given origin.
The angle should be given in radians.
"""
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
如果以度为单位指定角度,则可以先使用math.radians
将其转换为弧度。对于顺时针旋转,取反角度。
示例:将点(3, 4)
绕(2, 2)
的原点逆时针旋转10度角:
>>> point = (3, 4)
>>> origin = (2, 2)
>>> rotate(origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)
注意,在rotate
函数中有一些明显的重复计算:math.cos(angle)
和math.sin(angle)
分别计算两次,px - ox
和py - oy
也是如此。如果有必要的话,我把它留给你来考虑。
发布于 2019-11-10 00:44:01
将一个点绕另一个点旋转一定程度的选项是使用numpy
而不是math
。这允许很容易地推广该函数以接受任意数量的点作为输入,例如,这在旋转多边形时可能是有用的。
import numpy as np
def rotate(p, origin=(0, 0), degrees=0):
angle = np.deg2rad(degrees)
R = np.array([[np.cos(angle), -np.sin(angle)],
[np.sin(angle), np.cos(angle)]])
o = np.atleast_2d(origin)
p = np.atleast_2d(p)
return np.squeeze((R @ (p.T-o.T) + o.T).T)
points=[(200, 300), (100, 300)]
origin=(100,100)
new_points = rotate(points, origin=origin, degrees=10)
print(new_points)
发布于 2018-07-02 07:33:45
import math
def rotate(x,y,xo,yo,theta): #rotate x,y around xo,yo by theta (rad)
xr=math.cos(theta)*(x-xo)-math.sin(theta)*(y-yo) + xo
yr=math.sin(theta)*(x-xo)+math.cos(theta)*(y-yo) + yo
return [xr,yr]
https://stackoverflow.com/questions/34372480
复制相似问题