代码之家  ›  专栏  ›  技术社区  ›  Intektor

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

  •  0
  • Intektor  · 技术社区  · 9 年前

    我想得到多边形和直线碰撞的点。我知道有一个名为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;
    }
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Stemkoski    9 年前

    以下是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之间,才能位于线段的端点之间。

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

    Vector2( (x2-x1)*ua + x1, (y2-y1)*ua + y1)

    希望这有帮助!

        2
  •  0
  •   Xvolks    9 年前

    IMHO:在Intersector类中,许多方法计算碰撞,通常最后一个参数是填充了碰撞坐标的Vector3。

    我从未使用过这个图书馆,但乍一看,它就是这样工作的。