[geos-commits] [SCM] GEOS branch master updated. 7834f3237e6baf80350e9a3097b25d25f2a7dc9e

git at osgeo.org git at osgeo.org
Sat Aug 24 18:01:01 PDT 2019


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".

The branch, master has been updated
       via  7834f3237e6baf80350e9a3097b25d25f2a7dc9e (commit)
       via  6188418548ddd1bbf65c71336be0e2584909c59e (commit)
       via  25898ce7056c63e228e517f902ddb707b81a43e2 (commit)
       via  a9a93c0bd8b4594da3105c8f12f3038847e513d9 (commit)
       via  2366cc359b9f3292230bf315e0a58331a7933170 (commit)
      from  4b2f28c250cbb734605e13de3b3ceba289a438c9 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7834f3237e6baf80350e9a3097b25d25f2a7dc9e
Author: Daniel Baston <dbaston at gmail.com>
Date:   Sat Aug 24 21:00:35 2019 -0400

    NEWS updates

diff --git a/NEWS b/NEWS
index fc4a3b5..2b33375 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ Changes in 3.8.0
     holes (#748, Dan Baston)
   - Improve performance of GEOSPolygonize for cases with many or complex
     shells (Dan Baston, Martin Davis)
+  - Improve performance of Delaunay triangulations / Voronoi Diagrams
+    (Dan Baston)
+  - Improve robustness of Delaunay triangulations (Paul Ramsey, Martin Davis)
 
 
 Changes in 3.7.2

commit 6188418548ddd1bbf65c71336be0e2584909c59e
Merge: 4b2f28c 25898ce
Author: Daniel Baston <dbaston at gmail.com>
Date:   Sat Aug 24 20:59:23 2019 -0400

    Merge branch 'delaunay-perf'


commit 25898ce7056c63e228e517f902ddb707b81a43e2
Author: Daniel Baston <dbaston at gmail.com>
Date:   Wed Aug 7 20:05:13 2019 -0400

    Store visit state with each QuadEdge instead of in a set
    
    This provides a surprising performance gain

diff --git a/include/geos/triangulate/quadedge/QuadEdge.h b/include/geos/triangulate/quadedge/QuadEdge.h
index 20d7da2..0a464dc 100644
--- a/include/geos/triangulate/quadedge/QuadEdge.h
+++ b/include/geos/triangulate/quadedge/QuadEdge.h
@@ -102,6 +102,7 @@ private:
     QuadEdge* next;			  // A reference to a connected edge
     void*   data;
     bool isAlive;
+    bool visited;
 
     /**
      * Quadedges must be made using {@link makeEdge},
@@ -165,11 +166,21 @@ public:
      * @return `true` if this edge has not been deleted.
      */
     inline bool
-    isLive()
+    isLive() const
     {
         return isAlive;
     }
 
+    inline bool
+    isVisited() const
+    {
+        return visited;
+    }
+
+    inline void
+    setVisited(bool v) {
+        visited = v;
+    }
 
     /** \brief
      * Sets the connected edge
diff --git a/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h b/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
index 9b0ec27..7bd279a 100644
--- a/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
+++ b/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
@@ -99,6 +99,7 @@ private:
     Vertex frameVertex[3];
     geom::Envelope frameEnv;
     std::unique_ptr<QuadEdgeLocator> locator;
+    bool visit_state_clean;
 
 public:
     /** \brief
@@ -348,7 +349,6 @@ public:
 
 private:
     typedef std::stack<QuadEdge*> QuadEdgeStack;
-    typedef std::unordered_set<QuadEdge*> QuadEdgeSet;
     typedef std::vector<geom::CoordinateSequence*> TriList;
 
     /** \brief
@@ -359,6 +359,11 @@ private:
     QuadEdge* triEdges[3];
 
     /** \brief
+     * Resets the `visited` flag of each `QuadEdge` prior to iteration, if necessary.
+     */
+    void prepareVisit();
+
+    /** \brief
      * Stores the edges for a visited triangle. Also pushes sym (neighbour) edges
      * on stack to visit later.
      *
@@ -369,8 +374,7 @@ private:
      * @return `null` if the triangle should not be visited (for instance, if it is
      *         outer)
      */
-    QuadEdge** fetchTriangleToVisit(QuadEdge* edge, QuadEdgeStack& edgeStack, bool includeFrame,
-                                    QuadEdgeSet& visitedEdges);
+    QuadEdge** fetchTriangleToVisit(QuadEdge* edge, QuadEdgeStack& edgeStack, bool includeFrame);
 
     /** \brief
      * Gets the coordinates for each triangle in the subdivision as an array.
diff --git a/src/triangulate/quadedge/QuadEdge.cpp b/src/triangulate/quadedge/QuadEdge.cpp
index 2ab36c3..b48e136 100644
--- a/src/triangulate/quadedge/QuadEdge.cpp
+++ b/src/triangulate/quadedge/QuadEdge.cpp
@@ -89,7 +89,7 @@ QuadEdge::swap(QuadEdge& e)
     e.setDest(b.dest());
 }
 
-QuadEdge::QuadEdge() : _rot(nullptr), vertex(), next(nullptr), data(nullptr), isAlive(true)
+QuadEdge::QuadEdge() : _rot(nullptr), vertex(), next(nullptr), data(nullptr), isAlive(true), visited(false)
 { }
 
 QuadEdge::~QuadEdge()
diff --git a/src/triangulate/quadedge/QuadEdgeSubdivision.cpp b/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
index 67c8e9f..2fccbad 100644
--- a/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
+++ b/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
@@ -62,7 +62,8 @@ QuadEdgeSubdivision::getTriangleEdges(const QuadEdge& startQE,
 
 QuadEdgeSubdivision::QuadEdgeSubdivision(const geom::Envelope& env, double p_tolerance) :
     tolerance(p_tolerance),
-    locator(new LastFoundQuadEdgeLocator(this))
+    locator(new LastFoundQuadEdgeLocator(this)),
+    visit_state_clean(true)
 {
     edgeCoincidenceTolerance = tolerance / EDGE_COINCIDENCE_TOL_FACTOR;
     createFrame(env);
@@ -328,14 +329,15 @@ QuadEdgeSubdivision::getPrimaryEdges(bool includeFrame)
 {
     QuadEdgeList* edges = new QuadEdgeList();
     QuadEdgeStack edgeStack;
-    QuadEdgeSet visitedEdges;
 
     edgeStack.push(startingEdges[0]);
 
+    prepareVisit();
+
     while(!edgeStack.empty()) {
         QuadEdge* edge = edgeStack.top();
         edgeStack.pop();
-        if(visitedEdges.find(edge) == visitedEdges.end()) {
+        if(!edge->isVisited()) {
             QuadEdge* priQE = (QuadEdge*)&edge->getPrimary();
 
             if(includeFrame || ! isFrameEdge(*priQE)) {
@@ -345,8 +347,8 @@ QuadEdgeSubdivision::getPrimaryEdges(bool includeFrame)
             edgeStack.push(&edge->oNext());
             edgeStack.push(&edge->sym().oNext());
 
-            visitedEdges.insert(edge);
-            visitedEdges.insert(&edge->sym());
+            edge->setVisited(true);
+            edge->sym().setVisited(true);
         }
     }
     return std::unique_ptr<QuadEdgeList>(edges);
@@ -354,7 +356,7 @@ QuadEdgeSubdivision::getPrimaryEdges(bool includeFrame)
 
 QuadEdge**
 QuadEdgeSubdivision::fetchTriangleToVisit(QuadEdge* edge,
-        QuadEdgeStack& edgeStack, bool includeFrame, QuadEdgeSet& visitedEdges)
+        QuadEdgeStack& edgeStack, bool includeFrame)
 {
     QuadEdge* curr = edge;
     int edgeCount = 0;
@@ -368,16 +370,15 @@ QuadEdgeSubdivision::fetchTriangleToVisit(QuadEdge* edge,
 
         // push sym edges to visit next
         QuadEdge* sym = &curr->sym();
-        if(visitedEdges.find(sym) == visitedEdges.end()) {
+        if (!sym->isVisited()) {
             edgeStack.push(sym);
         }
 
         // mark this edge as visited
-        visitedEdges.insert(curr);
+        curr->setVisited(true);
 
         edgeCount++;
         curr = &curr->lNext();
-
     }
     while(curr != edge);
 
@@ -443,19 +444,29 @@ QuadEdgeSubdivision::getTriangleCoordinates(QuadEdgeSubdivision::TriList* triLis
 }
 
 void
+QuadEdgeSubdivision::prepareVisit() {
+    if (!visit_state_clean) {
+        for (auto& qe : quadEdges) {
+            qe->setVisited(false);
+        }
+    }
+
+    visit_state_clean = false;
+}
+
+void
 QuadEdgeSubdivision::visitTriangles(TriangleVisitor* triVisitor, bool includeFrame)
 {
     QuadEdgeStack edgeStack;
     edgeStack.push(startingEdges[0]);
 
-    QuadEdgeSet visitedEdges;
+    prepareVisit();
 
     while(!edgeStack.empty()) {
         QuadEdge* edge = edgeStack.top();
         edgeStack.pop();
-        if(visitedEdges.find(edge) == visitedEdges.end()) {
-            QuadEdge** p_triEdges = fetchTriangleToVisit(edge, edgeStack,
-                                    includeFrame, visitedEdges);
+        if(!edge->isVisited()) {
+            QuadEdge** p_triEdges = fetchTriangleToVisit(edge, edgeStack, includeFrame);
             if(p_triEdges != nullptr) {
                 triVisitor->visit(p_triEdges);
             }

commit a9a93c0bd8b4594da3105c8f12f3038847e513d9
Author: Daniel Baston <dbaston at gmail.com>
Date:   Mon Aug 5 20:06:58 2019 -0400

    Avoid a heap alloc / raw pointer usage

diff --git a/src/triangulate/VoronoiDiagramBuilder.cpp b/src/triangulate/VoronoiDiagramBuilder.cpp
index 21a69cd..319bffa 100644
--- a/src/triangulate/VoronoiDiagramBuilder.cpp
+++ b/src/triangulate/VoronoiDiagramBuilder.cpp
@@ -143,27 +143,23 @@ VoronoiDiagramBuilder::clipGeometryCollection(std::vector<std::unique_ptr<Geomet
     auto gfact = geoms[0]->getFactory();
 
     std::unique_ptr<geom::Geometry> clipPoly(gfact->toGeometry(&clipEnv));
-    auto clipped = make_unique<std::vector<Geometry*>>();
+    std::vector<std::unique_ptr<Geometry>> clipped;
 
     for(auto& g : geoms) {
-        std::unique_ptr<Geometry> result;
-
         // don't clip unless necessary
         if(clipEnv.contains(g->getEnvelopeInternal())) {
-            result = std::move(g);
+            clipped.push_back(std::move(g));
             // TODO: check if userData is correctly cloned here?
-        }
-        else if(clipEnv.intersects(g->getEnvelopeInternal())) {
-            result = clipPoly->intersection(g.get());
+        } else if(clipEnv.intersects(g->getEnvelopeInternal())) {
+            auto result = clipPoly->intersection(g.get());
             result->setUserData(g->getUserData()); // TODO: needed ?
-        }
-
-        if(result.get() && !result->isEmpty()) {
-            clipped->push_back(result.release());
+            if (!result->isEmpty()) {
+                clipped.push_back(std::move(result));
+            }
         }
     }
 
-    return std::unique_ptr<GeometryCollection>(gfact->createGeometryCollection(clipped.release()));
+    return gfact->createGeometryCollection(std::move(clipped));
 }
 
 } //namespace geos.triangulate

commit 2366cc359b9f3292230bf315e0a58331a7933170
Author: Daniel Baston <dbaston at gmail.com>
Date:   Mon Aug 5 14:30:42 2019 -0400

    Delaunay performance enhancements
    
    Net benefit is approximately 20% for Delaunay, 2-3% for Voronoi.
    
    - Avoid copying all triangles after construction
    - Avoid inFrame checks if result will be ignored
    - Avoid heap-allocating std::vector
    - Avoid conversions from unique_ptr to raw pointers

diff --git a/include/geos/geom/CoordinateArraySequence.h b/include/geos/geom/CoordinateArraySequence.h
index 0476ce2..4ae51ca 100644
--- a/include/geos/geom/CoordinateArraySequence.h
+++ b/include/geos/geom/CoordinateArraySequence.h
@@ -56,6 +56,10 @@ public:
     /// Construct an empty sequence
     CoordinateArraySequence();
 
+    /// Construct sequence moving from given Coordinate vector
+    CoordinateArraySequence(std::vector<Coordinate> && coords,
+                            std::size_t dimension = 0);
+
     /// Construct sequence taking ownership of given Coordinate vector
     CoordinateArraySequence(std::vector<Coordinate>* coords,
                             std::size_t dimension = 0);
diff --git a/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h b/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
index 9224542..9b0ec27 100644
--- a/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
+++ b/include/geos/triangulate/quadedge/QuadEdgeSubdivision.h
@@ -458,7 +458,7 @@ public:
      * @param geomFact a geometry factory
      * @return a List of LineString
      */
-    std::unique_ptr< std::vector<geom::Geometry*> > getVoronoiCellEdges(const geom::GeometryFactory& geomFact);
+    std::vector<std::unique_ptr<geom::Geometry>> getVoronoiCellEdges(const geom::GeometryFactory& geomFact);
 
     /** \brief
      * Gets a collection of [QuadEdges](@ref QuadEdge) whose origin vertices are a unique set
diff --git a/src/geom/CoordinateArraySequence.cpp b/src/geom/CoordinateArraySequence.cpp
index d451a35..27f6c50 100644
--- a/src/geom/CoordinateArraySequence.cpp
+++ b/src/geom/CoordinateArraySequence.cpp
@@ -40,6 +40,12 @@ CoordinateArraySequence::CoordinateArraySequence(size_t n,
 {
 }
 
+CoordinateArraySequence::CoordinateArraySequence(std::vector<Coordinate> && coords, size_t dimension_in):
+        vect(std::move(coords)),
+        dimension(dimension_in)
+{
+}
+
 CoordinateArraySequence::CoordinateArraySequence(
     std::vector<Coordinate>* coords, size_t dimension_in)
     : dimension(dimension_in)
diff --git a/src/triangulate/quadedge/QuadEdgeSubdivision.cpp b/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
index c4e32c0..67c8e9f 100644
--- a/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
+++ b/src/triangulate/quadedge/QuadEdgeSubdivision.cpp
@@ -362,7 +362,7 @@ QuadEdgeSubdivision::fetchTriangleToVisit(QuadEdge* edge,
     do {
         triEdges[edgeCount] = curr;
 
-        if(isFrameEdge(*curr)) {
+        if(!includeFrame && isFrameEdge(*curr)) {
             isFrame = true;
         }
 
@@ -381,7 +381,7 @@ QuadEdgeSubdivision::fetchTriangleToVisit(QuadEdge* edge,
     }
     while(curr != edge);
 
-    if(isFrame && !includeFrame) {
+    if(!includeFrame && isFrame) {
         return nullptr;
     }
     return triEdges;
@@ -439,13 +439,12 @@ void
 QuadEdgeSubdivision::getTriangleCoordinates(QuadEdgeSubdivision::TriList* triList, bool includeFrame)
 {
     TriangleCoordinatesVisitor visitor(triList);
-    visitTriangles((TriangleVisitor*)&visitor, includeFrame);
+    visitTriangles(&visitor, includeFrame);
 }
 
 void
 QuadEdgeSubdivision::visitTriangles(TriangleVisitor* triVisitor, bool includeFrame)
 {
-
     QuadEdgeStack edgeStack;
     edgeStack.push(startingEdges[0]);
 
@@ -495,24 +494,16 @@ QuadEdgeSubdivision::getTriangles(const GeometryFactory& geomFact)
 {
     TriList triPtsList;
     getTriangleCoordinates(&triPtsList, false);
-    std::vector<Geometry*> tris;
+    std::vector<std::unique_ptr<Geometry>> tris;
+    tris.reserve(triPtsList.size());
 
-    for(TriList::const_iterator it = triPtsList.begin();
-            it != triPtsList.end(); ++it) {
-        CoordinateSequence* coordSeq = *it;
+    for(CoordinateSequence* coordSeq : triPtsList) {
         Polygon* tri = geomFact.createPolygon(
                            geomFact.createLinearRing(coordSeq), nullptr);
-        tris.push_back(static_cast<Geometry*>(tri));
-    }
-    GeometryCollection* ret =  geomFact.createGeometryCollection(tris);
-
-    //release memory
-    for(std::vector<Geometry*>::iterator it = tris.begin(); it != tris.end(); ++it) {
-        delete *it;
+        tris.emplace_back(tri);
     }
-    tris.clear();
 
-    return std::unique_ptr<GeometryCollection>(ret);
+    return geomFact.createGeometryCollection(std::move(tris));
 }
 
 
@@ -520,22 +511,13 @@ QuadEdgeSubdivision::getTriangles(const GeometryFactory& geomFact)
 std::unique_ptr<geom::GeometryCollection>
 QuadEdgeSubdivision::getVoronoiDiagram(const geom::GeometryFactory& geomFact)
 {
-    auto vorCells = getVoronoiCellPolygons(geomFact);
-
-    // TODO remove loop when GeometryFactory API handles unique_ptr
-    std::unique_ptr<std::vector<Geometry*>> rawCells(new std::vector<Geometry*>(vorCells.size()));
-    for (size_t i = 0; i < rawCells->size(); i++) {
-        (*rawCells)[i] = vorCells[i].release();
-    }
-
-    return std::unique_ptr<GeometryCollection>(geomFact.createGeometryCollection(rawCells.release()));
+    return geomFact.createGeometryCollection(getVoronoiCellPolygons(geomFact));
 }
 
 std::unique_ptr<geom::MultiLineString>
 QuadEdgeSubdivision::getVoronoiDiagramEdges(const geom::GeometryFactory& geomFact)
 {
-    std::unique_ptr< std::vector<geom::Geometry*> > vorCells = getVoronoiCellEdges(geomFact);
-    return std::unique_ptr<MultiLineString>(geomFact.createMultiLineString(vorCells.release()));
+    return geomFact.createMultiLineString(getVoronoiCellEdges(geomFact));
 }
 
 std::vector<std::unique_ptr<geom::Geometry>>
@@ -544,10 +526,11 @@ QuadEdgeSubdivision::getVoronoiCellPolygons(const geom::GeometryFactory& geomFac
     std::vector<std::unique_ptr<geom::Geometry>> cells;
     TriangleCircumcentreVisitor tricircumVisitor;
 
-    visitTriangles((TriangleVisitor*) &tricircumVisitor, true);
+    visitTriangles(&tricircumVisitor, true);
 
     std::unique_ptr<QuadEdgeSubdivision::QuadEdgeList> edges = getVertexUniqueEdges(false);
 
+    cells.reserve(edges->size());
     for(const QuadEdge* qe : *edges) {
         cells.push_back(getVoronoiCellPolygon(qe, geomFact));
     }
@@ -555,20 +538,19 @@ QuadEdgeSubdivision::getVoronoiCellPolygons(const geom::GeometryFactory& geomFac
     return cells;
 }
 
-std::unique_ptr< std::vector<geom::Geometry*> >
+std::vector<std::unique_ptr<geom::Geometry>>
 QuadEdgeSubdivision::getVoronoiCellEdges(const geom::GeometryFactory& geomFact)
 {
-    auto cells = detail::make_unique<std::vector<geom::Geometry*>>();
+    std::vector<std::unique_ptr<geom::Geometry>> cells;
     TriangleCircumcentreVisitor tricircumVisitor;
 
     visitTriangles((TriangleVisitor*) &tricircumVisitor, true);
 
     std::unique_ptr<QuadEdgeSubdivision::QuadEdgeList> edges = getVertexUniqueEdges(false);
+    cells.reserve(edges->size());
 
     for(const QuadEdge* qe : *edges) {
-        std::unique_ptr<geom::Geometry> poly = getVoronoiCellEdge(qe, geomFact);
-
-        cells->push_back(poly.release());
+        cells.push_back(getVoronoiCellEdge(qe, geomFact));
     }
 
     return cells;
@@ -577,12 +559,13 @@ QuadEdgeSubdivision::getVoronoiCellEdges(const geom::GeometryFactory& geomFact)
 std::unique_ptr<geom::Geometry>
 QuadEdgeSubdivision::getVoronoiCellPolygon(const QuadEdge* qe, const geom::GeometryFactory& geomFact)
 {
-    std::unique_ptr<std::vector<Coordinate>> cellPts(new std::vector<Coordinate>());
+    std::vector<Coordinate> cellPts;
+
     const QuadEdge* startQE = qe;
     do {
         const Coordinate& cc = qe->rot().orig().getCoordinate();
-        if(cellPts->empty() || cellPts->back() != cc) {  // no duplicates
-            cellPts->push_back(cc);
+        if(cellPts.empty() || cellPts.back() != cc) {  // no duplicates
+            cellPts.push_back(cc);
         }
         qe = &qe->oPrev();
 
@@ -590,15 +573,16 @@ QuadEdgeSubdivision::getVoronoiCellPolygon(const QuadEdge* qe, const geom::Geome
     while(qe != startQE);
 
     // Close the ring
-    if (cellPts->front() != cellPts->back()) {
-        cellPts->push_back(cellPts->front());
+    if (cellPts.front() != cellPts.back()) {
+        cellPts.push_back(cellPts.front());
     }
-    if (cellPts->size() < 4) {
-        cellPts->push_back(cellPts->back());
+    if (cellPts.size() < 4) {
+        cellPts.push_back(cellPts.back());
     }
 
-    std::unique_ptr<geom::Geometry> cellPoly(
-        geomFact.createPolygon(geomFact.createLinearRing(new geom::CoordinateArraySequence(cellPts.release())), nullptr));
+    std::unique_ptr<CoordinateSequence> seq(new CoordinateArraySequence(std::move(cellPts)));
+
+    std::unique_ptr<geom::Geometry> cellPoly(geomFact.createPolygon(geomFact.createLinearRing(seq.release()), nullptr));
 
     // FIXME why is this returning a pointer to a local variable?
     Vertex v = startQE->orig();
@@ -611,12 +595,13 @@ QuadEdgeSubdivision::getVoronoiCellPolygon(const QuadEdge* qe, const geom::Geome
 std::unique_ptr<geom::Geometry>
 QuadEdgeSubdivision::getVoronoiCellEdge(const QuadEdge* qe, const geom::GeometryFactory& geomFact)
 {
-    std::unique_ptr<std::vector<Coordinate>> cellPts(new std::vector<Coordinate>());
+    std::vector<Coordinate> cellPts;
+
     const QuadEdge* startQE = qe;
     do {
         const Coordinate& cc = qe->rot().orig().getCoordinate();
-        if(cellPts->empty() || cellPts->back() != cc) {  // no duplicates
-            cellPts->push_back(cc);
+        if(cellPts.empty() || cellPts.back() != cc) {  // no duplicates
+            cellPts.push_back(cc);
         }
         qe = &qe->oPrev();
 
@@ -624,12 +609,12 @@ QuadEdgeSubdivision::getVoronoiCellEdge(const QuadEdge* qe, const geom::Geometry
     while(qe != startQE);
 
     // Close the ring
-    if (cellPts->front() != cellPts->back()) {
-        cellPts->push_back(cellPts->front());
+    if (cellPts.front() != cellPts.back()) {
+        cellPts.push_back(cellPts.front());
     }
 
     std::unique_ptr<geom::Geometry> cellEdge(
-        geomFact.createLineString(new geom::CoordinateArraySequence(cellPts.release())));
+        geomFact.createLineString(new geom::CoordinateArraySequence(std::move(cellPts))));
 
     // FIXME why is this returning a pointer to a local variable?
     Vertex v = startQE->orig();

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                               |   3 +
 include/geos/geom/CoordinateArraySequence.h        |   4 +
 include/geos/triangulate/quadedge/QuadEdge.h       |  13 ++-
 .../triangulate/quadedge/QuadEdgeSubdivision.h     |  12 ++-
 src/geom/CoordinateArraySequence.cpp               |   6 ++
 src/triangulate/VoronoiDiagramBuilder.cpp          |  20 ++--
 src/triangulate/quadedge/QuadEdge.cpp              |   2 +-
 src/triangulate/quadedge/QuadEdgeSubdivision.cpp   | 120 ++++++++++-----------
 8 files changed, 100 insertions(+), 80 deletions(-)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list