使用Python使用角度和中心点在图像上画一条线

问题描述 投票:0回答:2

我的代码中遇到了一个小问题。我有一个坐标和天使的数据框。 我想以某个角度(比如 45 度)从某个 xy 坐标到图像边缘画一条线。

如何使用 PIL 做到这一点?循环 x2 = x + length*cos(angle) 看起来不是一个好的解决方案(但我在这里可能是错的)。

提前致谢。

python opencv python-imaging-library
2个回答
3
投票

感谢您发布您的解决方案。我已经找到一个好东西了

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) 之间画一条线。

如果您有更好的解决方案,我将非常有兴趣看到。


0
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.