首先推薦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; }