From 19082bcf2a2e4f50b9bbbe03afe398075875b940 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Sun, 9 Dec 2012 00:00:23 -0500 Subject: [PATCH] Make spliced nodes straight. Fixes #241 --- js/id/modes/add_road.js | 6 +++--- js/id/util.js | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/js/id/modes/add_road.js b/js/id/modes/add_road.js index 15b87ba59..bd37ed37e 100644 --- a/js/id/modes/add_road.js +++ b/js/id/modes/add_road.js @@ -38,13 +38,13 @@ iD.modes.AddRoad = function() { } else if (datum.type === 'way') { // begin a new way starting from an existing way - node = iD.Node({loc: map.mouseCoordinates()}), - index = iD.util.geo.chooseIndex(datum, d3.mouse(map.surface.node()), map); + choice = iD.util.geo.chooseIndex(datum, d3.mouse(map.surface.node()), map); + node = iD.Node({ loc: choice.loc }), history.perform( iD.actions.AddWay(way), iD.actions.AddNode(node), - iD.actions.AddWayNode(datum.id, node.id, index), + iD.actions.AddWayNode(datum.id, node.id, choice.index), iD.actions.AddWayNode(way.id, node.id), 'started a road'); diff --git a/js/id/util.js b/js/id/util.js index bf5a2ef2d..7dc28a3ab 100644 --- a/js/id/util.js +++ b/js/id/util.js @@ -97,14 +97,23 @@ iD.util.geo.dist = function(a, b) { }; iD.util.geo.chooseIndex = function(way, point, map) { - var dist = iD.util.geo.dist; - var projNodes = way.nodes.map(function(n) { + var dist = iD.util.geo.dist, + projNodes = way.nodes.map(function(n) { return map.projection(n.loc); }); + for (var i = 0, changes = []; i < projNodes.length - 1; i++) { changes[i] = (dist(projNodes[i], point) + dist(point, projNodes[i + 1])) / dist(projNodes[i], projNodes[i + 1]); } - return _.indexOf(changes, _.min(changes)) + 1; + + var idx = _.indexOf(changes, _.min(changes)), + ratio = dist(projNodes[idx], point) / dist(projNodes[idx], projNodes[idx + 1]), + loc = iD.util.geo.interp(way.nodes[idx].loc, way.nodes[idx + 1].loc, ratio); + + return { + index: idx + 1, + loc: loc + }; };