You are currently viewing the GMLscripts.com static mirror. Forum access and script submissions are not available through this mirror.

Invert GMLscripts.com

lines_intersect

lines_intersect(x1, y1, x2, y2, x3, y3, x4, y4, segment)
Returns a scalar (t) that indicates if two lines or segments intersect.
COPY/// @func   lines_intersect(x1, y1, x2, y2, x3, y3, x4, y4, segment)
///
/// @desc   Returns a scalar (t) that indicates if two lines or segments intersect.
///         A value of (0 < t <= 1) indicates an intersection within the line segment, 
///         a value of 0 indicates no intersection, other values indicate an 
///         intersection beyond the endpoints.
///
///         The two lines are given by end point coordinate pairs.
///         The first line is {x1,y1}->{x2,y2}, the second is {x3,y3}->{x4,y4}.
///
/// @param  {real}      x1
/// @param  {real}      y1
/// @param  {real}      x2
/// @param  {real}      y2
/// @param  {real}      x3
/// @param  {real}      y3
/// @param  {real}      x4
/// @param  {real}      y4
/// @param  {boolean}   segment     if true, confine test to line segments
///
/// @return {real}      point of intersection
///
/// Note: By substituting the return value (t) into the parametric form
///       of the first line, the point of intersection can be determined.
///       eg. x = x1 + t * (x2 - x1)
///           y = y1 + t * (y2 - y1)
///
/// GMLscripts.com/license

function lines_intersect(x1, y1, x2, y2, x3, y3, x4, y4, segment)
{
    var ua, ub, ud, ux, uy, vx, vy, wx, wy;
    ua = 0;
    ux = x2 - x1;
    uy = y2 - y1;
    vx = x4 - x3;
    vy = y4 - y3;
    wx = x1 - x3;
    wy = y1 - y3;
    ud = vy * ux - vx * uy;
    if (ud != 0) 
    {
        ua = (vx * wy - vy * wx) / ud;
        if (segment) 
        {
            ub = (ux * wy - uy * wx) / ud;
            if (ua < 0 || ua > 1 || ub < 0 || ub > 1) ua = 0;
        }
    }
    return ua;
}

Contributors: xot

GitHub: View · Commits · Blame · Raw