gpt4 book ai didi

python - 使用 python 计算径向角,顺时针/逆时针方向,给定像素坐标(然后反之亦然)

转载 作者:太空狗 更新时间:2023-10-30 00:02:01 32 4
gpt4 key购买 nike

对于我不会涉及的上下文,我需要两个本质上互为倒数的函数。

angle_to() 应该返回钟针从 0° 到连接 p1p2 的线所必须转动的度数>(即 p1 是旋转中心),其中 p1p2 都是像素坐标

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))

angle_to() point_pos()

编辑 #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 = -angle

其次,要将角度限制在 [0, 360) 范围内,您只需使用 angle % 360。无论角度是从负数还是正数、整数还是 float 开始,这都有效。

def angle_to(p1, p2, rotation=0, clockwise=False):
angle = degrees(atan2(p2[1] - p1[1], p2[0] - p1[0])) - rotation
if not clockwise:
angle = -angle
return angle % 360

关于python - 使用 python 计算径向角,顺时针/逆时针方向,给定像素坐标(然后反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37259366/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com