如何获得跨越正方形的段的长度?

时间:2010-12-07 17:32:24

标签: algorithm math matlab vector

我有一条线,由参数m, h定义,其中

y = m*x + h

该线穿过网格(即像素)。对于网格的每个方格(a, b)(即方格[a, a+1] x [b, b+1]),我想确定给定的线是否穿过这个方块,如果是,那么方块中的线段长度是多少

最终,我希望能够同时使用多行(即mh是矢量,matlab风格),但我们可以专注于“简单”的情况现在。

我想到了如何确定线是否穿过正方形:

  1. 计算线与垂直线x = ax = a + 1的交点,以及水平线y = by = b + 1
  2. 检查这4个点中的2个是否在方形边界上(即a <= x < a + 1b <= y < b + 1
  3. 如果这些点上的两个在广场上,则该线穿过它。然后,为了计算长度,你只需减去这两个点,并使用毕达哥拉斯定理。

    我的问题更多的是在实现方面:我如何很好地实现它(特别是在选择减去哪2个点时)?

3 个答案:

答案 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 = aa+1的交叉点,例如y_ay_{a+1}。然后,将y_ay_{a+1}剪切到bb+1之间(例如,y1y2,即y1 = min(b+1, max(b, y_a)),同样对于y2),并使用比例abs((y1-y2)/m) * sqrt(m^2+1)

这利用了x=kx=k+1之间的线段为sqrt(m^2+1)这一事实,y之间的差异为m,并且相似

答案 2 :(得分:0)

你可以这样做: 首先找到正方形的中心,然后找到对角线的长度。如果从正方形中心到直线的距离小于对角线的长度,那么该直线将与该正方形相交。一旦你知道该线将相交,那么你可以很容易地找到相交的线段。我想你正试图为代数重建技术制作权重矩阵。我希望这是正确的答案。这是我在堆栈流程中的第一个答案。 :)