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)?
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 ...
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.
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.
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).
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...
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With