为了一个我不想深入讨论的背景,我需要两个本质上是相互倒数的函数。
`angle_to()` 函数应返回钟表指针从0°开始旋转到连接 `p1` 和 `p2` 的直线所需的度数(即 `p1` 是旋转中心),其中 `p1` 和 `p2` 均为像素坐标。
`point_pos()` 函数应返回长度为 `amplitude` 的钟表指针旋转 `angle` 后的像素坐标。
对于上述两个函数,正向 x 轴 = 0° = 3 点钟,并且参数 `rotation` 应在计算之前将该轴移动,在顺时针或逆时针方向上移动;然后该计算应沿着此已调整的参考系同向移动。
下面是我的进展; 失败原因如下:
当 `clockwise=False` 时,它返回顺时针条件的正确答案;当`clockwise=True` 时,`angle_between()` 返回正确答案但有四舍五入误差,而 `point_pos()` 完全给了我错误的答案。
我还附加了一个我在Illustrator中设计的视觉解释,以表达我无法解决这个问题并向互联网道歉,同时也希望说明我正在寻找的内容。
`angle_to()` 函数应返回钟表指针从0°开始旋转到连接 `p1` 和 `p2` 的直线所需的度数(即 `p1` 是旋转中心),其中 `p1` 和 `p2` 均为像素坐标。
`point_pos()` 函数应返回长度为 `amplitude` 的钟表指针旋转 `angle` 后的像素坐标。
对于上述两个函数,正向 x 轴 = 0° = 3 点钟,并且参数 `rotation` 应在计算之前将该轴移动,在顺时针或逆时针方向上移动;然后该计算应沿着此已调整的参考系同向移动。
下面是我的进展; 失败原因如下:
当 `clockwise=False` 时,它返回顺时针条件的正确答案;当`clockwise=True` 时,`angle_between()` 返回正确答案但有四舍五入误差,而 `point_pos()` 完全给了我错误的答案。
我还附加了一个我在Illustrator中设计的视觉解释,以表达我无法解决这个问题并向互联网道歉,同时也希望说明我正在寻找的内容。
from math import sin, cos, radians, pi, atan2, degrees
def angle_to(p1, p2, rotation=0, clockwise=False):
if abs(rotation) > 360:
rotation %= 360
p2 = list(p2)
p2[0] = p2[0] - p1[0]
p2[1] = p2[1] - p1[1]
angle = degrees(atan2(p2[1], p2[0]))
if clockwise:
angle -= rotation
return angle if angle > 0 else angle + 360
else:
angle = (360 - angle if angle > 0 else -1 * angle) - rotation
return angle if angle > 0 else angle + 360
def point_pos(origin, amplitude, angle, rotation=0, clockwise=False):
if abs(rotation) > 360:
rotation %= 360
if clockwise:
rotation *= -1
if clockwise:
angle -= rotation
angle = angle if angle > 0 else angle + 360
else:
angle = (360 - angle if angle > 0 else -1 * angle) - rotation
angle = angle if angle > 0 else angle + 360
theta_rad = radians(angle)
return int(origin[0] + amplitude * cos(theta_rad)), int(origin[1] + amplitude * sin(theta_rad))
编辑#2: 根据要求,这里提供一些失败的输出:
angle_to()
在顺时针和逆时针方向上翻转(当我试图修复它时,最终得到错误答案),在顺时针方向上,旋转和计算方向不同。
>>> print angle_to((100,100), (25,25)) # should be 225
135.0
>>> print angle_to((100,100), (25,25), 45) # should be 180
90.0
>>> print angle_to((100,100), (25,25), clockwise=True) # should be 135
225.0
>>> print angle_to((100,100), (25,25), 45, clockwise=True) # should be 90
180.0
point_pos()
在逆时针方向上是错误的
# dunno what these should be (i'm bad at trig) but when I visually place the
# given p1 and the output p2 on screen it's obvious that they're wrong
>>> print point_pos((100,100), 75, 225)
(46, 153)
>>> print point_pos((100,100), 75, 225, 45)
(100, 175)
# these are basically correct, rounding-errors notwithstanding
>>> print point_pos((100,100), 75, 225, clockwise=True)
(46, 46)
>>> print point_pos((100,100), 75, 225, 45, clockwise=True)
(99, 25)
angle_to()
应该报告一个时钟指针从 p1 到 p2 需要旋转多少度(不是弧度),可以是顺时针或逆时针方向。我意识到关于 y 轴,每个函数都有处理的线条(基本上将值在 0 和 -180° 之间转换为 180 + abs(angle))。但是,在这个混乱中,我仍然存在一些小的逻辑问题,阻止了期望的输出。如果有帮助,我在描述中也进行了澄清。 - Jonline