Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check intersection between a line and a rectangle?

The title says it all, Ive been searching around and couldnt find anything that was straight and to the point. How would I take a line with points (x1,y1) & (x2, y2) and check its intersection between a rectangle (xR,yR)? I saw in the Line2D package that there were some intersection methods but not sure how to set it all up. Can someone show me a correct way of setting it up to check for an intersection (collision)?

like image 415
Code Doggo Avatar asked Mar 20 '13 03:03

Code Doggo


People also ask

How do you find the intersection of a rectangle?

The coordinates for some intersection will just be the point where "edge a" of "rectangle 1" intersects "edge x" of "rectangle 2." That is, the intersection point will have the x value of (edge a or x), and the y value of the other edge (since these rectangles are parallel to the axis the x or y value of an edge will ...

What is the intersection formula?

Point of intersection means the point at which two lines intersect. These two lines are represented by the equation a1x + b1y + c1= 0 and a2x + b2y + c2 = 0, respectively.

How do you find the intersection of a line?

To algebraically find the intersection of two straight lines, write the equation for each line with y on the left side. Next, write down the right sides of the equation so that they are equal to each other and solve for x.


Video Answer


3 Answers

A rectangle is 4 lines. You could compute the intersect between your line and the 4 lines of the rectangle.

given the equations of two lines, they would intersect when x and y are equal.

y = m1x + b1 y = m2x + b2

solving the equation you should get:

x = b2 - b1 / (m1 - m2);

Note that if m1 == m2, the lines are parallel and will never intersect, watch out for the divided by 0 in this case.

Then, since you are dealing with segments ratter than infinite lines, check if the intersect falls off within your segments (check if both X and Y are within each segment's boundaries).

like image 105
scharette Avatar answered Nov 03 '22 06:11

scharette


Using the available classes from the 2D Graphics API.

Rectangle r1 = new Rectangle(100, 100, 100, 100);
Line2D l1 = new Line2D.Float(0, 200, 200, 0);
System.out.println("l1.intsects(r1) = " + l1.intersects(r1));

What this doesn't tell you, is where...

like image 23
MadProgrammer Avatar answered Nov 03 '22 07:11

MadProgrammer


Returns null if lines do not intersect. Modified some c code from another response to similar question to make it Java. Haven't bothered to look into how/why it works, but does the job I needed it to.

static Point get_line_intersection(Line2D.Double pLine1, Line2D.Double pLine2)
{
    Point
        result = null;

    double
        s1_x = pLine1.x2 - pLine1.x1,
        s1_y = pLine1.y2 - pLine1.y1,

        s2_x = pLine2.x2 - pLine2.x1,
        s2_y = pLine2.y2 - pLine2.y1,

        s = (-s1_y * (pLine1.x1 - pLine2.x1) + s1_x * (pLine1.y1 - pLine2.y1)) / (-s2_x * s1_y + s1_x * s2_y),
        t = ( s2_x * (pLine1.y1 - pLine2.y1) - s2_y * (pLine1.x1 - pLine2.x1)) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
    {
        // Collision detected
        result = new Point(
            (int) (pLine1.x1 + (t * s1_x)),
            (int) (pLine1.y1 + (t * s1_y)));
    }   // end if

    return result;
}
like image 23
user2875504 Avatar answered Nov 03 '22 06:11

user2875504