我可以找到很多公式来找到两条斜线之间的距离。我想计算一维中两个线段之间的距离。
使用一堆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.
答案 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。
例:
答案 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)