考虑一个图像矩阵,其中我有多个线段。我有信息,如起点,终点,线段长度,质心和所有这些线段的斜率。在这种情况下,我如何找到最接近特定线段的线段。一旦我得到最近的线段,它是否可以检测矩形(如果它们存在)? 。示例图片位于此链接sample。
答案 0 :(得分:0)
段/段距离的几何形状并不那么简单。
想象一下两个线段在一般位置,并扩大其中一个。我的意思是,在距离d
处绘制两个平行线段,并在端点上居中绘制半径为d
的两个半圆。这是距离片段恒定距离d
的轨迹。您需要找到最小的d
,以便其他段被命中。
您可以在三个区域中分解飞机:通过端点在两个垂线之间的波段和两个外半平面。您可以剪切这三个区域中的其他线段并分别处理剪切的线段。
在乐队内部,要么段相交,距离为零。或者他们没有,距离是第一段支持线与另一段支点之间的最短距离。
在半平面内,距离是所考虑的端点与另一个分段的两个端点之间的距离中的最短距离,以及端点与另一个分段之间的距离,然后提供端点项目在另一个分段内。
ALTERNATIVE:
使用两个分段的参数方程并最小化(平方)距离可能更容易,例如:
约束Min(p, q) ((Xa (1-p) + Xb p) - (Xc (1-q) + Xd q))^2 + ((Ya (1-p) + Yb p) - (Yc (1-q) + Yd q))^2
下的 0 <= p, q <=1
。
答案 1 :(得分:0)
首先,您必须对齐次坐标[x,y,1] T 中的所有点进行编码,因为这会在线和点之间创建对称关系。即,在齐次坐标中,两条线l1和l2的交点是点p = l1x12,其中x表示矢量乘积。同样,硬币穿过两个点p1,p2的线是l = p1xp2。位于段上的线可以表示为l = p1xp2 = [a,b,c] T 。线方程然后将是l T .p = 0或在笛卡尔坐标中a * x + b * y + c = 0
至于你的任务,有两种情况:
1.段交叉然后它们的交点可以简单地计算为l1xl2;
2.段不交叉,然后两条线之间的最近点是它们的4个端点中的两个之间的最近点。要计算4个可能的距离并选择线段x1和x2与点x0之间的最小距离,请使用以下公式:(x2-x1)x(x1-x0)/ | x2-x1 |
答案 2 :(得分:0)
让细分为AB
和CD
,并沿着p
和q
运行参数,以便0 <= p, q <= 1
。
使用向量,段上任意两点之间的平方距离由下式给出:
D² = (AC - p AB + q CD)²
让我们通过将导数归为p
和q
来最小化此表达式:
AB.(AC - p AB + q CD) = 0
CD.(AC - p AB + q CD) = 0
当AB
和CD
不平行时,这意味着AC - p AB + q CD = 0
,它通过求解2x2系统为您提供交点,距离为零。
但可能会发现p
(或q
)超出了允许的范围,让p < 0
(或p > 1
)。在这种情况下,我们使用p = 0
(p = 1
)重新解决了问题。这相当于找到距离(A, CD)
。
D² = (AC + q CD)²
产生
CD.(AC + q CD) = 0
更容易。
如果事实证明q
也超出范围,请q < 0
,我们最终得到距离(A, C)
:
D² = AC²
同样适用于其他超范围案例。
在并行段的情况下,2x2系统是不确定的(两个等式都是等价的)。你需要解决:
CD.AC - p CD.AB + q CD² = 0
只需尝试使用p/q = 0/1
的所有四种组合,并查看左侧是否采用不同的符号。这证明存在解,距离与距离(A, CD)
相同。否则,答案是端点到端点距离之一。