@@ -758,7 +758,6 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
758
758
function findEnclosingVertexAngles ( a ) {
759
759
var cycleIndex = makeCycleIndexFn ( vangles . length ) ;
760
760
var i0 = findIndexOfMin ( vangles , function ( v ) {
761
- if ( ! isAngleInSector ( v , sector ) ) return Infinity ;
762
761
var adelta = angleDelta ( v , a ) ;
763
762
return adelta > 0 ? adelta : Infinity ;
764
763
} ) ;
@@ -823,8 +822,8 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
823
822
// match origin for asymmetric polygons
824
823
if ( vangles ) {
825
824
var offset = findPolygonOffset ( radius , sector , vangles ) ;
826
- x0 += offset . left ;
827
- y0 += offset . top ;
825
+ x0 += cxx + offset [ 0 ] ;
826
+ y0 += cyy + offset [ 1 ] ;
828
827
}
829
828
830
829
switch ( dragModeNow ) {
@@ -1323,7 +1322,7 @@ function findIndexOfMin(arr, fn) {
1323
1322
return ind ;
1324
1323
}
1325
1324
1326
- // find intersection of 'v0' <-> 'v1' edge with a 'radial' line
1325
+ // find intersection of 'v0' <-> 'v1' edge with a ray at angle 'a'
1327
1326
// (i.e. a line that starts from the origin at angle 'a')
1328
1327
// given an (xp,yp) pair on the 'v0' <-> 'v1' line
1329
1328
// (N.B. 'v0' and 'v1' are angles in radians)
@@ -1334,28 +1333,40 @@ function findIntersectionXY(v0, v1, a, xpyp) {
1334
1333
var yp = xpyp [ 1 ] ;
1335
1334
var dsin = clampTiny ( Math . sin ( v1 ) - Math . sin ( v0 ) ) ;
1336
1335
var dcos = clampTiny ( Math . cos ( v1 ) - Math . cos ( v0 ) ) ;
1337
-
1338
- if ( dsin && dcos ) {
1339
- // given
1340
- // g(x) := v0 -> v1 line = m * x + b
1341
- // h(x) := mr * x
1342
- // solve g(xstar) = h(xstar)
1343
- var m = dsin / dcos ;
1344
- var b = yp - m * xp ;
1345
- var mr = Math . sin ( a ) / Math . cos ( a ) ;
1346
- xstar = b / ( mr - m ) ;
1347
- ystar = mr * xstar ;
1348
- } else {
1349
- var r ;
1350
- if ( dcos ) {
1336
+ var tanA = Math . tan ( a ) ;
1337
+ var cotanA = clampTiny ( 1 / tanA ) ;
1338
+ var m = dsin / dcos ;
1339
+ var b = yp - m * xp ;
1340
+
1341
+ if ( cotanA ) {
1342
+ if ( dsin && dcos ) {
1343
+ // given
1344
+ // g(x) := v0 -> v1 line = m*x + b
1345
+ // h(x) := ray at angle 'a' = m*x = tanA*x
1346
+ // solve g( xstar) = h(xstar)
1347
+ xstar = b / ( tanA - m ) ;
1348
+ ystar = tanA * xstar ;
1349
+ } else if ( dcos ) {
1351
1350
// horizontal v0 -> v1
1352
- r = yp / Math . sin ( v0 ) ;
1351
+ xstar = yp * cotanA ;
1352
+ ystar = yp ;
1353
1353
} else {
1354
- // vertical v0 -> va
1355
- r = xp / Math . cos ( v0 ) ;
1354
+ // vertical v0 -> v1
1355
+ xstar = xp ;
1356
+ ystar = xp * tanA ;
1357
+ }
1358
+ } else {
1359
+ // vertical ray
1360
+ if ( dsin && dcos ) {
1361
+ xstar = 0 ;
1362
+ ystar = b ;
1363
+ } else if ( dcos ) {
1364
+ xstar = 0 ;
1365
+ ystar = yp ;
1366
+ } else {
1367
+ // does this case exists?
1368
+ xstar = ystar = NaN ;
1356
1369
}
1357
- xstar = r * Math . cos ( a ) ;
1358
- ystar = r * Math . sin ( a ) ;
1359
1370
}
1360
1371
1361
1372
return [ xstar , ystar ] ;
@@ -1365,7 +1376,7 @@ function findIntersectionXY(v0, v1, a, xpyp) {
1365
1376
// rearranged into 0 = a*x^2 + b * x + c
1366
1377
//
1367
1378
// where f(x) = m*x + t + yp
1368
- // and x01 = (-b +/- del) / (2*a)
1379
+ // and (x0, x1) = (-b +/- del) / (2*a)
1369
1380
function findXYatLength ( l , m , xp , yp ) {
1370
1381
var t = - m * xp ;
1371
1382
var a = m * m + 1 ;
@@ -1454,15 +1465,14 @@ function makePolygon(r, sector, vangles) {
1454
1465
function findPolygonOffset ( r , sector , vangles ) {
1455
1466
var minX = Infinity ;
1456
1467
var minY = Infinity ;
1468
+ var vertices = makePolygon ( r , sector , vangles ) ;
1457
1469
1458
- for ( var i = 0 ; i < vangles . length ; i ++ ) {
1459
- var va = vangles [ i ] ;
1460
- if ( isAngleInSector ( va , sector ) ) {
1461
- minX = Math . min ( minX , r * Math . cos ( va ) ) ;
1462
- minY = Math . min ( minY , - r * Math . sin ( va ) ) ;
1463
- }
1470
+ for ( var i = 0 ; i < vertices . length ; i ++ ) {
1471
+ var v = vertices [ i ] ;
1472
+ minX = Math . min ( minX , v [ 0 ] ) ;
1473
+ minY = Math . min ( minY , - v [ 1 ] ) ;
1464
1474
}
1465
- return { top : minY + r , left : minX + r } ;
1475
+ return [ minX , minY ] ;
1466
1476
}
1467
1477
1468
1478
function invertY ( pts0 ) {
@@ -1564,6 +1574,7 @@ function strRotate(angle) {
1564
1574
return 'rotate(' + angle + ')' ;
1565
1575
}
1566
1576
1577
+ // to more easily catch 'almost zero' numbers in if-else blocks
1567
1578
function clampTiny ( v ) {
1568
1579
return Math . abs ( v ) > 1e-10 ? v : 0 ;
1569
1580
}
0 commit comments