Check if two line segments intersects. - Android java.lang

Android examples for java.lang:Math Geometry

Description

Check if two line segments intersects.

Demo Code

/*******************************************************************************
 * Copyright (c) 2011 MadRobot./*  w w w  . j  ava  2s .  c o  m*/
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v2.1
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *  Elton Kent - initial API and implementation
 ******************************************************************************/
//package com.java2s;

public class Main {
    /**
     * 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(float x0, float y0,
            float x1, float y1, float x2, float y2, float x3, float y3) {
        float s1 = sameSide(x0, y0, x1, y1, x2, y2, x3, y3);
        float s2 = 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(float x0, float y0, float x1, float y1,
            float px0, float py0, float px1, float py1) {
        int sameSide = 0;

        float dx = x1 - x0;
        float dy = y1 - y0;
        float dx1 = px0 - x0;
        float dy1 = py0 - y0;
        float dx2 = px1 - x1;
        float dy2 = py1 - y1;

        // Cross product of the vector from the endpoint of the line to the
        // point
        float c1 = dx * dy1 - dy * dx1;
        float 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;
    }

    /**
     * Return true if c is between a and b.
     */
    private static boolean isBetween(float a, float b, float c) {
        return b > a ? (c >= a) && (c <= b) : (c >= b) && (c <= a);
    }
}

Related Tutorials