要判断的是线段是否相交,不是延长后是否相交。

解决方案 »

  1.   

    有他们的坐标,可以求出两个线段的方程,根据两个方程求解
    求出x,y,假设线段a端点坐标为x1,y1;线段b端点坐标为x2,y2
    看看这个条件是否符合
    ((x在x1和x2之间)&&(y在y1和y2之间))
      

  2.   

    坐标变换,将一条线段置平,判断另一条线段的y坐标,如y1*y2>0,则没有交点,否则有。
      

  3.   

    x1,y1 x2,y2 x3,y3 x4,y4
    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之间   就是在线段内有交点.
      

  4.   

    你可以这样,假设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
      

  5.   

    向量法:
    如果两线段相交,则两线段必然相互跨立对方。若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。具体情况如下图所示:
      

  6.   

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

  7.   

    有一个相对简单的办法,不需要解方程,道理也很简单。对于直线方程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的两边,那么就说明两条线段相交。
      

  8.   

    上面最后一句话写错了,
    原来是“如果P1、P2也位于直线P1P2的两边,那么就说明两条线段相交”
    修改为“如果P1、P2也位于直线P3P4的两边,那么就说明两条线段相交”