You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Bai Song <ba...@163.com> on 2022/09/16 09:03:12 UTC

[geometry] How to get the intersection face from two overlaping ConvexPolygon3D instances?

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
    }
}


Re: Re: [geometry] How to get the intersection face from two overlaping ConvexPolygon3D instances?

Posted by Matt Juntunen <ma...@gmail.com>.
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 <ba...@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" <ma...@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 <al...@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 <ba...@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-unsubscribe@commons.apache.org
> >For additional commands, e-mail: user-help@commons.apache.org

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


Re:Re: [geometry] How to get the intersection face from two overlaping ConvexPolygon3D instances?

Posted by Bai Song <ba...@163.com>.
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" <ma...@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 <al...@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 <ba...@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-unsubscribe@commons.apache.org
>For additional commands, e-mail: user-help@commons.apache.org

Re: [geometry] How to get the intersection face from two overlaping ConvexPolygon3D instances?

Posted by Matt Juntunen <ma...@gmail.com>.
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 <al...@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 <ba...@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-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Re: [geometry] How to get the intersection face from two overlaping ConvexPolygon3D instances?

Posted by Alex Herbert <al...@gmail.com>.
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 <ba...@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
>     }
> }
>
>