- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于我不会涉及的上下文,我需要两个本质上互为倒数的函数。
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 = -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/
如何设置 cytoscape.js 的样式 loop edge ' 以便它绕长(150px 宽)矩形节点的右下角逆时针旋转? 我一直在摆弄样式设置,只是想不通。我能说的最好的我应该能够调整这些样式以获
对于我不会涉及的上下文,我需要两个本质上互为倒数的函数。 angle_to() 应该返回钟针从 0° 到连接 p1 和 p2 的线所必须转动的度数>(即 p1 是旋转中心),其中 p1 和 p2 都是
我是一名优秀的程序员,十分优秀!