java判斷兩線段是否相交


首先推薦java的Line2D類自帶方法linesIntersect

java.awt.geom.Line2D.linesIntersect(x1, y1, x2, y2, x3, y3, x4, y4);

 自定義方法:

    /**兩【線段】是否相交
     * @param l1x1 線段1的x1
     * @param l1y1 線段1的y1
     * @param l1x2 線段1的x2
     * @param l1y2 線段1的y2
     * @param l2x1 線段2的x1
     * @param l2y1 線段2的y1
     * @param l2x2 線段2的x2
     * @param l2y2 線段2的y2
     * @return 是否相交
     */
    public static boolean intersection(double l1x1, double l1y1, double l1x2, double l1y2, 
double l2x1, double l2y1, double l2x2, double l2y2)
    {
        // 快速排斥實驗 首先判斷兩條線段在 x 以及 y 坐標的投影是否有重合。 有一個為真,則代表兩線段必不可交。
        if (Math.max(l1x1,l1x2) < Math.min(l2x1 ,l2x2)
            || Math.max(l1y1,l1y2) < Math.min(l2y1,l2y2)
            || Math.max(l2x1,l2x2) < Math.min(l1x1,l1x2)
            || Math.max(l2y1,l2y2) < Math.min(l1y1,l1y2))
        {
            return false;
        }
        // 跨立實驗  如果相交則矢量叉積異號或為零,大於零則不相交
        if ((((l1x1 - l2x1) * (l2y2 - l2y1) - (l1y1 - l2y1) * (l2x2 - l2x1)) 
              * ((l1x2 - l2x1) * (l2y2 - l2y1) - (l1y2 - l2y1) * (l2x2 - l2x1))) > 0
            || (((l2x1 - l1x1) * (l1y2 - l1y1) - (l2y1 - l1y1) * (l1x2 - l1x1)) 
              * ((l2x2 - l1x1) * (l1y2 - l1y1) - (l2y2 - l1y1) * (l1x2 - l1x1))) > 0)
        {
            return false;
        }
        return true;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM