异面线段间的最短距离

标签:
空间线段之间距离线段距离it |
分类: 算法 |
我们知道,异面直线的最短距离指的就是公垂线的长度,计算方法很多,还可以计算出最短距离点对。
但在有的应用中,需要求出异面线段的最短距离。区别在于,异面线段的最短距离不一定就是公垂线的距离。换句话说,异面线段的最短距离点对必须都落在每条线段里面,而不能在线段的延长线上。
那么假设,现在异面线段的最短距离点对没有落在每条线段里面,很显然,公垂线距离就不是最短距离了。该如何求解最短距离呢?实际上,只要我们求出线段的每个端点到另一条线段的最短距离,然后进行比较,最小者即胜出当选。
下面我们来从几何上证明这一点。
第一幅图中,PQ是线段AB和CD的公垂线。由于P,Q分别位于AB和CD线段内,因此PQ就是最短距离。由此我们也可以看出公垂线的一般做法。平移AB与CD相交得Q,从Q向P做垂线,得P。
再来看第二幅图。显然PQ不再是线段AB与CD的最短距离了,因为Q不在CD内。从几何上就可以看出,实际上AB上任一点U到CD上任一点V的距离UV都可以这样求得:设U在CD和A’B’构成的二维平面内的投影为U’,那么UU’,U’V和UV就构成了一个直角三角形。
ED的距离就是这样通过EE’和E’D求得的。由于EE’
因此结论就是:
(1)
(2)
double SocketUdp::getPointsDis(stPoint stPS,stPoint stPE)
{
}
double SocketUdp:: getTheNearestDis(stPoint stLine1PS,stPoint stLine1PE,stPoint stTargetP)
{
float a,b,c;
a=getPointsDis(stLine1PE,stTargetP);
if(a<=0.00001)
return 0.0f;
b=getPointsDis(stLine1PS,stTargetP);
if(b<=0.00001)
return 0.0f;
c=getPointsDis(stLine1PS,stLine1PE);
if(c<=0.00001)
return
a;//如果stLine1PS和stLine1PE坐标相同,则退出函数,并返回距离
//---stTargetP在线段上的投影不在线段上---------------------------
if(a*a>=b*b+c*c)
return b;
if(b*b>=a*a+c*c)
return a;
//stTargetP在线段上的投影在线段上
float l=(a+b+c)/2;
float
s=sqrt(l*(l-a)*(l-b)*(l-c));
return 2*s/c;
}
double SocketUdp::getTheNearestDis(stPoint stLine1PS,stPoint stLine1PE,stPoint stLine2PS, stPoint stLine2PE)
{
double dNearestDis;
//line2的起始端到line1的最小距离
dNearestDis = getTheNearestDis(stLine1PS,stLine1PE,stLine2PS);
//line2的终点到line1的最小距离 与原值取小
dNearestDis = min(dNearestDis,getTheNearestDis(stLine1PS,stLine1PE,stLine2PE));
//line1的起始端到line2的最小距离 与原值取小
dNearestDis = min(dNearestDis,getTheNearestDis(stLine2PS,stLine2PE,stLine1PS));
//line1的终点到line2的最小距离 与原值取小
dNearestDis = min(dNearestDis,getTheNearestDis(stLine2PS,stLine2PE,stLine1PE));
return dNearestDis;
}
“空间中一个点到空间中一条线段的最短距离”;
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=3547&show=25
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=3553&show=25!
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=3564&show=0
“[求助]如何求空间两个多面体的最短距离”
http://www.mathchina.com/cgi-bin/topic.cgi?forum=5&topic=3511&show=50