Hi Matt, yes !!! My refactoring is done. All the tests work fine.
(I have added one example of a non-convex structure (horseshoe)) Thank you. Regards. Sven /* ------------------------+ | | | | | | | +----------------| | | | | x (1.5, 1.5, 0.5) Outside | |-----------------+ | | | | +---------------------+ */ @Test public void outsideHorseshoe() { List< Vector2D > vertices2D = new ArrayList<>(); // some kind of a horseshoe vertices2D.add( Vector2D.of( 0, 0 ) ); vertices2D.add( Vector2D.of( 3, 0 ) ); vertices2D.add( Vector2D.of( 3, 1 ) ); vertices2D.add( Vector2D.of( 1, 1 ) ); vertices2D.add( Vector2D.of( 1, 2 ) ); vertices2D.add( Vector2D.of( 3, 2 ) ); vertices2D.add( Vector2D.of( 3, 3 ) ); vertices2D.add( Vector2D.of( 0, 3 ) ); RegionBSPTree3D horseshoe = createPrism( vertices2D, 1, 0 ); assertFalse( horseshoe.contains( Vector3D.of( 1.5, 1.5, 0.5 ) ) ); } On 6/17/20 4:21 AM, Matt Juntunen wrote:
Hi Sven, If the createVertices and createFacets methods don't construct convex polygons then perhaps you could bypass them completely and just construct the tree directly from the boundaries. Assuming that I understand your use case correctly, the following methods should do what you want: private RegionBSPTree3D createPrism(List<Vector2D> polygon, double upperBound, double lowerBound, DoublePrecisionContext precision) { EmbeddingPlane plane = Planes.fromPointAndPlaneVectors(Vector3D.of(0, 0, lowerBound), Vector3D.Unit.PLUS_X, Vector3D.Unit.PLUS_Y, precision); Vector3D extrudeVector = plane.getNormal().withNorm(upperBound - lowerBound); return extrudePolygon(polygon, plane, extrudeVector, precision); } private RegionBSPTree3D extrudePolygon(List<Vector2D> polygon, EmbeddingPlane plane, Vector3D extrudeVector, DoublePrecisionContext precision) { List<Vector3D> basePoints = plane.toSpace(polygon); List<Vector3D> extrudedPoints = basePoints.stream() .map(extrudeVector::add) .collect(Collectors.toList()); RegionBSPTree3D tree = RegionBSPTree3D.empty(); // treat the plane as the top and the extruded plane as the bottom; // we'll invert the tree at the end if needed tree.insert(plane.span()); // top tree.insert(Planes.fromPointAndNormal( plane.getOrigin().add(extrudeVector), plane.getNormal().negate(), precision).span()); // bottom // create the sides of the prism int size = polygon.size(); for (int i = 0; i < size; ++i) { tree.insert(Planes.convexPolygonFromVertices(Arrays.asList( basePoints.get(i), extrudedPoints.get(i), extrudedPoints.get((i + 1) % size), basePoints.get((i + 1) % size) ), precision)); } // complement the tree if the "top" wasn't actually the top if (plane.getNormal().dot(extrudeVector) > 0) { tree.complement(); } return tree; } Note that these methods assume that the polygon contains at least 3 unique vertices, the first vertex is not repeated at the end, and that the upper and lower bounds are not equal. Hopefully this helps. Regards, Matt ________________________________ From: Sven Rathgeber<sven.rathge...@web.de> Sent: Tuesday, June 16, 2020 3:46 AM To: Commons Developers List<dev@commons.apache.org> Subject: Re: [geometry] Transition from PolyhedronSet to ??? (RegionBSPTree3D ?) Hi Matt, > 2. Yes, the LinecastPoint3D object that you get from linecasting contains the intersection point as well as the surface normal at the point of intersection. thanks - that did the job and I could do the whole refactoring, but the tests fail. We used the PolyHedronsSet to model non-convex regions and that worked well. Now the "indexedConvexPolygons" is strict and forbids that (walk your talk :) ). Is there a way to handle non-convex regions ? Regards, Sven --------------------------------------------------------------------- To unsubscribe, e-mail:dev-unsubscr...@commons.apache.org For additional commands, e-mail:dev-h...@commons.apache.org
--------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org