判断同一平面上的任意两条线段是否相交,大家有什么好的算法?

greenteanet 2006-03-25 03:25:05
判断同一平面上的任意两条线段是否相交,大家有什么好的算法?
...全文
924 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
phoenixinter 2006-04-07
  • 打赏
  • 举报
回复
CrossProduct
qinyuanfeng 2006-04-07
  • 打赏
  • 举报
回复
很厉害——学习中……
寻开心 2006-04-07
  • 打赏
  • 举报
回复
只判断是否相交,应该用跨立试验方法为好,计算量最小,只是+-*,没有/ 速度最快
tansoul 2006-04-07
  • 打赏
  • 举报
回复
/*
1)快速排斥试验

设以线段 P1P2 为对角线的矩形为R,
设以线段 Q1Q2为对角线的矩形为T,
如果R和T不相交,显然两线段不会相交。

--
明显不对,如果R和T相交,两线段即不一定相交.


我觉得楼主想多了,这种情况还是像zzwu(未名) 那样用方程,即初中数学的方法最快,最好.


楼上误解别人了吧,人家说如果R,T不相交可以得到线段不相交,并没有说R,T相交,线段就相交吧!
iamwiner 2006-04-01
  • 打赏
  • 举报
回复
/*
1)快速排斥试验

设以线段 P1P2 为对角线的矩形为R,
设以线段 Q1Q2为对角线的矩形为T,
如果R和T不相交,显然两线段不会相交。

--
明显不对,如果R和T相交,两线段即不一定相交.


我觉得楼主想多了,这种情况还是像zzwu(未名) 那样用方程,即初中数学的方法最快,最好.
greenteanet 2006-03-28
  • 打赏
  • 举报
回复
自己up一下.
Kvci 2006-03-28
  • 打赏
  • 举报
回复
1. 用参数方程表示2线段,记住x、y坐标域
2. 求包含2线段的2直线的交点t.
3、判断t是否同时在两x、y坐标域内
zzwu 2006-03-28
  • 打赏
  • 举报
回复
1. 用参数方程表示2线段,
2. 求包含2线段的2直线的交点t.
3. 如果交点落在2线段中,当且仅当t在[0,1]间
syy64 2006-03-28
  • 打赏
  • 举报
回复
// Á½ÌõÆ½ÃæÏß¶ÎÇ󽻵㡣 2006.3.9.
// pt1,pt2---¡µµÚÒ»ÌõÏß¶ÎÁ½¶ËµãµÄ×ø±ê£»
// pt3,pt4---¡µµÚ¶þÌõÏß¶ÎÁ½¶ËµãµÄ×ø±ê£»
// pt5---¡µ·µ»ØµÄ½»µã×ø±ê¡£
// º¯Êý·µ»ØÖµÎªTrue±íʾÓн»µã£¬false±íʾÎÞ½»µã¡£
bool GetIntersectForTwoLine(CPoint3D pt1, CPoint3D pt2, CPoint3D pt3, CPoint3D pt4, CPoint3D& pt5)
{
bool bBeeline(false);
double dAngle, ss, ss1, dkk, dbb, dValue(0.0001);
CPoint3D pt6, pt7, pt8, pt9, pt10;

pt6 = pt2-pt1;
ss = sqrt(pt6.x*pt6.x+pt6.y*pt6.y);
dAngle = CalAngle(pt6.x, pt6.y);
dAngle *= PI/180.0;
pt7 = pt3-pt1;
CoordTransformation(pt7.x, pt7.y, dAngle, &pt8.x, &pt8.y);
pt7 = pt4-pt1;
CoordTransformation(pt7.x, pt7.y, dAngle, &pt9.x, &pt9.y);
if(pt8.x<0.0&&pt9.x<0.0)return false;
if(pt8.x>ss&&pt9.x>ss)return false;
if(pt8.y*pt9.y>0)return false;
pt10 = pt9-pt8;
ss1 = sqrt(pt10.x*pt10.x+pt10.y*pt10.y);
bBeeline = BeelineEquation(pt8, pt9, dValue, dkk, dbb);
pt7.y = 0.0;
if(!bBeeline)
pt7.x = pt8.x;
else
pt7.x = -dbb/dkk;
if(pt7.x<0.0||pt7.x>ss)return false;
CoordAntiTransformation(pt7.x, pt7.y, dAngle, &pt5.x, &pt5.y);
pt5 += pt1;
return true;
}
greenteanet 2006-03-25
  • 打赏
  • 举报
回复
楼上的谢谢啦,这个算法我知道。我是想得到另外一些创新点的算法。
jp1984 2006-03-25
  • 打赏
  • 举报
回复
/*
1)快速排斥试验

设以线段 P1P2 为对角线的矩形为R,
设以线段 Q1Q2为对角线的矩形为T,
如果R和T不相交,显然两线段不会相交。

(2)跨立试验

如果两线段相交,则两线段必然相互跨立对方。
若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 )
和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,
即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。
上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。
当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,
但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;
同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。
所以判断P1P2跨立Q1Q2的依据是:
( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
同理判断Q1Q2跨立P1P2的依据是:
( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。

*/

33,025

社区成员

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

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