@Override public BoundingBox3D getBoundingBox() { return planarRegion.getBoundingBox3dInWorld(); }
@Override public boolean isPlanarRegionCollidable(PlanarRegion query, double groundHeight, double minHeight, double maxHeight) { if (query.getBoundingBox3dInWorld().getMaxZ() < minHeight + groundHeight) return false; return maxHeight + groundHeight > query.getBoundingBox3dInWorld().getMinZ(); } };
/** * {@inheritDoc} */ @Override public boolean isClose(double x, double y, double z) { return planarRegion.getBoundingBox3dInWorld().isXYInsideInclusive(x, y); }
@ContinuousIntegrationTest(estimatedDuration = 5.0) @Test(timeout = 30000) public void testHeightAt() throws Exception { Random random = new Random(1776L); for (int i = 0; i < 100000; i++) { PlanarRegion planarRegion = PlanarRegion.generatePlanarRegionFromRandomPolygonsWithRandomTransform(random, random.nextInt(10), RandomNumbers.nextDouble(random, 0.0, 30.0), random.nextInt(10)); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); double randomXCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinX() - 10.0, boundingBox3dInWorld.getMaxX() + 10.0); double randomYCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinY() - 10.0, boundingBox3dInWorld.getMaxY() + 10.0); double randomZCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinZ() - 10.0, boundingBox3dInWorld.getMaxZ() + 10.0); PlanarRegionTerrainObject terrainObject = new PlanarRegionTerrainObject(planarRegion, DEFAULT_ALLOWABLE_PENETRATION_THICKNESS); double planarRegionZAtXY = planarRegion.getPlaneZGivenXY(randomXCoord, randomYCoord); if (planarRegion.isPointInsideByProjectionOntoXYPlane(randomXCoord, randomYCoord)) { assertEquals(planarRegionZAtXY, terrainObject.heightAt(randomXCoord, randomYCoord, randomZCoord), 1e-10); } else { assertNotEquals(planarRegionZAtXY, terrainObject.heightAt(randomXCoord, randomYCoord, randomZCoord), 1e-10); } } }
@ContinuousIntegrationTest(estimatedDuration = 4.9) @Test(timeout = 30000) public void testIsClose() throws Exception { Random random = new Random(1776L); for (int i = 0; i < 100000; i++) { PlanarRegion planarRegion = PlanarRegion.generatePlanarRegionFromRandomPolygonsWithRandomTransform(random, random.nextInt(10), RandomNumbers.nextDouble(random, 0.0, 30.0), random.nextInt(10)); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); double randomXCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinX() - 10.0, boundingBox3dInWorld.getMaxX() + 10.0); double randomYCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinY() - 10.0, boundingBox3dInWorld.getMaxY() + 10.0); double randomZCoord = RandomNumbers.nextDouble(random, boundingBox3dInWorld.getMinZ() - 10.0, boundingBox3dInWorld.getMaxZ() + 10.0); PlanarRegionTerrainObject terrainObject = new PlanarRegionTerrainObject(planarRegion, DEFAULT_ALLOWABLE_PENETRATION_THICKNESS); if (boundingBox3dInWorld.isXYInsideInclusive(randomXCoord, randomYCoord)) { assertTrue(terrainObject.isClose(randomXCoord, randomYCoord, randomZCoord)); } else { assertFalse(terrainObject.isClose(randomXCoord, randomYCoord, randomZCoord)); } } }
planarRegion.getBoundingBox3dInWorld().getMinPoint(planarRegionBoundingBoxMinPoint); planarRegion.getBoundingBox3dInWorld().getMaxPoint(planarRegionBoundingBoxMaxPoint); terrainObject.getBoundingBox().getMinPoint(terrainObjectBoundingBoxMinPoint); terrainObject.getBoundingBox().getMaxPoint(terrainObjectBoundingBoxMaxPoint);
PlanarRegion planarRegion = new PlanarRegion(regionTransform, regionConvexPolygons); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); RigidBodyTransform transformToWorld = new RigidBodyTransform(); planarRegion.getTransformToWorld(transformToWorld);
RandomNumbers.nextDouble(random, 0.0, 30.0), random.nextInt(10)); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld();
/** * Returns true if lineSegment is Obviously Outside BoundingBox. If returns true, then definitely outside. If returns false, might still be outside. * If intersects, will always return false. * @param candidateRegion * @param lineSegmentInWorld * @return */ private boolean isLineSegmentObviouslyOutsideBoundingBox(PlanarRegion candidateRegion, LineSegment2d lineSegmentInWorld) { BoundingBox3d boundingBox = candidateRegion.getBoundingBox3dInWorld(); double xMin = boundingBox.getXMin(); double yMin = boundingBox.getYMin(); double xMax = boundingBox.getXMax(); double yMax = boundingBox.getYMax(); Point2d firstEndpoint = lineSegmentInWorld.getFirstEndpoint(); Point2d secondEndpoint = lineSegmentInWorld.getSecondEndpoint(); if ((firstEndpoint.getX() < xMin) && (secondEndpoint.getX() < xMin)) return true; if ((firstEndpoint.getX() > xMax) && (secondEndpoint.getX() > xMax)) return true; if ((firstEndpoint.getY() < yMin) && (secondEndpoint.getY() < yMin)) return true; if ((firstEndpoint.getY() > yMax) && (secondEndpoint.getY() > yMax)) return true; return false; }
/** * Returns true if lineSegment is Obviously Outside BoundingBox. If returns true, then definitely * outside. If returns false, might still be outside. If intersects, will always return false. * * @param candidateRegion * @param lineSegmentInWorld * @return */ private boolean isLineSegmentObviouslyOutsideBoundingBox(PlanarRegion candidateRegion, LineSegment2D lineSegmentInWorld) { BoundingBox3D boundingBox = candidateRegion.getBoundingBox3dInWorld(); double xMin = boundingBox.getMinX(); double yMin = boundingBox.getMinY(); double xMax = boundingBox.getMaxX(); double yMax = boundingBox.getMaxY(); Point2DReadOnly firstEndpoint = lineSegmentInWorld.getFirstEndpoint(); Point2DReadOnly secondEndpoint = lineSegmentInWorld.getSecondEndpoint(); if ((firstEndpoint.getX() < xMin) && (secondEndpoint.getX() < xMin)) return true; if ((firstEndpoint.getX() > xMax) && (secondEndpoint.getX() > xMax)) return true; if ((firstEndpoint.getY() < yMin) && (secondEndpoint.getY() < yMin)) return true; if ((firstEndpoint.getY() > yMax) && (secondEndpoint.getY() > yMax)) return true; return false; }
@ContinuousIntegrationTest(estimatedDuration = 0.0) @Test(timeout = 30000) public void testCreationOfBoundingBoxWithMinimumLessThanOriginAndMaximumGreaterThanOrigin() { Point3D maxPoint = new Point3D(2.0, 2.0, 0.0); Point3D minPoint = new Point3D(-2.0, -2.0, 0.0); List<ConvexPolygon2D> regionConvexPolygons = new ArrayList<>(); ConvexPolygon2D polygon1 = new ConvexPolygon2D(); polygon1.addVertex(minPoint.getX(), minPoint.getY()); polygon1.addVertex(maxPoint.getX(), minPoint.getY()); polygon1.addVertex(minPoint.getX(), maxPoint.getY()); polygon1.addVertex(maxPoint.getX(), maxPoint.getY()); regionConvexPolygons.add(polygon1); for (ConvexPolygon2D convexPolygon : regionConvexPolygons) convexPolygon.update(); RigidBodyTransform regionTransform = new RigidBodyTransform(); PlanarRegion planarRegion = new PlanarRegion(regionTransform, regionConvexPolygons); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); RigidBodyTransform transformToWorld = new RigidBodyTransform(); planarRegion.getTransformToWorld(transformToWorld); assertThatAllPolygonVerticesAreInBoundingBox(regionConvexPolygons, planarRegion, boundingBox3dInWorld); Point3D boundingBoxMinPoint = new Point3D(); Point3D boundingBoxMaxPoint = new Point3D(); boundingBox3dInWorld.getMinPoint(boundingBoxMinPoint); boundingBox3dInWorld.getMaxPoint(boundingBoxMaxPoint); assertEquals(minPoint, boundingBoxMinPoint); assertEquals(maxPoint, boundingBoxMaxPoint); }
@ContinuousIntegrationTest(estimatedDuration = 0.0) @Test(timeout = 30000) public void testCreationOfBoundingBoxWithAllPointsGreaterThanOrigin() { final double zLocationOfPlanarRegion = 2.0; Point3D minPoint = new Point3D(1.0, 1.0, zLocationOfPlanarRegion); Point3D maxPoint = new Point3D(2.0, 2.0, zLocationOfPlanarRegion); List<ConvexPolygon2D> regionConvexPolygons = new ArrayList<>(); ConvexPolygon2D polygon1 = new ConvexPolygon2D(); polygon1.addVertex(minPoint.getX(), minPoint.getY()); polygon1.addVertex(maxPoint.getX(), minPoint.getY()); polygon1.addVertex(minPoint.getX(), maxPoint.getY()); polygon1.addVertex(maxPoint.getX(), maxPoint.getY()); regionConvexPolygons.add(polygon1); for (ConvexPolygon2D convexPolygon : regionConvexPolygons) convexPolygon.update(); RigidBodyTransform regionTransform = new RigidBodyTransform(); regionTransform.appendTranslation(0.0, 0.0, zLocationOfPlanarRegion); PlanarRegion planarRegion = new PlanarRegion(regionTransform, regionConvexPolygons); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); RigidBodyTransform transformToWorld = new RigidBodyTransform(); planarRegion.getTransformToWorld(transformToWorld); assertThatAllPolygonVerticesAreInBoundingBox(regionConvexPolygons, planarRegion, boundingBox3dInWorld); Point3D boundingBoxMinPoint = new Point3D(); Point3D boundingBoxMaxPoint = new Point3D(); boundingBox3dInWorld.getMinPoint(boundingBoxMinPoint); boundingBox3dInWorld.getMaxPoint(boundingBoxMaxPoint); assertEquals(minPoint, boundingBoxMinPoint); assertEquals(maxPoint, boundingBoxMaxPoint); }
@ContinuousIntegrationTest(estimatedDuration = 0.0) @Test(timeout = 30000) public void testCreationOfBoundingBoxWithAllPointsLessThanOrigin() { final double zLocationOfPlanarRegion = -2.0; Point3D maxPoint = new Point3D(-1.0, -1.0, zLocationOfPlanarRegion); Point3D minPoint = new Point3D(-2.0, -2.0, zLocationOfPlanarRegion); List<ConvexPolygon2D> regionConvexPolygons = new ArrayList<>(); ConvexPolygon2D polygon1 = new ConvexPolygon2D(); polygon1.addVertex(minPoint.getX(), minPoint.getY()); polygon1.addVertex(maxPoint.getX(), minPoint.getY()); polygon1.addVertex(minPoint.getX(), maxPoint.getY()); polygon1.addVertex(maxPoint.getX(), maxPoint.getY()); regionConvexPolygons.add(polygon1); for (ConvexPolygon2D convexPolygon : regionConvexPolygons) convexPolygon.update(); RigidBodyTransform regionTransform = new RigidBodyTransform(); regionTransform.appendTranslation(0.0, 0.0, zLocationOfPlanarRegion); PlanarRegion planarRegion = new PlanarRegion(regionTransform, regionConvexPolygons); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); RigidBodyTransform transformToWorld = new RigidBodyTransform(); planarRegion.getTransformToWorld(transformToWorld); assertThatAllPolygonVerticesAreInBoundingBox(regionConvexPolygons, planarRegion, boundingBox3dInWorld); Point3D boundingBoxMinPoint = new Point3D(); Point3D boundingBoxMaxPoint = new Point3D(); boundingBox3dInWorld.getMinPoint(boundingBoxMinPoint); boundingBox3dInWorld.getMaxPoint(boundingBoxMaxPoint); assertEquals(minPoint, boundingBoxMinPoint); assertEquals(maxPoint, boundingBoxMaxPoint); }
BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld();
assertTrue(planarRegion.isPolygonIntersecting(transformConvexPolygon(regionTransform, translateConvexPolygon(1.09, 1.21, convexPolygon)))); BoundingBox3D boundingBox3dInWorld = planarRegion.getBoundingBox3dInWorld(); RigidBodyTransform transformToWorld = new RigidBodyTransform(); planarRegion.getTransformToWorld(transformToWorld);