围绕另一个点旋转一个点会产生意想不到的结果

问题描述

我试图围绕另一个点旋转一个点,但结果与我预期的不同。我想将点 (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}]