我的代码中遇到了一个小问题。我有一个坐标和天使的数据框。 我想以某个角度(比如 45 度)从某个 xy 坐标到图像边缘画一条线。
如何使用 PIL 做到这一点?循环 x2 = x + length*cos(angle) 看起来不是一个好的解决方案(但我在这里可能是错的)。
提前致谢。
感谢您发布您的解决方案。我已经找到一个好东西了
import math
def get_coords(x, y, angle, imwidth, imheight):
x1_length = (x-imwidth) / math.cos(angle)
y1_length = (y-imheight) / math.sin(angle)
length = max(abs(x1_length), abs(y1_length))
endx1 = x + length * math.cos(math.radians(angle))
endy1 = y + length * math.sin(math.radians(angle))
x2_length = (x-imwidth) / math.cos(angle+180)
y2_length = (y-imheight) / math.sin(angle+180)
length = max(abs(x2_length), abs(y2_length))
endx2 = x + length * math.cos(math.radians(angle+180))
endy2 = y + length * math.sin(math.radians(angle+180))
return endx1, endy1, endx2, endy2
然后我在 (endx1, endy1) 和 (endx2, endy2) 之间画一条线。
如果您有更好的解决方案,我将非常有兴趣看到。
Abdulaziz 的代码有问题,例如当角度为 0 或 180 度时,由于三角函数在这些角度上的表现。这是更新版本:
def get_line_endpoints(x, y, angle, imwidth, imheight):
if angle == 0:
return (imwidth, y), (0, y)
elif angle == 180:
return (0, y), (imwidth, y)
elif angle == 90:
return (x, 0), (x, imheight)
elif angle == 270:
return (x, imheight), (x, 0)
x1_length = (x-imwidth) / math.cos(angle)
y1_length = (y-imheight) / math.sin(angle)
length = max(abs(x1_length), abs(y1_length))
endx1 = x + length * math.cos(math.radians(angle))
endy1 = y + length * math.sin(math.radians(angle))
x2_length = (x-imwidth) / math.cos(angle+180)
y2_length = (y-imheight) / math.sin(angle+180)
length = max(abs(x2_length), abs(y2_length))
endx2 = x + length * math.cos(math.radians(angle+180))
endy2 = y + length * math.sin(math.radians(angle+180))
return (int(endx1), int(endy1)), (int(endx2), int(endy2))