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

Reply via email to