根据您的描述,最短线距离需要根据线段定义的区域单独讨论。例如,如果线段是 (0,0) 到 (0,1),那么我们必须将空间分割成三个子空间(d 表示最小距离函数):
- y < 0: d = sqrt(x^2 + y^2)
- 0 < y < 1:d = |x| (由该线段定义的区域)
- 1 < y: d = sqrt(x^2 + (y-1)^2)
函数 d 具有凸属性,因此您可以通过运行一些标准的凸优化软件来解决优化问题,cvx 软件包是一个不错的选择。有关凸优化理论的更多信息,凸优化是一本值得参考的好书。
如果您不费心通过一些优化求解器来获得结果,那么基于启发式求解替代版本可能会简单得多。
请注意,如果线段在两端无限延伸,问题将是微不足道的。所以我能想到的是将线段视为线,但在端点处添加惩罚距离。话虽如此,以下指标满足需求:
L = [(ax + by - c)^2] + [(x-x1)^2 + (x-y1)^2] + [(x-x2)^2 + (y-y2)^2]
这里 (x, y) 是你需要决定的点,ax* + by* = c 定义线,(x1,y1), (x2,y2) 是两个端点。因此,第一项 [...] 是到线的平方距离;第二和第三 [...] 项是到两个端点的平方距离。
最小化 L 意味着:
- 更喜欢依赖或靠近线;
- 更喜欢驻留在段定义的区域中;
它属于最小二乘距离问题,因此您可以通过简单地求解一组线性方程来获得解决方案。这也是我在 L 中坚持二次形式的原因。
当然,这只是一种启发式方法,可以导致更简单的解决方案。就视觉认知而言,术语 L 的其他表述可能会导致更好的结果。您可以考虑使用不同的 L,然后根据视觉结果选择最佳的。