Cod*_*ggo 9 java intersection line rectangles collision
标题说明了一切,我一直在寻找并找不到任何直截了当的东西.如何用点(x1,y1)和(x2,y2)取一条线并检查它在矩形(xR,yR)之间的交点?我在Line2D包中看到有一些交集方法,但不知道如何设置它.有人能告诉我一个正确的方法来设置它来检查交叉点(碰撞)吗?
使用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));
Run Code Online (Sandbox Code Playgroud)
这不告诉你,是......
一个矩形有 4 条线。您可以计算您的直线与矩形的 4 条直线之间的交点。
给定两条直线的方程,当 x 和 y 相等时,它们将相交。
y = m1x + b1 y = m2x + b2
解方程你应该得到:
x = b2 - b1 / (m1 - m2);
请注意,如果 m1 == m2,则直线是平行的并且永远不会相交,在这种情况下请注意除以 0。
然后,由于您处理的线段大于无限线,请检查线段内的相交是否脱落(检查 X 和 Y 是否都在每个线段的边界内)。
小智 5
如果直线不相交,则返回 null。修改了对类似问题的另一个回答中的一些c代码,使其成为Java。没有费心去研究它是如何/为什么工作的,但它确实完成了我需要的工作。
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16380 次 |
| 最近记录: |