【问题标题】:Rotating a Point Around Another Point Gives Unexpected Result围绕另一个点旋转一个点会产生意想不到的结果
【发布时间】:2021-01-22 04:20:39
【问题描述】:

我正在尝试围绕另一个点旋转一个点,但结果与我的预期不同。我想将点 (0, 1) 和 (-1, 0) 围绕原点 (0, 0) 旋转 90 度。下面的代码似乎与从 website 计算的结果一致,但与我认为的结果相反。如果 (0, 1) 和 (-1, 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

【问题讨论】:

  • 你的 y 轴是向上还是向下?
  • 另外,复数可能比三角函数更容易使用。 Python 内置了这些。
  • 你的公式在temp_y这一行有错,应该是- sin_angle*(vert....),检查公式
  • @MohilPatel 我仔细检查了公式,看起来 temp_x 行与您建议的更正不正确。谢谢!编辑:请写下您的评论作为答案,以便我可以将其选为已解决,谢谢。

标签: python geometry trigonometry


【解决方案1】:

公式中的修正

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}]

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多