zoukankan      html  css  js  c++  java
  • 判断两条线段是否相交

    对于线段A,B,如果 线段A与直线B相交 ,线段B与直线A相交 ,那么就可以认为线段A 和线段B相交。
    关键问题是:如何判断直线AB是否与线段CD相交呢?
    设直线AB的方程为:f(x,y) = 0,直线方程可以通过两点式求得。
    当C和D点不在直线的同侧时,直线AB必然与线段CD相交,也就是说直线AB与线段CD相交的条件为:f(C) * f(D) <= 0。
    代码如下:
     1     typedef struct point  
     2 
     3     {  
     4 
     5         float x;  
     6 
     7         float y;  
     8 
     9     }Point;  
    10 
    11     //判断直线AB是否与线段CD相交  
    12 
    13     bool lineIntersectSide(Point A, Point B, Point C, Point D)  
    14 
    15     {  
    16 
    17         // A(x1, y1), B(x2, y2)的直线方程为:  
    18 
    19         // f(x, y) =  (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0  
    20 
    21       
    22 
    23         float fC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);  
    24 
    25         float fD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);  
    26 
    27       
    28 
    29         if(fC * fD > 0)  
    30 
    31             return false;  
    32 
    33       
    34 
    35         return true;  
    36 
    37     }  
    38 
    39     bool sideIntersectSide(Point A, Point B, Point C, Point D)  
    40 
    41     {  
    42 
    43         if(!lineIntersectSide(A, B, C, D))  
    44 
    45             return false;  
    46 
    47         if(!lineIntersectSide(C, D, A, B))  
    48 
    49             return false;  
    50 
    51         return true;  
    52 
    53     }  
  • 相关阅读:
    AGC015E Mr.Aoki Incubator
    luogu P3520 [POI2011]SMI-Garbage
    442.Find All Duplicates in an Array
    SICP_2.61-2.62
    sicp_2.59-2.60
    SICP_2.58
    SICP_2.56-2.57
    SICP_2.53-2.55
    SICP_2.52-2.53
    SICP_2.50-2.51
  • 原文地址:https://www.cnblogs.com/lovebay/p/10477090.html
Copyright © 2011-2022 走看看