@Override public boolean checkIfInside(double x, double y, double z, Point3D intersectionToPack, Vector3D normalToPack) { tempPoint3dForCheckInside.setX(x); tempPoint3dForCheckInside.setY(y); tempPoint3dForCheckInside.setZ(z); boolean isPointInside = planarRegion.isPointOnOrSlightlyBelow(tempPoint3dForCheckInside, allowablePenetrationThickness); if (isPointInside) { if (intersectionToPack != null) { intersectionToPack.set(tempPoint3dForCheckInside); } if (normalToPack != null) { planarRegion.getNormal(normalToPack); } } return isPointInside; }
@ContinuousIntegrationTest(estimatedDuration = 0.4) @Test(timeout = 30000) public void testIsPointOnOrSlightlyBelow() { Random random = new Random(1776L); RigidBodyTransform transformToWorld = new RigidBodyTransform(); Point3D regionTranslation = new Point3D(); Point3D pointAbove = new Point3D(); Point3D pointBelow = new Point3D(); Vector3D regionNormal = new Vector3D(); for (int i = 0; i < 10000; i++) { PlanarRegion planarRegion = PlanarRegion.generatePlanarRegionFromRandomPolygonsWithRandomTransform(random, 1, 10.0, 5); planarRegion.getTransformToWorld(transformToWorld); Point2DReadOnly centroid = planarRegion.getLastConvexPolygon().getCentroid(); regionTranslation.set(centroid.getX(), centroid.getY(), 0.0); transformToWorld.transform(regionTranslation); regionTranslation.setZ(planarRegion.getPlaneZGivenXY(regionTranslation.getX(), regionTranslation.getY())); planarRegion.getNormal(regionNormal); regionNormal.normalize(); regionNormal.scale(1e-6); pointAbove.add(regionTranslation, regionNormal); pointBelow.sub(regionTranslation, regionNormal); assertTrue(planarRegion.isPointOnOrSlightlyBelow(pointBelow, 1e-5)); assertFalse(planarRegion.isPointOnOrSlightlyBelow(pointAbove, 1e-5)); } }
planarRegion.getNormal(planarRegionSurfaceNormal); if (planarRegion.isPointOnOrSlightlyBelow(randomPoint, DEFAULT_ALLOWABLE_PENETRATION_THICKNESS))