Page 1 of 2 12 LastLast
Results 1 to 10 of 14

Thread: BeRoTriangulation - A robust 2D polygon triangulator for simple and complex polygons

  1. #1

    BeRoTriangulation - A robust 2D polygon triangulator for simple and complex polygons

    I do want to share my useful BeRoTriangulation unit here. It's a robust 2D polygon triangulator for non-realtime-usages (or with caching on load time) by combining non-constrained delaunay triangulation with the Bowyer–Watson algorithm as first pass with polygon clipping as middle pass and ear clipping as final pass, so it supports even self-intersecting polygon with holes as input and not just only simple polygons.

    It needs and uses the Clipper library from http://www.angusj.com/delphi/clipper.php for the polygon clipping work.

    And it contains also a second seidel-algorithm-based non-robust variant for realtime-usages.

    And here is the link: http://rootserver.rosseaux.net/stuff...angulation.pas

    It's licensed under the Boost Software License.

    So have a lot fun with it

    Edit:

    I've updated the BeRoTriangulation.pas again, so the unit contains four different triangulator implementation variants:

    Code:
    // The flexible semi-robust variant by my own scanline-rasterization-like sweeping algoritm. Algorithm steps:
    // 1. Add edges from input polygons
    // 2. Split intersecting edges
    // 3. Split edges at Y coordinates of all polygon points including these of intersection edge intersection points
    // 4. Construct y-monotone quads with a trapezoid-style shape with scanline-rasterization-like sweeping from
    //    top to bottom and from left to right with the wished polygon fill rule
    // 5. Optimize and merge the output from step 4. as far as possible
    // This variant is still experimental, so do use this function variant on your own risk! :-)
    // It works already pretty good, but it is still in progress.
    function TriangulateBeRo(const InputPolygons:TBeRoTriangulationPolygons;var OutputTriangles:TBeRoTriangulationTriangles;InputPolygonFillRule:TBeRoTriangulationPolygonFillRule=btpfrEVENODD;Quality:longint=$7fffffff):boolean;
    Code:
    // Slow bruteforce-style very robust variant with delaunay algorithm, clipping and earclipping for non-realtime usages
    // A robust 2D polygon triangulator by combining non-constrained delaunay triangulation as first pass with polygon
    // clipping as middle pass and ear clipping as final pass, so it supports even self-intersecting polygon with holes
    // as input. It needs and uses the Clipper library from http://www.angusj.com/delphi/clipper.php for the polygon
    // clipping work.
    // It doesn't support the btpfrABSGEQTWO polygon fill rule, and the output depends on the correctness/accuracy of the
    // 3rd-party clipper library
    function TriangulateDelaunayClipping(const InputPolygons:TBeRoTriangulationPolygons;var OutputTriangles:TBeRoTriangulationTriangles;InputPolygonFillRule:TBeRoTriangulationPolygonFillRule=btpfrEVENODD):boolean;
    Code:
    // Faster non-robust variant with seidel algorithm for realtime usages
    // It supports only the even-odd polygon fill rule in this current implementation, and it can handle only simple polygons (with and without holes)
    function TriangulateSeidel(const InputPolygons:TBeRoTriangulationPolygons;var OutputTriangles:TBeRoTriangulationTriangles):boolean;
    Code:
    // Faster non-robust variant with ear clipping algorithm for realtime usages
    // It can handle only non-self-intersecting simple polygons without holes
    function TriangulateEarClipping(const InputPolygon:TBeRoTriangulationPolygon;var OutputTriangles:TBeRoTriangulationTriangles):boolean;
    with the fill rules:

    Code:
         TBeRoTriangulationPolygonFillRule=(btpfrEVENODD,btpfrNONZERO,btpfrPOSITIVE,btpfrNEGATIVE,btpfrABSGEQTWO);
    The TriangulateBeRo variant does support all from gluTess known polygon fill rules: evenodd, nonzero, positive, negative and abs_geq_two

    TriangulateBeRo is the best flexible and robust variant, followed by TriangulateDelaunayClipping. But TriangulateDelaunayClipping is depending on the correctness/accuracy of the 3rd-party clipper library. TriangulateSeideland TriangulateEarClipping are faster non-robust triangulation functions for faster usages for example for realtime stuff.
    Last edited by BeRo; 14-10-2014 at 12:18 AM.

  2. #2
    thank you, it can be usefull for my projects

  3. #3
    BeRo does it again
    Nice dude

  4. #4
    umm.. and what's the use for it?

  5. #5
    Triangualtion is used in programaticaly creating 2D polygons made from triangles when all you have is just basic imput data like a shape outline of the specific polygon.
    It is also commonly used in image vectoriaztion (converting raster image into verctor based image).

  6. #6
    Quote Originally Posted by laggyluk View Post
    umm.. and what's the use for it?
    For example for to draw 2D polygons with OpenGL without external gluTess or another external 3rd Triangulation library.

  7. #7
    Quote Originally Posted by SilverWarior View Post
    Triangualtion is used in programaticaly creating 2D polygons made from triangles when all you have is just basic imput data like a shape outline of the specific polygon.
    It is also commonly used in image vectoriaztion (converting raster image into verctor based image).
    The common image vectorization algorithms are working without triangulation, like my unreleased but for-usage-ready image vectorization algorithm, which I've implemented some years ago. They (at least my algorithm) are working per color image quantization and then greedy from the outside inwards colorwise image contour path tracing together with incremental color plane flipping toward into the inner contour paths.
    Last edited by BeRo; 08-10-2014 at 11:22 AM.

  8. #8

  9. #9
    Quote Originally Posted by BeRo View Post
    The common image vectorization algorithms are working without triangulation, like my unreleased but for-usage-ready image vectorization algorithm, which I've implemented some years ago. They (at least my algorithm) are working per color image quantization and then greedy from the outside inwards colorwise image contour path tracing together with incremental color plane flipping toward into the inner contour paths.
    Wel I gues that then I haven't tried to use the most common approach when I was trying to implement image vectorization myself some ten years ago.
    In the approach I used I first tried to convert the raster image into a scetch like image (just lines representing objects shapes) and then I was applying a triangualization algorithm to that scetch image.
    It worked half of the time which was a huge sucses at that time for me. But I never figured out why it doesen't always works since I didn't know wheter the cause for that might be either in my "scetchink" code or the triangualization code which wasn't mine.
    Anywhay after some time I lost interest in that firstly becouse it didn't always work and I had no diea why. Frankly even now I don't know how I managed to make it work even those half times.
    Another reason why I lost interest in that is becouse it was extreemly slow. Why it was slow? Becouse at that time I was still working with Canvas.Pixel-s. And what is worse I was working with Images instead of bitmaps which made everything even worse.

  10. #10
    PGD Staff / News Reporter phibermon's Avatar
    Join Date
    Sep 2009
    Location
    England
    Posts
    524
    Do you know how many years I've been looking for tessellation lib I can compile in without using GLU? this is awesome!

    Now you're versed in the techniques, can you give me some keywords or your thinking on how to make this viable for 3D geometry? I'm guessing a 3D lib for constructive solid geometry similar to what clipper does for 2D would be needed first?

    I've studied the source to the GLU tesselator and I'm thinking of doing a pascal port so I can tessellate on platforms without GLU
    When the moon hits your eye like a big pizza pie - that's an extinction level impact event.

Page 1 of 2 12 LastLast

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •