1D中两个线段之间最短距离的有效算法

时间:2010-12-15 11:15:38

标签: sql-server algorithm geometry distance intersection

我可以找到很多公式来找到两条斜线之间的距离。我想计算一维中两个线段之间的距离。

使用一堆IF语句很容易。但我想知道他们是否是一个更有效的数学公式。

E.g。 1:

----L1x1-------L2x1-------L1x2------L2x2----------------------------

L1 =线段1,L2 =线段2; 由于交叉点,这里的距离为0

E.g。 2:

----L1x1-------L1x2-------L2x1------L2x2----------------------------

这里的距离是L2x1 - L1x2

修改

唯一的假设是线段是有序的,即x2总是> X1。

线段1可以是线段2的左,右,等于等。算法必须解决此问题。

编辑2:

我必须在T-SQL(SQL Server 2008)中实现它。我只需要逻辑......我可以编写T-SQL。

编辑3:

如果线段是另一条线的线段,则距离为0.

----L1x1-------L2x1-------L2x2------L1x2----------------------------

线段2是线段1的一段,距离为0。

如果它们相交或触摸,则距离为0.

5 个答案:

答案 0 :(得分:3)

这个问题与“两个范围相交,如果没有那么它们之间的距离是多少?”这个问题相同。答案取决于您是否已经知道哪个范围已经最小,以及范围中的点是否正确排序(即,线是否具有相同的方向)。

if (a.start < b.start) {
  first = a;
  second = b;
} else {
  first = b;
  second = a;
}

然后:

distance = max(0, second.start - first.end);

根据您运行此处的位置,您的编译器应该很好地优化它。在任何情况下,您都应该进行分析,以确保您的代码成为瓶颈,然后再降低其可读性,从而提高理论性能。

答案 1 :(得分:2)

这适用于所有情况:

d = (s1 max s2 - e1 min e2) max 0

作为奖励,删除最大值0表示否定结果表明两个段中有多少重叠。

<强>证明

请注意,算法是对称的,因此非对称情况只需要覆盖一次。所以我要断言s2&gt; = s1 w.l.o.g.还要注意e1&gt; = s1和e2&gt; = s2。

例:

  • L2在L1结束后开始(s2> = e1):s1 max s2 = s2,e1 min e2 = e1。结果是s2 - e1,它是非负的,显然是我们想要的值(距离)。
  • L1内的L2(s2 <= e1,e2 <= e1):s1 max s2 = s2,e1 min e2 = e2。 s2-e2由于s2&lt; = e2而为非正数,因此在重叠期间结果为0。
  • L2在L1内开始但在(s2&lt; = e1,e2&gt; = e1)之后结束:s1 max s2 = s2,e1 min e2 = e1。 s2-e1由s2&lt; = e1为非正数,因此在重叠期间结果为0。

答案 2 :(得分:0)

我认为没有办法绕过这些条件。但这很简洁:

var diff1 = L2x1 - L1x2;
var diff2 = L2x2 - L1x1;

return diff1 > 0 ? max(0, diff1) : -min(0,diff2);

这假定LNx1&lt; LNx2。

答案 3 :(得分:0)

我认为1D中的所有线段都是形式(X,0)或(0,Y)之一

所以将所有这些x值存储在一个数组中并对数组进行排序,最小距离将是数组中第一个2元之间的差异。

在将元素存储到数组中时需要注意,以便不存储重复的元素

答案 4 :(得分:0)

这个公式似乎适用于所有情况,但是一条线完全位于另一条线上。

return -min(a2-b1,b2-a1)