gpt4 book ai didi

java - LIBGDX 多边形和直线在哪里碰撞?

转载 作者:行者123 更新时间:2023-12-01 10:18:16 25 4
gpt4 key购买 nike

我想得到多边形和直线碰撞的点。我知道有一个名为 Intersector 的类,但其中只有一种方法用于检查它们是否碰撞,但我需要它们碰撞的点。

我很高兴得到任何帮助

public static List<RayTrace> rayTrace(Line2D line, boolean quick, Collisions... collisions) {
List<RayTrace> l = new ArrayList<RayTrace>();
for (Collisions collisions1 : collisions) {
for (Collision3D collision3D : collisions1) {
RayTrace rayTrace = new RayTrace();
if (quick) {
if (Intersector.intersectLinePolygon(line.getStartV(), line.getEndV(), collision3D.getBoundingPolygon())) {
rayTrace.collisionHit = collision3D;
rayTrace.hasHit = true;
l.add(rayTrace);
}
} else {
Point2f hit = new Point2f();
if (CollisionHelper.getLinePolygonIntersection(collision3D.getBoundingPolygon(), line, hit)) {
rayTrace.collisionHit = collision3D;
rayTrace.hasHit = true;
rayTrace.hitX = hit.x;
rayTrace.hitZ = hit.y;
l.add(rayTrace);
}
}
}
}
return l;
}

public static List<Vector2> getLinePolygonIntersections(Polygon polygon, Line2D line) {
float f[] = polygon.getTransformedVertices();
//Go through every side
List<Vector2> intersections = new ArrayList<Vector2>();
for (int i = 0; i < f.length - 2; i += 2) {
Vector2 intersection = new Vector2();
Intersector.intersectLines(line.x, line.y, line.x2, line.y2, f[i], f[i + 1], f[i + 2], f[i + 3], intersection);
intersections.add(intersection);
}
return intersections;
}

public static boolean getLinePolygonIntersection(@NotNull Polygon polygon, @NotNull Line2D line, @NotNull Point2f point) {
List<Vector2> list = getLinePolygonIntersections(polygon, line);
if (list.size() == 0) return false;
double shortestDistance = line.getStart().distance(new Point2f(list.get(0).x, list.get(0).y));
int indexClosest = 0;
for (int i = 1; i < list.size(); i++) {
double d = new Point2f(list.get(i).x, list.get(i).y).distance(line.getStart());
if (shortestDistance > d) {
indexClosest = i;
shortestDistance = d;
}
}
point.set(list.get(indexClosest).x, list.get(indexClosest).y);
return true;
}

最佳答案

以下是 LibGDX Intersector 类中可以修改的方法:

public static boolean intersectLinePolygon (Vector2 p1, Vector2 p2, Polygon polygon) {
float[] vertices = polygon.getTransformedVertices();
float x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y;
int n = vertices.length;
float x3 = vertices[n - 2], y3 = vertices[n - 1];
for (int i = 0; i < n; i += 2) {
float x4 = vertices[i], y4 = vertices[i + 1];
float d = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
if (d != 0) {
float yd = y1 - y3;
float xd = x1 - x3;
float ua = ((x4 - x3) * yd - (y4 - y3) * xd) / d;
if (ua >= 0 && ua <= 1) {
return true;
}
}
x3 = x4;
y3 = y4;
}
return false;
}

这个方法实际上做的是找到从p1到p2的线段与多边形边缘的交点。 (特别是,确定给定线段线段之间是否存在交集,这在后面很重要。)特别是,正在对这两条线段的参数方程进行计算;例如,从 (x1,y1) 到 (x2,y2) 的线线段具有参数方程

L(t) = [ x2-x1, y2-y1 ] * t + [ x1, y1 ] 

其中 t 的范围为 0 到 1。

线的交点是使用克莱默法则计算的;上面的变量 d 代表该公式分母中出现的矩阵的行列式。当d非零时,保证线之间存在交集,但是我们还没有完成,因为我们对线段的交集感兴趣。当相交发生时,方法中的变量 ua 产生上述参数方程中 t 的值;它必须介于 0 和 1 之间,交点才能位于线段端点之间。

因此,当t = ua时,可以通过计算L(t)来计算交点的坐标。因此,为了找到交点,您可以创建您自己的函数版本来返回值

vector 2((x2-x1)*ua + x1,(y2-y1)*ua + y1)

希望这有帮助!

关于java - LIBGDX 多边形和直线在哪里碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35781893/

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