Hello,

> I'm working on a wood working design and manufacturing software based on 
> Trimble Sketchup.
> What i'm planning currently, is trying to move some board connecting 
> detection from Sketchup
> plugin side ( based on some Sketchup 3D api in ruby ) to server side (in 
> java, of course). Commons
> Geometry is the best 3D lib i can find in java world.

Glad to hear it! Feel free to report any bugs you find or features you
feel would be useful on JIRA [1]. Good luck on your project!

Regards,
Matt J

[1] https://issues.apache.org/jira/projects/GEOMETRY

On Sat, Sep 17, 2022 at 10:57 PM Bai Song <baisongm...@163.com> wrote:
>
> Hi,
>
>
>   Alex, thanks for your reply, saved me a lot of time!
>
>
>   Matt, thanks for your detailed demo of 3D pop down to 2D, this helps me a 
> lot! I'll do more trial in
>
> this way.
>
>
>
>   I'm working on a wood working design and manufacturing software based on 
> Trimble Sketchup.
>
> What i'm planning currently, is trying to move some board connecting 
> detection from Sketchup
>
> plugin side ( based on some Sketchup 3D api in ruby ) to server side (in 
> java, of course). Commons
>
> Geometry is the best 3D lib i can find in java world.
>
>
>
>   Thanks again for your work!
>
>
> Regards,
> Bai Song
>
> At 2022-09-17 10:58:33, "Matt Juntunen" <matt.a.juntu...@gmail.com> wrote:
> >Hello,
> >
> >Alex is correct in that the intersection operation you are attempting
> >to perform will only work in 2D. When you constructed bsp1 and bsp2
> >from the faces, what you ended up with was 2 half spaces of infinite
> >size.
> >
> >        List<ConvexPolygon3D> list1 = new ArrayList<>();
> >        list1.add(face1);
> >        RegionBSPTree3D bsp1 = RegionBSPTree3D.from(list1); // this is
> >an infinite half space
> >
> >        List<ConvexPolygon3D> list2 = new ArrayList<>();
> >        list2.add(face2);
> >        RegionBSPTree3D bsp2 = RegionBSPTree3D.from(list2); // this is
> >also an infinite half-space and is actually identical to the first one
> >
> >(The reason for this has to do with the way BSP trees represent
> >regions. I suggest taking a look at the BSP tree tutorial on the
> >commons-geometry site [1].)
> >
> >The intersection of those two infinite half-spaces is itself an
> >infinite half-space. Regions of infinite size do not have a defined
> >centroid, which is why the centroid in your example is null.
> >
> >In order to compute the intersection of the two polygons in your
> >example, we have to use 2D space. We can either do the entire thing in
> >2D (as Alex demonstrated), or we can start in 3D and pop down to 2D
> >when needed. This is the approach that I will show here. We'll start
> >with the same 3D convex polygons that you had:
> >
> >        List<Vector3D> pts1 = Arrays.asList(
> >                Vector3D.of(0, 10, 0),
> >                Vector3D.of(30, 10, 0),
> >                Vector3D.of(30, 20, 0),
> >                Vector3D.of(0, 20, 0));
> >        ConvexPolygon3D face1 = Planes.convexPolygonFromVertices(pts1,
> >precision);
> >
> >        List<Vector3D> pts2 = Arrays.asList(
> >                Vector3D.of(10, 0, 0),
> >                Vector3D.of(20, 0, 0),
> >                Vector3D.of(20, 30, 0),
> >                Vector3D.of(10, 30, 0));
> >        ConvexPolygon3D face2 = Planes.convexPolygonFromVertices(pts2,
> >precision);
> >
> >Now, in order to perform the 2D intersection, we will first access the
> >2D geometries that are embedded in the 3D planes of the
> >ConvexPolygon3D instances. You can picture a ConvexPolygon3D (and any
> >other PlaneSubset subclass) as a 2D sticker stuck to a pane of glass
> >(the infinite 3D plane). In the lines below, we are extracting the 2D
> >"sticker" in order to work with it directly.
> >
> >        ConvexArea area1 = face1.getEmbedded().getSubspaceRegion();
> >        ConvexArea area2 = face2.getEmbedded().getSubspaceRegion();
> >
> >We can now compute the intersection in 2D:
> >
> >        RegionBSPTree2D areaBsp = RegionBSPTree2D.empty();
> >        areaBsp.intersection(area1.toTree(), area2.toTree());
> >
> >This gives us a finite 2D region with the expected centroid:
> >
> >        Vector2D centroid2d = areaBsp.getCentroid();
> >        System.out.println(centroid2d); // prints (15.000000000000002,
> >-15.000000000000002)
> >
> >If we wish to take this 2D centroid back up to 3D, we can again use
> >the subspace embedding information from the faces. In this case, we
> >only need to use one of the faces:
> >
> >        Vector3D centroid3d = face1.getEmbedded().toSpace(centroid2d);
> >        System.out.println(centroid3d); // prints (15.000000000000002,
> >15.000000000000002, 0.0)
> >
> >I hope this helps. Thank you for your interest in this project and
> >feel free to reach out if you have any more questions.
> >
> >Regards,
> >Matt J
> >
> >[1] 
> >https://commons.apache.org/proper/commons-geometry/tutorials/bsp-tree.html
> >
> >On Fri, Sep 16, 2022 at 6:10 AM Alex Herbert <alex.d.herb...@gmail.com> 
> >wrote:
> >>
> >> This may be related to the fact that you are using the 3D API with 2D
> >> areas. Since the shapes have no volume the intersection may not be defined.
> >>
> >> This does work as expected in 2D:
> >>
> >>         Precision.DoubleEquivalence precision =
> >> Precision.doubleEquivalenceOfEpsilon(1e-6);
> >>
> >>         List<Vector2D> pts1 = new ArrayList<>();
> >>         pts1.add(Vector2D.of(0, 10));
> >>         pts1.add(Vector2D.of(30, 10));
> >>         pts1.add(Vector2D.of(30, 20));
> >>         pts1.add(Vector2D.of(0, 20));
> >>         ConvexArea face1 = ConvexArea.convexPolygonFromVertices(pts1,
> >> precision);
> >>
> >>         List<Vector2D> pts2 = new ArrayList<>();
> >>         pts2.add(Vector2D.of(10, 0));
> >>         pts2.add(Vector2D.of(20, 0));
> >>         pts2.add(Vector2D.of(20, 30));
> >>         pts2.add(Vector2D.of(10, 30));
> >>         ConvexArea face2 = ConvexArea.convexPolygonFromVertices(pts2,
> >> precision);
> >>
> >>         RegionBSPTree2D bsp1 = RegionBSPTree2D.from(face1.getBoundaries());
> >>
> >>         RegionBSPTree2D bsp2 = RegionBSPTree2D.from(face2.getBoundaries());
> >>
> >>         RegionBSPTree2D result = RegionBSPTree2D.empty();
> >>         result.intersection(bsp1, bsp2);
> >>
> >>         System.out.println("Hello, Geometry! Centroid: " +
> >> result.getCentroid());
> >>
> >> Result:
> >>
> >>         Hello, Geometry! Centroid: (15.000000000000002, 15.000000000000002)
> >>
> >> There may be a setting for the 3D equivalent to allow intersections on the
> >> plane to be returned. I could not find anything obvious in the API.
> >>
> >> Regards,
> >>
> >> Alex
> >>
> >>
> >>
> >> On Fri, 16 Sept 2022 at 10:03, Bai Song <baisongm...@163.com> wrote:
> >>
> >> > Hi, Geometry Team
> >> >
> >> > I'm learning this interesting project and facing some difficulties when i
> >> > did a little experiment.
> >> >
> >> > I created two ConvexPolygon3D instances (2 white rectangles in below
> >> > image) on the same plane, and try to get the overlaping area(blue part) 
> >> > by
> >> > RegionBSPTree3D intersection operation.
> >> >
> >> >
> >> > But i got null when getting the centroid of the intersection. It looks
> >> > that this test of intersection failed.
> >> > Could you tell me how can i fix this?
> >> >
> >> > Thanks for your contribution to this project!
> >> >
> >> > //---------my test codes----------
> >> > public class TestIntersection
> >> > {
> >> >     public static void main(String args[])
> >> >     {
> >> >         Precision.DoubleEquivalence precision =
> >> > Precision.doubleEquivalenceOfEpsilon(1e-6);
> >> >
> >> >         List<Vector3D> pts1 = new ArrayList<>();
> >> >         pts1.add(Vector3D.of(0, 10, 0));
> >> >         pts1.add(Vector3D.of(30, 10, 0));
> >> >         pts1.add(Vector3D.of(30, 20, 0));
> >> >         pts1.add(Vector3D.of(0, 20, 0));
> >> >         ConvexPolygon3D face1=Planes.convexPolygonFromVertices(pts1,
> >> > precision);
> >> >
> >> >         List<Vector3D> pts2 = new ArrayList<>();
> >> >         pts2.add(Vector3D.of(10, 0, 0));
> >> >         pts2.add(Vector3D.of(20, 0, 0));
> >> >         pts2.add(Vector3D.of(20, 30, 0));
> >> >         pts2.add(Vector3D.of(10, 30, 0));
> >> >         ConvexPolygon3D face2 = Planes.convexPolygonFromVertices(pts2,
> >> > precision);
> >> >
> >> >         List<ConvexPolygon3D> list1 = new ArrayList<>();
> >> >         list1.add(face1);
> >> >         RegionBSPTree3D bsp1 = RegionBSPTree3D.from(list1);
> >> >
> >> >         List<ConvexPolygon3D> list2 = new ArrayList<>();
> >> >         list2.add(face2);
> >> >         RegionBSPTree3D bsp2 = RegionBSPTree3D.from(list2);
> >> >
> >> >         RegionBSPTree3D result = RegionBSPTree3D.empty();
> >> >         result.intersection(bsp1, bsp2);
> >> >
> >> >         System.out.println("Hello, Geometry! Centroid:
> >> > "+result.getCentroid()); //expect (15,15,0), but got null actually
> >> >     }
> >> > }
> >> >
> >> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
> >For additional commands, e-mail: user-h...@commons.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to