如何判断空间两线段是否相交?

whnchh 2003-04-07 04:16:36
已知空间两条线段的顶点坐标(x1,y1,z1),(x2,y2,z2),如何判断它们是否相交?
...全文
640 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
alidiedie 2003-04-20
  • 打赏
  • 举报
回复
以前有好多此个问题:
排斥实验 和跨立实验
/* 基本几何结构 */
struct POINT
{
double x;
double y; POINT(double a=0, double b=0) { x=a; y=b;} //constructor
};
struct LINESEG
{
POINT s;
POINT e; LINESEG(POINT a, POINT b) { s=a; e=b;}
LINESEG() { }
};


double multiply(POINT sp,POINT ep,POINT op)
{
return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}


// 如果线段u和v相交(包括相交在端点处)时,返回true
bool intersect(LINESEG u,LINESEG v)
{
return( (max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&& //排斥实验
(max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&&
(max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&&
(max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&&
(multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&& //跨立实验
(multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0));
}
DNCS 2003-04-20
  • 打赏
  • 举报
回复
有一个比较简单的方法,
建立两条直线方程求解,看解在不在有效范围内即可
liuweiyan 2003-04-08
  • 打赏
  • 举报
回复
都是高手啊,原来自己一直是井底之蛙:(
ZhangYv 2003-04-07
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/927/927874.xml?temp=.3757593
寻开心 2003-04-07
  • 打赏
  • 举报
回复
没有时间细想,至少可以这样判断。
两个线段都有自己的方向向量,两个向量差乘,得到公共的垂直
如果垂直向量是零向量,表示两线段平行
否则,使用两个线段的各一个点和这个公共的垂直做点乘,数值相等表示共面,可以继续测试,否则表示不相交了。
如果共面就可以转化成为平面线段来判断了。平面判断的办法就比较成熟了,论坛前面有现成的结论。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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