The nodes.sort() statement caused some trouble in older browsers
such as (FF 20, Chromium 25). Also, the straighten action should
conserve node order. Thus, the sorting made the test weaker than
it had to be.
This just removes the unnecessary sorting.
iD.geo.euclideanDistance should only be used for calculations of
projected coordinates or display (pixel) coordinates.
iD.geo.sphericalDistance calculates approximate geographical
distances, accounting for distortions at higher latitudes. This
can be used for determining the nearest node (operations.Delete,
actions.Circularize) or relative length comparisons (actions.Split).
if a way is closed, iD needs to choose a second node to
split the way at.
This algorithm looks for a node that is both far away from
the initial node in terms of way segment length and nearby
in terms of beeline-distance. This assures that areas get
split on the most "natural" points (independent of the number
of nodes).
For example: bone-shaped areas get split across their waist-
line, circles across the diameter.
Previously, adding a midpoint to an invalidly doubled-back
segment (aba) resulted in a self-intersection with an invalid
consecutive node (accba). Now a self-intersection is still
produced, but with only one c node (acba).
Refs #1296
Can't unconditionally delete the node; it may be a member
of other ways.
I didn't preserve the behavior of dragging a midpoint to
an adjacent node being a no-op. In general we don't try to
eliminate compound operations whose net result is a no-op;
I don't think it's important to do so for this special case.
The degenerate case of connecting the endpoints of a two-vertex
line now results in a point. This is what naturally resulted
from the code, and seems ok.
Fixes#983.