From 3feb20c76446f3167facbb63ba3e675459085fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Katarzyna=20Kr=C3=B3l?= Date: Tue, 29 Oct 2019 01:56:49 +0100 Subject: [PATCH] disable circularize if object is already circular --- modules/actions/circularize.js | 42 +++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/actions/circularize.js b/modules/actions/circularize.js index b7f8b4682..2902aabab 100644 --- a/modules/actions/circularize.js +++ b/modules/actions/circularize.js @@ -6,7 +6,7 @@ import { polygonCentroid as d3_polygonCentroid } from 'd3-polygon'; -import { geoVecInterp, geoVecLength } from '../geo'; +import { geoVecInterp, geoVecLength} from '../geo'; import { osmNode } from '../osm/node'; import { utilArrayUniq } from '../util'; @@ -228,6 +228,46 @@ export function actionCircularize(wayId, projection, maxAngle) { if (!graph.entity(wayId).isClosed()) { return 'not_closed'; } + + var way = graph.entity(wayId); + var nodes = utilArrayUniq(graph.childNodes(way)); + var points = nodes.map(function(n) { return projection(n.loc); }); + var sign = d3_polygonArea(points) > 0 ? 1 : -1; + var hull = d3_polygonHull(points); + if (hull.length !== points.length || hull.length < 3){ + return false; + } + var centroid = d3_polygonCentroid(points); + var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }); + + // compare distances between centroid and points + for (var i = 0; i 1)) { + return false; + } + } + + var startAngle = Math.atan2(hull[0][1] - centroid[1], hull[0][0] - centroid[0]); + var endAngle = Math.atan2(hull[1][1] - centroid[1], hull[1][0] - centroid[0]); + var eachAngle = (endAngle - startAngle); + + //compare central angles + for (i = 0; i 0) { + angle = -sign * (2 * Math.PI - Math.abs(angle)); + } + if (Math.abs((angle) - eachAngle) > 0.05) { + return false; + } + } + return 'already_circular'; };