编辑:更改了标题。我对这两个段是否相同不太感兴趣,而是如果它们彼此共线,则在一定的公差范围内。如果是这样,那么这些线应该聚集在一起作为一个单独的段。
编辑:我想一个简短的说法:我试图以一种有效的方式将相似的线段聚集在一起。
假设我有线段f
(fx0, fy0)
和(fx1, fy1)
和g
(gx0, gy0)
和(gx1, gy1)
这些来自诸如计算机视觉算法边缘检测器之类的东西,在某些情况下,两条线基本相同,但由于像素容差而被视为两条不同的线。
有几种情况
f
并g
共享完全相同的端点,例如:f = (0,0), (10,10) g = (0,0), (10,10)
f
并g
共享大致相同的端点和大致相同的长度,例如:f = (0,0.01), (9.95,10) g = (0,0), (10,10)
f
是 的子集g
,这意味着它的端点落在该段内g
并与该段共享相同的斜率g
。想象一条粗略的线,笔在其中来回移动以使其变粗。例如:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)
以下将不被视为相同:
f
并且g
有超过一定的斜率差tolerance
f
并且g
可能具有相同的斜率但相隔一段距离tolerance
,即平行线f
并且g
在同一平面和同一坡度上,但根本不重叠……即虚线内的一组线段。
判断它们是否相同的最简单方法是如果gx1 - fx1 <= tolerance
(对其他三个点重复),但在某些情况下,线f
可能比线短g
(同样,由于像素差异和/或照片扫描不佳)。
那么将这两个线段转换成极坐标并比较角度会更好吗?在这种情况下,两个 rho 将在容差范围内。但是你必须确保两条线段具有相同的“方向”,这在笛卡尔坐标或极坐标中计算是微不足道的。
所以这很容易找到一种方法,但我只是想知道是否有一种更清洁的方法,基于我早已忘记的线性代数?