如何用C语言 求平面上两条线段直接的最小距离

liangchaoxi 2012-04-03 05:04:17
这个题目之后。我没有分了,能给的全部给出。

如何用C语言 求平面上两条线段直接的最小距离。


给两个资料:

我找到一个算法逻辑(英文部分)。然后我又找到一个求空间中两线段最小距离的(最下面连接的那个)我自己想法是,空间的,然后我就想,3维的那个,只有把两条线段的z都置为0,那么两条线段就是处于同一平面,这样的话,我把值分别代入逻辑算法,和3维的那个,看看两个解出来的r,s结果是否相同,如果相同的话,说明
r = ((Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 1)
s = ((Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 2)
没有错,因为这个比较简单,所以我就直接可以拿来用了,但是算了2两遍,二者得出的结果不一样,所以我就没直接用
r = ((Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 1)
s = ((Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 2)
来作为求r s 来作为判断条件。

照理说不应该呀,应该相等才对,难道是我算错了吗?


AB and CD are line segments

Solving the above for r and s yields
r = ((Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 1)
s = ((Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay))/((Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)) ------ (eqn 2)

Let Point be the position vector of the intersection point, then
Point=A+r(B-A) or
Px=Ax+r(Bx-Ax)
Py=Ay+r(By-Ay)
By examining the values of r & s, you can also determine some other
limiting conditions:
If 0<=r<=1 & 0<=s<=1, intersection exists
r<0 or r>1 or s<0 or s>1 line segments do not intersect
If the denominator in eqn 1 is zero, AB & CD are parallel
If the numerator in eqn 1 is also zero, AB & CD are collinear.


我还找到一个求空间中的两线段的最小距离的的:http://wenku.baidu.com/view/ea02ff8a6529647d2728520c.html

...全文
496 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuzhongxunyu 2012-05-04
  • 打赏
  • 举报
回复
你计算的式子写得对不对啊?
cdsnfresh 2012-04-25
  • 打赏
  • 举报
回复
先把数学弄清楚
西山小月 2012-04-03
  • 打赏
  • 举报
回复
先把算法搞清楚
liangchaoxi 2012-04-03
  • 打赏
  • 举报
回复
为了参数计算方便,我直接打代码给程序把系数算出来,我的代码:


float r,s;
float Ay,Ax,Bx,By,Cy,Cx,Dy,Dx;
Ax=4;
Ay=0;
Bx=0;
By=3;
Cx=6;
Cy=0;
Dx=5;
Dy=3;


r = ((Ay-Cy)*(Dx-Cx)-(Ax-Cx)*(Dy-Cy))/((Bx-Ax)*(Dy-Cy)-(By-Ay)*(Dx-Cx)); // ------ (eqn 1)
s = ((Ay-Cy)*(Bx-Ax)-(Ax-Cx)*(By-Ay))/((Bx-Ax)*(Dy-Cy)-(By-Ay)*(Dx-Cx)); // ------ (eqn 2)
float val_s1,val_t1,val_1,val_s2,val_t2,val_2;
val_s1=(pow(Bx-Ax,2)+ pow(By-Ay,2));
val_t1=-((Bx-Ax)*(Dx-Cx)+(By-Ay)*(Dy-Cy));
val_1=(Ax-Bx)*(Ax-Cx)+(Ay-By)*(Ay-Cy);

val_s2=-((Bx-Ax)*(Dx-Cx)+(By-Ay)*(Dy-Cy));
val_t2=(pow(Dx-Cx,2)+ pow(Dy-Cy,2));
val_2=(Ax-Cx)*(Dx-Cx)+(Ay-Cy)*(Dy-Cy);

27,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧