Skip to content

Commit dca228a

Browse files
committed
add angle and angleref to marker
- add arrow and arrow-narrow symbols
1 parent 1169948 commit dca228a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1823
-361
lines changed

src/components/drawing/index.js

Lines changed: 114 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,9 @@ drawing.symbolNumber = function(v) {
287287
0 : Math.floor(Math.max(v, 0));
288288
};
289289

290-
function makePointPath(symbolNumber, r) {
290+
function makePointPath(symbolNumber, r, t) {
291291
var base = symbolNumber % 100;
292-
return drawing.symbolFuncs[base](r) + (symbolNumber >= 200 ? DOTPATH : '');
292+
return drawing.symbolFuncs[base](r, t) + (symbolNumber >= 200 ? DOTPATH : '');
293293
}
294294

295295
var HORZGRADIENT = {x1: 1, x2: 0, y1: 0, y2: 0};
@@ -649,7 +649,9 @@ drawing.singlePointStyle = function(d, sel, trace, fns, gd) {
649649
// because that impacts how to handle colors
650650
d.om = x % 200 >= 100;
651651

652-
sel.attr('d', makePointPath(x, r));
652+
var angle = getMarkerAngle(d, trace);
653+
654+
sel.attr('d', makePointPath(x, r, angle));
653655
}
654656

655657
var perPointGradient = false;
@@ -898,7 +900,7 @@ drawing.selectedPointStyle = function(s, trace) {
898900
var mx = d.mx || marker.symbol || 0;
899901
var mrc2 = fns.selectedSizeFn(d);
900902

901-
pt.attr('d', makePointPath(drawing.symbolNumber(mx), mrc2));
903+
pt.attr('d', makePointPath(drawing.symbolNumber(mx), mrc2, getMarkerAngle(d, trace)));
902904

903905
// save for Drawing.selectedTextStyle
904906
d.mrc2 = mrc2;
@@ -1447,3 +1449,111 @@ drawing.setTextPointsScale = function(selection, xScale, yScale) {
14471449
el.attr('transform', transforms.join(''));
14481450
});
14491451
};
1452+
1453+
var atan2 = Math.atan2;
1454+
var cos = Math.cos;
1455+
var sin = Math.sin;
1456+
1457+
function rotate(t, xy) {
1458+
var x = xy[0];
1459+
var y = xy[1];
1460+
return [
1461+
x * cos(t) - y * sin(t),
1462+
x * sin(t) + y * cos(t)
1463+
];
1464+
}
1465+
1466+
var previousX;
1467+
var previousY;
1468+
var previousI;
1469+
var previousTraceUid;
1470+
1471+
function getMarkerAngle(d, trace) {
1472+
var angle = d.ma;
1473+
1474+
if(angle === undefined) {
1475+
angle = trace.marker.angle || 0;
1476+
}
1477+
1478+
var x, y;
1479+
var ref = trace.marker.angleref;
1480+
if(ref === 'previous' || ref === 'north') {
1481+
if(trace._geo) {
1482+
var p = trace._geo.project(d.lonlat);
1483+
x = p[0];
1484+
y = p[1];
1485+
} else {
1486+
var xa = trace._xA;
1487+
var ya = trace._yA;
1488+
if(xa && ya) {
1489+
x = xa.c2p(d.x);
1490+
y = ya.c2p(d.y);
1491+
} else {
1492+
// case of legends
1493+
return 90;
1494+
}
1495+
}
1496+
1497+
if(ref === 'north') {
1498+
var lon = d.lonlat[0];
1499+
var lat = d.lonlat[1];
1500+
1501+
var north = trace._geo.project([
1502+
lon,
1503+
lat + 1e-5 // epsilon
1504+
]);
1505+
1506+
var east = trace._geo.project([
1507+
lon + 1e-5, // epsilon
1508+
lat
1509+
]);
1510+
1511+
var u = atan2(
1512+
east[1] - y,
1513+
east[0] - x
1514+
);
1515+
1516+
var v = atan2(
1517+
north[1] - y,
1518+
north[0] - x
1519+
);
1520+
1521+
var t = angle / 180 * Math.PI;
1522+
// To use counter-clockwise angles i.e.
1523+
// East: 90, West: -90
1524+
// to facilitate wind visualisations
1525+
// in future we should use t = -t here.
1526+
1527+
var A = rotate(u, [cos(t), 0]);
1528+
var B = rotate(v, [sin(t), 0]);
1529+
1530+
angle = atan2(
1531+
A[1] + B[1],
1532+
A[0] + B[0]
1533+
) / Math.PI * 180;
1534+
}
1535+
1536+
if(ref === 'previous') {
1537+
if(
1538+
previousTraceUid === trace.uid &&
1539+
d.i === previousI + 1 &&
1540+
isNumeric(x) &&
1541+
isNumeric(y)
1542+
) {
1543+
angle += atan2(
1544+
y - previousY,
1545+
x - previousX
1546+
) / Math.PI * 180 + 90;
1547+
} else {
1548+
angle = null;
1549+
}
1550+
}
1551+
}
1552+
1553+
previousX = x;
1554+
previousY = y;
1555+
previousI = d.i;
1556+
previousTraceUid = trace.uid;
1557+
1558+
return angle;
1559+
}

0 commit comments

Comments
 (0)