在不知道第二个坐标的情况下直线得到points/pixels
Get points/pixels in a straight line without knowing second coordinate
我正在尝试构建一个函数,该函数从 特定坐标 在 给定角度 处延伸,并循环遍历那条线,直到它遇到一个黑色像素。
例如,如果角度为 180 度,则很容易实现。在这种情况下,搜索只会向下扩展,在每次迭代中将列坐标加 1。然而,例如角度10度更复杂。因此,我大概需要用数学方法计算像素位置 X 处的下一个像素。
This answer 在类似的问题中对我没有帮助,因为 y 轴上的值没有按预期更改:
import numpy as np
angle = 90*np.pi/180
x = np.arange(0, 10)
y = np.round(np.sin(angle)*x).astype(int)
print([(x, y) for x, y in zip(x, y)])
打印:
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
这是错误的,因为我不希望 y 轴发生变化,给定 90 度角。
The answer to this other question 需要第二个 'end' 坐标,我没有。
最后,我找到了 this question,不幸的是,它没有有效的答案。问题中的代码似乎 return 没有偏移量但浮动,我不确定其含义。当我舍入浮点数时,偏移量是错误的:
import numpy
def pol2cart(rotdist, cwangle):
x = rotdist * numpy.cos(cwangle)
y = rotdist * numpy.sin(cwangle)
return round(x), round(y)
print(pol2cart(1, 180))
打印:(-1.0, -1.0)
而预期输出是 (1.0, 0.0)
然而,上面的答案也会在每次迭代中给出一致的偏移量。这将导致只有三个不同的角度(水平、垂直和 45 度)。这是不是所需要的,因为我最终会得到另一个角度,然后我将其放入函数中。
编辑: 输入示例
下图是图像数据的示例。红点表示可能的起始位置。这个点有一个方向,没有指明。如果红点笔直向下,那么它的方向就是180度。
嵌套字典包含每个像素的坐标(行、列)和颜色值:
{1: {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 255, 8: 255,...
第一个建议的答案可以通过首先检查你的线是更水平还是更垂直,并将该维度用作迭代维度(在你的示例中为 x)来解决。
关于第二个建议的答案:您当然可以计算任意远距离终点并将这些算法应用于您提到的起点和终点已知的直线。然后,您可以遍历它返回的点以检查黑色像素,如果找到 none,甚至可以重新启动算法,直到您到达任意终点。
我认为您可以使用 Bresenham 的 "Line Algorithm" 在维基百科上描述 here。
我知道你说你只有起点没有终点,但是你知道行进的角度(方向),你知道矩形中最长的直线是对角线,所以如果你想象一条比对角线长的线,从您的起点开始并朝正确的方向前进,您可以生成超出矩形边缘的点和终点,并将其用于 Bresenham 算法的另一端。
我正在尝试构建一个函数,该函数从 特定坐标 在 给定角度 处延伸,并循环遍历那条线,直到它遇到一个黑色像素。
例如,如果角度为 180 度,则很容易实现。在这种情况下,搜索只会向下扩展,在每次迭代中将列坐标加 1。然而,例如角度10度更复杂。因此,我大概需要用数学方法计算像素位置 X 处的下一个像素。
This answer 在类似的问题中对我没有帮助,因为 y 轴上的值没有按预期更改:
import numpy as np
angle = 90*np.pi/180
x = np.arange(0, 10)
y = np.round(np.sin(angle)*x).astype(int)
print([(x, y) for x, y in zip(x, y)])
打印:
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
这是错误的,因为我不希望 y 轴发生变化,给定 90 度角。
The answer to this other question 需要第二个 'end' 坐标,我没有。
最后,我找到了 this question,不幸的是,它没有有效的答案。问题中的代码似乎 return 没有偏移量但浮动,我不确定其含义。当我舍入浮点数时,偏移量是错误的:
import numpy
def pol2cart(rotdist, cwangle):
x = rotdist * numpy.cos(cwangle)
y = rotdist * numpy.sin(cwangle)
return round(x), round(y)
print(pol2cart(1, 180))
打印:(-1.0, -1.0)
而预期输出是 (1.0, 0.0)
然而,上面的答案也会在每次迭代中给出一致的偏移量。这将导致只有三个不同的角度(水平、垂直和 45 度)。这是不是所需要的,因为我最终会得到另一个角度,然后我将其放入函数中。
编辑: 输入示例
下图是图像数据的示例。红点表示可能的起始位置。这个点有一个方向,没有指明。如果红点笔直向下,那么它的方向就是180度。
嵌套字典包含每个像素的坐标(行、列)和颜色值:
{1: {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 255, 8: 255,...
第一个建议的答案可以通过首先检查你的线是更水平还是更垂直,并将该维度用作迭代维度(在你的示例中为 x)来解决。
关于第二个建议的答案:您当然可以计算任意远距离终点并将这些算法应用于您提到的起点和终点已知的直线。然后,您可以遍历它返回的点以检查黑色像素,如果找到 none,甚至可以重新启动算法,直到您到达任意终点。
我认为您可以使用 Bresenham 的 "Line Algorithm" 在维基百科上描述 here。
我知道你说你只有起点没有终点,但是你知道行进的角度(方向),你知道矩形中最长的直线是对角线,所以如果你想象一条比对角线长的线,从您的起点开始并朝正确的方向前进,您可以生成超出矩形边缘的点和终点,并将其用于 Bresenham 算法的另一端。