mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-14 09:42:56 +00:00
64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
import * as d3 from 'd3';
|
|
import { geoEuclideanDistance } from '../geo/index';
|
|
|
|
|
|
export function svgOneWaySegments(projection, graph, dt) {
|
|
return function(entity) {
|
|
var a,
|
|
b,
|
|
i = 0,
|
|
offset = dt,
|
|
segments = [],
|
|
clip = d3.geoIdentity().clipExtent(projection.clipExtent()).stream,
|
|
coordinates = graph.childNodes(entity).map(function(n) {
|
|
return n.loc;
|
|
});
|
|
|
|
if (entity.tags.oneway === '-1') coordinates.reverse();
|
|
|
|
d3.geoStream({
|
|
type: 'LineString',
|
|
coordinates: coordinates
|
|
}, projection.stream(clip({
|
|
lineStart: function() {},
|
|
lineEnd: function() {
|
|
a = null;
|
|
},
|
|
point: function(x, y) {
|
|
b = [x, y];
|
|
|
|
if (a) {
|
|
var span = geoEuclideanDistance(a, b) - offset;
|
|
|
|
if (span >= 0) {
|
|
var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
|
|
dx = dt * Math.cos(angle),
|
|
dy = dt * Math.sin(angle),
|
|
p = [a[0] + offset * Math.cos(angle),
|
|
a[1] + offset * Math.sin(angle)];
|
|
|
|
var segment = 'M' + a[0] + ',' + a[1] +
|
|
'L' + p[0] + ',' + p[1];
|
|
|
|
for (span -= dt; span >= 0; span -= dt) {
|
|
p[0] += dx;
|
|
p[1] += dy;
|
|
segment += 'L' + p[0] + ',' + p[1];
|
|
}
|
|
|
|
segment += 'L' + b[0] + ',' + b[1];
|
|
segments.push({id: entity.id, index: i, d: segment});
|
|
}
|
|
|
|
offset = -span;
|
|
i++;
|
|
}
|
|
|
|
a = b;
|
|
}
|
|
})));
|
|
|
|
return segments;
|
|
};
|
|
}
|