如何从jbox2d中的主体获取一半的宽度和一半的高度

问题描述 投票:2回答:2

所以我的主体是矩形。如何获得半高和半高?(在其他任何地方都找不到答案)

java entity rectangles jbox2d
2个回答
1
投票

[不幸的是,由于Box2D(因此还有JBox2D)本身没有任何矩形的概念,因此并不是很简单。矩形是PolygonShape,其形状可能是使用setAsBox(halfWidth, halfHeight)指定的。

要在创建halfWidth之后获得halfHeightFixture,请考虑以下内容(请根据需要对其进行重构):

public void checkOutThisFixture(Fixture fixture) {
    Shape fixtureShape = fixture.getShape();
    if (fixtureShape instanceof PolygonShape) {
        PolygonShape polygonShape = (PolygonShape) fixtureShape;
        Float minX = null;
        Float maxX = null;
        Float minY = null;
        Float maxY = null;
        for (int i = 0; i < polygonShape.getVertexCount(); i++) {
            Vec2 nextVertex = polygonShape.getVertex(i);
            float x = nextVertex.x;
            float y = nextVertex.y;
            if (minX == null || x < minX) {
                minX = x;
            }
            if (maxX == null || x > maxX) {
                maxX = x;
            }
            if (minY == null || y < minY) {
                minY = y;
            }
            if (maxY == null || y > maxY) {
                maxY = y;
            }
        }
        float width = maxX - minX;
        float height = maxY - minY;
        float halfWidth = width / 2;
        float halfHeight = height / 2;
        System.out.println("The polygon has half width & height of: " + halfWidth + " & " + halfHeight);
    } else if (fixtureShape instanceof CircleShape) {
        float radius = ((CircleShape) fixtureShape).m_radius;
        System.out.println("The circle has a radius of : " + radius);
    } else {
        // TODO handle other shapes
    }
}

要从Body获取此信息,请使用:

public void checkOutTheseFixtures(Body body) {
    for (Fixture fixture = body.getFixtureList(); fixture != null; fixture = fixture.getNext()) {
        checkOutThisFixture(fixture);
    }
}

和一些测试:

World world = new World(new Vec2(0, 0), true);
Body body = world.createBody(new BodyDef());

// Add a circle
CircleShape circle = new CircleShape();
circle.m_radius = 20;
body.createFixture(circle, 5);

// Add a box
PolygonShape rectangle = new PolygonShape();
rectangle.setAsBox(137, 42);
body.createFixture(rectangle, 10);

// Add a more complex polygon
PolygonShape polygon = new PolygonShape();
Vec2[] vertices = new Vec2[5];
vertices[0] = new Vec2(-1, 2);
vertices[1] = new Vec2(-1, 0);
vertices[2] = new Vec2(0, -3);
vertices[3] = new Vec2(1, 0);
vertices[4] = new Vec2(1, 1);
polygon.set(vertices, 5);
body.createFixture(polygon, 10);

checkOutTheseFixtures(body);

打印:

多边形的半高和半高分别为:1.0和2.5

多边形的一半宽度和高度为:137.0和42.0

圆的半径为:20.0

希望有所帮助。


类似地,这是获取PolygonShape尺寸的简洁方法:

  public static Vec2 getDimensions( final PolygonShape shape ) {
    float minX = Float.MAX_VALUE;
    float maxX = Float.MIN_VALUE;
    float minY = Float.MAX_VALUE;
    float maxY = Float.MIN_VALUE;

    final int vertices = shape.getVertexCount();

    for( int i = 0; i < vertices; i++ ) {
      final Vec2 v = shape.getVertex( i );

      minX = (v.x < minX) ? v.x : minX;
      maxX = (v.x > maxX) ? v.x : maxX;
      minY = (v.y < minY) ? v.y : minY;
      maxY = (v.y > maxY) ? v.y : maxY;
    }

    return new Vec2( maxX - minX, maxY - minY );
  }

将返回的Vec2的尺寸除以一半也将获得所需的值。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.