gpt4 book ai didi

java - 检查与直线和矩形的碰撞

转载 作者:行者123 更新时间:2023-11-30 11:11:22 24 4
gpt4 key购买 nike

是否可以使用 Area 对象检查与线的碰撞?

目前我这样做的方式不起作用:

当您运行它时,它会返回 false。但是这条线非常清晰地接触到矩形,事实上它完全在里面。

import java.awt.Rectangle;
import java.awt.geom.Area;
import java.awt.geom.Line2D;

public class collision {

public static void main(String[] args) {

Area area1 = new Area(new Rectangle(0, 0, 100, 100));
Area area2 = new Area(new Line2D.Double(0, 0, 100, 100));

System.out.println(isColliding(area1, area2));
}

public static boolean isColliding(Area area1, Area area2) {
if (area2 != null) {
Area collide1 = new Area(area1);
collide1.subtract(area2);
if (!collide1.equals(area1)) {
return true;
}
}

return false;

}

}

最佳答案

我能够通过创建一个检查事物沿线点的递归函数来解决这个问题。您设置的深度越高,检查的准确性就越高,但完成所需的时间也会越长。我一直使用 10 作为我的深度(我相信它沿线检查了 2047 个点)并且我没有遇到任何性能损失。除非您的 Area 对象包含非常薄的部分,否则我认为您需要的不会比这更多。

如果您认为可以以任何方式改进我的方法,请随时发表评论和修改:)

感谢 ajb 关于使用 PathIterator 的建议,这让我产生了沿线检查点的想法。

public static boolean findPoints(Area area1, Line2D line1, int depth) {

Point p1 = new Point((int) (line1.getX2() + line1.getX1()) / 2,
(int) (line1.getY2() + line1.getY1()) / 2);

if (depth == 0) {
return false;
}

pointMiddle = new Point(p1);
if (area1.contains(p1)) {
return true;

} else {
return findPoints(area1, new Line2D.Double(p1, line1.getP2()),
depth - 1)
|| findPoints(area1, new Line2D.Double(line1.getP1(), p1),
depth - 1);
}

}

关于java - 检查与直线和矩形的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27454386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com