Hello.

Le mer. 17 juin 2020 à 04:22, Matt Juntunen
<matt.juntu...@hotmail.com> a écrit :
>
> 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;
> }

Would this belong to the user guide?

Regards,
Gilles

> 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

Reply via email to