@@ -287,9 +287,9 @@ drawing.symbolNumber = function(v) {
287
287
0 : Math . floor ( Math . max ( v , 0 ) ) ;
288
288
} ;
289
289
290
- function makePointPath ( symbolNumber , r ) {
290
+ function makePointPath ( symbolNumber , r , t ) {
291
291
var base = symbolNumber % 100 ;
292
- return drawing . symbolFuncs [ base ] ( r ) + ( symbolNumber >= 200 ? DOTPATH : '' ) ;
292
+ return drawing . symbolFuncs [ base ] ( r , t ) + ( symbolNumber >= 200 ? DOTPATH : '' ) ;
293
293
}
294
294
295
295
var HORZGRADIENT = { x1 : 1 , x2 : 0 , y1 : 0 , y2 : 0 } ;
@@ -649,7 +649,9 @@ drawing.singlePointStyle = function(d, sel, trace, fns, gd) {
649
649
// because that impacts how to handle colors
650
650
d . om = x % 200 >= 100 ;
651
651
652
- sel . attr ( 'd' , makePointPath ( x , r ) ) ;
652
+ var angle = getMarkerAngle ( d , trace ) ;
653
+
654
+ sel . attr ( 'd' , makePointPath ( x , r , angle ) ) ;
653
655
}
654
656
655
657
var perPointGradient = false ;
@@ -898,7 +900,7 @@ drawing.selectedPointStyle = function(s, trace) {
898
900
var mx = d . mx || marker . symbol || 0 ;
899
901
var mrc2 = fns . selectedSizeFn ( d ) ;
900
902
901
- pt . attr ( 'd' , makePointPath ( drawing . symbolNumber ( mx ) , mrc2 ) ) ;
903
+ pt . attr ( 'd' , makePointPath ( drawing . symbolNumber ( mx ) , mrc2 , getMarkerAngle ( d , trace ) ) ) ;
902
904
903
905
// save for Drawing.selectedTextStyle
904
906
d . mrc2 = mrc2 ;
@@ -1447,3 +1449,111 @@ drawing.setTextPointsScale = function(selection, xScale, yScale) {
1447
1449
el . attr ( 'transform' , transforms . join ( '' ) ) ;
1448
1450
} ) ;
1449
1451
} ;
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