我有一条线,由参数m, h
定义,其中
y = m*x + h
该线穿过网格(即像素)。对于网格的每个方格(a, b)
(即方格[a, a+1] x [b, b+1]
),我想确定给定的线是否穿过这个方块,如果是,那么方块中的线段长度是多少
最终,我希望能够同时使用多行(即m
和h
是矢量,matlab风格),但我们可以专注于“简单”的情况现在。
我想到了如何确定线是否穿过正方形:
x = a
和x = a + 1
的交点,以及水平线y = b
和y = b + 1
a <= x < a + 1
和b <= y < b + 1
)如果这些点上的两个在广场上,则该线穿过它。然后,为了计算长度,你只需减去这两个点,并使用毕达哥拉斯定理。
我的问题更多的是在实现方面:我如何很好地实现它(特别是在选择减去哪2个点时)?
答案 0 :(得分:2)
让square由角点(a,b),(a + 1,b),(a,b + 1),(a + 1,b + 1)定义。< / p>
步骤1:检查线是否与正方形相交...
(a)将4个角点的每个坐标替换为 y - mx - h 。如果此评估的符号包括正面和负面条款,请转到步骤b。否则,该线不与正方形相交。
(b)现在有两个子案例:
(b1)案例1:在步骤(a)中,您有三个点, y - mx - h 评估为一个符号,第四个点评估为另一个符号。让第4点为(x *,y *)。然后交点是(x *,mx * + h)和((y * -h)/ m,y *)。
(b2)案例2:在步骤(a)中,您有两个点, y - mx - h 评估为一个符号,其他两个点评估为另一个符号。选择评估为相同符号的任意两个点,例如(x *,y *)和(x * + 1,y *)。然后交点是(x *,mx * + h)和(x * + 1,m(x * + 1)+ h)。
您必须考虑一些退化情况,其中线条恰好触及四个角点中的一个,以及线条恰好位于正方形一侧的情况。
答案 1 :(得分:0)
当m
为0时(当尝试计算与y = k
的交集时),您提出的方法可能会遇到步骤(1)中的问题。
如果m
为0,则很容易(线段长度为1或0,具体取决于b <= h <= b+1
)。
否则,您可以通过替换找到x = a
和a+1
的交叉点,例如y_a
,y_{a+1}
。然后,将y_a
和y_{a+1}
剪切到b
和b+1
之间(例如,y1
和y2
,即y1 = min(b+1, max(b, y_a))
,同样对于y2
),并使用比例abs((y1-y2)/m) * sqrt(m^2+1)
。
这利用了x=k
和x=k+1
之间的线段为sqrt(m^2+1)
这一事实,y
之间的差异为m
,并且相似
答案 2 :(得分:0)
你可以这样做: 首先找到正方形的中心,然后找到对角线的长度。如果从正方形中心到直线的距离小于对角线的长度,那么该直线将与该正方形相交。一旦你知道该线将相交,那么你可以很容易地找到相交的线段。我想你正试图为代数重建技术制作权重矩阵。我希望这是正确的答案。这是我在堆栈流程中的第一个答案。 :)