问题描述
我试图围绕另一个点旋转一个点,但结果与我预期的不同。我想将点 (0,1) 和 (-1,0) 围绕原点 (0,0) 旋转 90 度。下面的代码似乎与从这个 website 计算的结果一致,但与我认为的结果相反。如果 (0,0) 围绕原点顺时针旋转 90 度,我预计新点将是 (1,0) 和 (0,1)。第一点的结果是正常的,但第二点的结果似乎是逆时针的: [{'x':1.0,'y':6.123233995736766e-17},{'x':-6.123233995736766e-17,'y':-1.0}]。
我对点应该如何旋转的直觉有什么问题吗?代码见下:
center = {'x': 0,'y': 0}
vertices = [{'x': 0,'y': 1},{'x': -1,'y': 0}]
angle = 90
def rotate(center,vertices:list,angle):
# Something appears to be broken with the rotate function
radians = math.radians(angle)
cos_angle = math.cos(radians)
sin_angle = math.sin(radians)
for vertice in vertices:
temp_x = (cos_angle * (vertice['x'] - center['x'])) + (sin_angle * (vertice['y'] - center['y'])) + center['x']
temp_y = (cos_angle * (vertice['y'] - center['y'])) + (sin_angle * (vertice['x'] - center['x'])) + center['y']
vertice['x'],vertice['y'] = temp_x,temp_y
return vertices
解决方法
公式中的修正
import math
def rotate(center,vertices:list,angle):
radians = math.radians(angle)
cos_angle = math.cos(radians)
sin_angle = math.sin(radians)
for vertice in vertices:
temp_x = (cos_angle * (vertice['x'] - center['x'])) + (sin_angle * (vertice['y'] - center['y'])) + center['x']
temp_y = (cos_angle * (vertice['y'] - center['y'])) + -1*(sin_angle * (vertice['x'] - center['x'])) + center['y']
vertice['x'],vertice['y'] = temp_x,temp_y
return vertices
center = {'x': 0,'y': 0}
vertices = [{'x': 5,'y': 4}]
angle = 30
print(rotate(center,vertices,angle))
输出
>>> [{'x': 1.0,'y': 6.123233995736766e-17},{'x': -6.123233995736766e-17,'y': 1.0}]