编辑:修改了标题。我对两个线段是否相同不是很感兴趣,而是如果它们与彼此共线且在一定容差内,则应将这些线段聚集在一起作为单个线段。
编辑:我想简短地说:我正在尝试以有效的方式将相似的线段聚类在一起。
假设我有线段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
具有大于某个容差
的斜率差异f
和g
可能具有相同的斜率,但相隔超出容差
的距离,即平行线f
和g
在同一平面和相同斜率上,但根本不重叠...即虚线内的一组线段。
最简单的方法是检查gx1 - fx1 <= 容差
(对其他三个点重复此操作),但在某些情况下,线段f
可能比线段g
短(再次由于像素差异和/或照片扫描质量不佳)。
所以,把这两个线段转换成极坐标然后比较角度,是不是更好?这种情况下,这两个rho值将在一个公差内。但是,接下来你必须确保这两个线段具有相同的“方向”,这在笛卡尔或极坐标中计算是微不足道的。
所以,这很容易想出一种方法,但我只是想知道是否有一种更加简洁的方法,基于我早已忘记的线性代数?