ouput result
diff --git a/.gitignore b/.gitignore index 758bbfa..378b516 100644 --- a/.gitignore +++ b/.gitignore
@@ -10,4 +10,5 @@ .vscode build includes -.DS_Store \ No newline at end of file +.DS_Store +test-files/out.json \ No newline at end of file
diff --git a/src/delaunator.cpp b/src/delaunator.cpp index cdf9e52..3ff83f0 100644 --- a/src/delaunator.cpp +++ b/src/delaunator.cpp
@@ -212,16 +212,16 @@ } Delaunator::Delaunator(const vector<double> &in_coords) { - m_coords = move(in_coords); - const long int n = m_coords.size() >> 1; + coords = move(in_coords); + const long int n = coords.size() >> 1; double max_x = -1 * max_double; double max_y = -1 * max_double; double min_x = max_double; double min_y = max_double; unsigned long int ids[n]; for (long int i = 0; i < n; i++) { - const double x = m_coords[2 * i]; - const double y = m_coords[2 * i + 1]; + const double x = coords[2 * i]; + const double y = coords[2 * i + 1]; // printf("%f %f", x, y); if (x < min_x) min_x = x; @@ -239,7 +239,7 @@ // pick a seed point close to the centroid for (unsigned long int i = 0; i < n; i++) { - const double d = dist(cx, cy, m_coords[2 * i], m_coords[2 * i + 1]); + const double d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); if (d < min_dist) { i0 = i; min_dist = d; @@ -251,7 +251,7 @@ // find the point closest to the seed for (unsigned long int i = 0; i < n; i++) { if (i == i0) continue; - const double d = dist(m_coords[2 * i0], m_coords[2 * i0 + 1], m_coords[2 * i], m_coords[2 * i + 1]); + const double d = dist(coords[2 * i0], coords[2 * i0 + 1], coords[2 * i], coords[2 * i + 1]); if (d < min_dist && d > 0) { i1 = i; @@ -267,9 +267,9 @@ if (i == i0 || i == i1) continue; const double r = circumradius( - m_coords[2 * i0], m_coords[2 * i0 + 1], - m_coords[2 * i1], m_coords[2 * i1 + 1], - m_coords[2 * i], m_coords[2 * i + 1]); + coords[2 * i0], coords[2 * i0 + 1], + coords[2 * i1], coords[2 * i1 + 1], + coords[2 * i], coords[2 * i + 1]); if (r < min_radius) { @@ -284,9 +284,9 @@ if ( area( - m_coords[2 * i0], m_coords[2 * i0 + 1], - m_coords[2 * i1], m_coords[2 * i1 + 1], - m_coords[2 * i2], m_coords[2 * i2 + 1] + coords[2 * i0], coords[2 * i0 + 1], + coords[2 * i1], coords[2 * i1 + 1], + coords[2 * i2], coords[2 * i2 + 1] ) < 0 ) { const double tmp = i1; @@ -294,23 +294,23 @@ i2 = tmp; } - const double i0x = m_coords[2 * i0]; - const double i0y = m_coords[2 * i0 + 1]; - const double i1x = m_coords[2 * i1]; - const double i1y = m_coords[2 * i1 + 1]; - const double i2x = m_coords[2 * i2]; - const double i2y = m_coords[2 * i2 + 1]; + const double i0x = coords[2 * i0]; + const double i0y = coords[2 * i0 + 1]; + const double i1x = coords[2 * i1]; + const double i1y = coords[2 * i1 + 1]; + const double i2x = coords[2 * i2]; + const double i2y = coords[2 * i2 + 1]; tie(m_center_x, m_center_y) = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); // sort the points by distance from the seed triangle circumcenter - quicksort(ids, m_coords, 0, n - 1, m_center_x, m_center_y); + quicksort(ids, coords, 0, n - 1, m_center_x, m_center_y); m_hash_size = ceil(sqrt(n)); m_hash.reserve(m_hash_size); for (int i = 0; i < m_hash_size; i++) m_hash.push_back(-1); - m_hull.reserve(m_coords.size()); + m_hull.reserve(coords.size()); long int e = insert_node(i0); hash_edge(e); @@ -324,7 +324,7 @@ hash_edge(e); m_hull[e].t = 2; - cout << "m_hash " << m_hash << endl; + // cout << "m_hash " << m_hash << endl; const size_t max_triangles = 2 * n - 5; triangles.reserve(max_triangles * 3); @@ -335,8 +335,8 @@ double yp = NAN; for (size_t k = 0; k < n; k++) { const size_t i = ids[k]; - const double x = m_coords[2 * i]; - const double y = m_coords[2 * i + 1]; + const double x = coords[2 * i]; + const double y = coords[2 * i + 1]; if (x == xp && y == yp) continue; xp = x; yp = y; @@ -468,10 +468,10 @@ const long int p1 = triangles[bl]; const bool illegal = in_circle( - m_coords[2 * p0], m_coords[2 * p0 + 1], - m_coords[2 * pr], m_coords[2 * pr + 1], - m_coords[2 * pl], m_coords[2 * pl + 1], - m_coords[2 * p1], m_coords[2 * p1 + 1] + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1] ); if (illegal) { @@ -502,8 +502,8 @@ long int node = m_hull.size(); DelaunatorPoint p = { .i = i, - .x = m_coords[2 * i], - .y = m_coords[2 * i + 1], + .x = coords[2 * i], + .y = coords[2 * i + 1], .prev = node, .next = node, .removed = false
diff --git a/src/delaunator.h b/src/delaunator.h index da9154e..ac0be91 100644 --- a/src/delaunator.h +++ b/src/delaunator.h
@@ -19,13 +19,13 @@ Delaunator(const std::vector<double> &in_coords); std::vector<unsigned long int> triangles; std::vector<long int> halfedges; + std::vector<double> coords; // size_t triangles_len; private: double m_center_x; double m_center_y; size_t m_hash_size; std::vector<int> m_hash; - std::vector<double> m_coords; std::vector<DelaunatorPoint> m_hull; size_t insert_node(size_t i); size_t insert_node(size_t i, size_t prev);
diff --git a/src/main.cpp b/src/main.cpp index 7911232..80ee88b 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -1,5 +1,6 @@ // #include <iostream> #include "rapidjson/document.h" +#include "rapidjson/prettywriter.h" #include "delaunator.h" #include <cstdio> #include <fstream> @@ -54,5 +55,54 @@ string json = read_file(filename); const vector<double> coords = get_geo_json_points(json); Delaunator delaunator(coords); - cout << delaunator.triangles << endl; + rapidjson::StringBuffer sb; + rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb); + writer.StartObject(); + writer.String("type"); writer.String("FeatureCollection"); + writer.String("crs"); + writer.StartObject(); + writer.String("type"); writer.String("name"); + writer.String("properties"); + writer.StartObject(); + writer.String("name"); writer.String("urn:ogc:def:crs:EPSG::900913"); + writer.EndObject(); + writer.EndObject(); + writer.String("features"); + writer.StartArray(); + for(long int i = 0; i < delaunator.triangles.size(); i+=3) { + writer.StartObject(); + writer.String("type"); writer.String("Feature"); + writer.String("properties"); writer.StartObject(); writer.EndObject(); + writer.String("geometry"); + writer.StartObject(); + writer.String("type"); writer.String("Polygon"); + writer.String("coordinates"); + writer.StartArray(); + writer.StartArray(); + writer.StartArray(); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i]]); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i] + 1]); + writer.EndArray(); + writer.StartArray(); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i + 1]]); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i + 1] + 1]); + writer.EndArray(); + writer.StartArray(); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i + 2]]); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i + 2] + 1]); + writer.EndArray(); + writer.StartArray(); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i]]); + writer.Uint(delaunator.coords[2 * delaunator.triangles[i] + 1]); + writer.EndArray(); + writer.EndArray(); + writer.EndArray(); + writer.EndObject(); + writer.EndObject(); + } + writer.EndArray(); + writer.EndObject(); + puts(sb.GetString()); + return 0; + // cout << delaunator.triangles << endl; }