Java examples for java.lang:Math Geometry Line
Check if two line segments intersects.
public class Main{ /**//from ww w . j a v a2s. c om * Check if two line segments intersects. Integer domain. * * @param x0, y0, x1, y1 End points of first line to check. * @param x2, yy, x3, y3 End points of second line to check. * @return True if the two lines intersects. */ public static boolean isLineIntersectingLine(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) { int s1 = GeometryUtils.sameSide(x0, y0, x1, y1, x2, y2, x3, y3); int s2 = GeometryUtils.sameSide(x2, y2, x3, y3, x0, y0, x1, y1); return s1 <= 0 && s2 <= 0; } /** * Check if two points are on the same side of a given line. Algorithm from * Sedgewick page 350. * * @param x0, y0, x1, y1 The line. * @param px0, py0 First point. * @param px1, py1 Second point. * @return <0 if points on opposite sides. =0 if one of the points is * exactly on the line >0 if points on same side. */ private static int sameSide(double x0, double y0, double x1, double y1, double px0, double py0, double px1, double py1) { int sameSide = 0; double dx = x1 - x0; double dy = y1 - y0; double dx1 = px0 - x0; double dy1 = py0 - y0; double dx2 = px1 - x1; double dy2 = py1 - y1; // Cross product of the vector from the endpoint of the line to the point double c1 = dx * dy1 - dy * dx1; double c2 = dx * dy2 - dy * dx2; if (c1 != 0 && c2 != 0) { sameSide = c1 < 0 != c2 < 0 ? -1 : 1; } else if (dx == 0 && dx1 == 0 && dx2 == 0) { sameSide = !isBetween(y0, y1, py0) && !isBetween(y0, y1, py1) ? 1 : 0; } else if (dy == 0 && dy1 == 0 && dy2 == 0) { sameSide = !isBetween(x0, x1, px0) && !isBetween(x0, x1, px1) ? 1 : 0; } return sameSide; } /** * Check if two points are on the same side of a given line. Integer domain. * * @param x0, y0, x1, y1 The line. * @param px0, py0 First point. * @param px1, py1 Second point. * @return <0 if points on opposite sides. =0 if one of the points is * exactly on the line >0 if points on same side. */ private static int sameSide(int x0, int y0, int x1, int y1, int px0, int py0, int px1, int py1) { return sameSide((double) x0, (double) y0, (double) x1, (double) y1, (double) px0, (double) py0, (double) px1, (double) py1); } /** * Return true if c is between a and b. */ private static boolean isBetween(int a, int b, int c) { return b > a ? c >= a && c <= b : c >= b && c <= a; } /** * Return true if c is between a and b. */ private static boolean isBetween(double a, double b, double c) { return b > a ? c >= a && c <= b : c >= b && c <= a; } }