如果你有一个点(在2d),你怎么能在python的另一个点(原点)周围旋转那个点?
例如,您可以将原点周围的第一个点倾斜10度.
基本上你有一个点PointA和它旋转的原点.代码看起来像这样:
PointA=(200,300) origin=(100,100) NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees
Mark Dickins.. 51
以下rotate
函数以笛卡尔平面周围point
的角度angle
(逆时针,以弧度表示)旋转点origin
,使用通常的轴约定:x从左向右增加,y从垂直向上增加.所有点都表示为表单的长度为2的元组(x_coord, y_coord)
.
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
.如果有必要,我留给你考虑一下.
以下rotate
函数以笛卡尔平面周围point
的角度angle
(逆时针,以弧度表示)旋转点origin
,使用通常的轴约定:x从左向右增加,y从垂直向上增加.所有点都表示为表单的长度为2的元组(x_coord, y_coord)
.
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
.如果有必要,我留给你考虑一下.