给定线段两端点坐标,如何判断两条 线段 是否相交? 要判断的是线段是否相交,不是延长后是否相交。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有他们的坐标,可以求出两个线段的方程,根据两个方程求解求出x,y,假设线段a端点坐标为x1,y1;线段b端点坐标为x2,y2看看这个条件是否符合((x在x1和x2之间)&&(y在y1和y2之间)) 坐标变换,将一条线段置平,判断另一条线段的y坐标,如y1*y2>0,则没有交点,否则有。 x1,y1 x2,y2 x3,y3 x4,y4k1 = (y1-y2)/(x1-x2); //若x1=x2,活着x3=x4特殊考虑b1 = (x1*y2 - x2*y1)/(x1-x2);k2 = (y3-y4)/(x3-x4); //若x1=x2,活着x3=x4特殊考虑b2 = (x3*y4 - x4*y3)/(x3-x4);如果k1=k2没有交点否则 x = (b2-b1) / (k1-k2); 如果 x在x1到x2之间 而且在x3到x4之间 就是在线段内有交点. 你可以这样,假设A-B决定的直线方程为f1(x,y)=0,C-D决定的直线方程为f2(x,y)=0;线段A-B与C-D有交点<<==>>f1(ptC.x,ptC.y)*f1(ptD.x,ptD.y)<=0&&f2(ptA.x,ptA.y)*f2(ptB.x,ptB.y)<=0如果只判断是否有交点完全可以用这个方法 。 如果你对速度要求很高的话,该方法的浮点乘可以改为判断,判断两个乘数是否符号相反,如果其中一个为0,就可以认为与另一个乘数符号相反.请参考http://community.csdn.net/Expert/topic/3362/3362921.xml?temp=.4061548 向量法:如果两线段相交,则两线段必然相互跨立对方。若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。具体情况如下图所示: 快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。 有一个相对简单的办法,不需要解方程,道理也很简单。对于直线方程y=f(x)以及另外2个点(x1,y1)(x2,y2),如果(y1-f(x1))*(y2-f(x2))<=0,那么(x1,y1)和(x2,y2)位于直线y=f(x)的2边(包含某个点位于直线上)。当直线为垂直线x=C (C为一个常数)时,只要判断(x1-x)*(x2-x)<=0就可以了。这个原理,以前上数学课时老师都讲到过,不过很多人已经忘了。利用上面的原理,就可以很容易的判断2条线段是否相交了。对于线段P1P2和P3P4,先用P1P2为直线,P3、P4为另外2个点,根据上面说的,看看P3、P4是否位于直线P1P2的两边。如果位于同一边,那么就不用算了,2条线段不相交。否则继续以P3P4组成的直线,以及P1、P2两个点,根据上面说的,判断P1、P2是否位于直线P3P4的两边,如果P1、P2也位于直线P1P2的两边,那么就说明两条线段相交。 上面最后一句话写错了,原来是“如果P1、P2也位于直线P1P2的两边,那么就说明两条线段相交”修改为“如果P1、P2也位于直线P3P4的两边,那么就说明两条线段相交” 高手们 谁能告诉我 为什么我的UDP程序服务器端和客户端连接不上??? 请教:两个类的实例对象之间如何通信? 求《ActiveX开发人员指南》电子版!有马上给分? 初学,帮忙! 机器死机后,重新打开只能以二进制阅读,如何改回来 MFC新手请教drawtext函数怎么使用 为什么我的程序在打印时选择“打印到文件”正常,而选择“到打印机”打印机却没有反应(打印机好用)? 如何将网页中的多个关键字替换成相关的链接? 索引+数据块的文件结构如何实现? 关于return语句 windows版本的问题? 原表是空时加新的时候就出错。请教大家了(vc和Access)
求出x,y,假设线段a端点坐标为x1,y1;线段b端点坐标为x2,y2
看看这个条件是否符合
((x在x1和x2之间)&&(y在y1和y2之间))
k1 = (y1-y2)/(x1-x2); //若x1=x2,活着x3=x4特殊考虑
b1 = (x1*y2 - x2*y1)/(x1-x2);
k2 = (y3-y4)/(x3-x4); //若x1=x2,活着x3=x4特殊考虑
b2 = (x3*y4 - x4*y3)/(x3-x4);如果k1=k2没有交点
否则 x = (b2-b1) / (k1-k2);
如果 x在x1到x2之间 而且在x3到x4之间 就是在线段内有交点.
线段A-B与C-D有交点<<==>>
f1(ptC.x,ptC.y)*f1(ptD.x,ptD.y)<=0&&f2(ptA.x,ptA.y)*f2(ptB.x,ptB.y)<=0
如果只判断是否有交点完全可以用这个方法 。
如果你对速度要求很高的话,该方法的浮点乘可以改为判断,判断两个乘数是否符号相反,如果其中一个为0,就可以认为与另一个乘数符号相反.请参考http://community.csdn.net/Expert/topic/3362/3362921.xml?temp=.4061548
如果两线段相交,则两线段必然相互跨立对方。若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。具体情况如下图所示:
(x2,y2),如果(y1-f(x1))*(y2-f(x2))<=0,那么(x1,y1)和(x2,y2)位于直线y=f(x)的2边(包含某个
点位于直线上)。当直线为垂直线x=C (C为一个常数)时,只要判断(x1-x)*(x2-x)<=0就可以了。
这个原理,以前上数学课时老师都讲到过,不过很多人已经忘了。利用上面的原理,就可以很容易的判断2条线段是否相交了。对于线段P1P2和P3P4,先用P1P2为直线,
P3、P4为另外2个点,根据上面说的,看看P3、P4是否位于直线P1P2的两边。如果位于同一边,那么
就不用算了,2条线段不相交。否则继续以P3P4组成的直线,以及P1、P2两个点,根据上面说的,判断
P1、P2是否位于直线P3P4的两边,如果P1、P2也位于直线P1P2的两边,那么就说明两条线段相交。
原来是“如果P1、P2也位于直线P1P2的两边,那么就说明两条线段相交”
修改为“如果P1、P2也位于直线P3P4的两边,那么就说明两条线段相交”