@@ -758,7 +758,6 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
758758 function findEnclosingVertexAngles ( a ) {
759759 var cycleIndex = makeCycleIndexFn ( vangles . length ) ;
760760 var i0 = findIndexOfMin ( vangles , function ( v ) {
761- if ( ! isAngleInSector ( v , sector ) ) return Infinity ;
762761 var adelta = angleDelta ( v , a ) ;
763762 return adelta > 0 ? adelta : Infinity ;
764763 } ) ;
@@ -823,8 +822,8 @@ proto.updateMainDrag = function(fullLayout, polarLayout) {
823822 // match origin for asymmetric polygons
824823 if ( vangles ) {
825824 var offset = findPolygonOffset ( radius , sector , vangles ) ;
826- x0 += offset . left ;
827- y0 += offset . top ;
825+ x0 += cxx + offset [ 0 ] ;
826+ y0 += cyy + offset [ 1 ] ;
828827 }
829828
830829 switch ( dragModeNow ) {
@@ -1323,7 +1322,7 @@ function findIndexOfMin(arr, fn) {
13231322 return ind ;
13241323}
13251324
1326- // find intersection of 'v0' <-> 'v1' edge with a 'radial' line
1325+ // find intersection of 'v0' <-> 'v1' edge with a ray at angle 'a'
13271326// (i.e. a line that starts from the origin at angle 'a')
13281327// given an (xp,yp) pair on the 'v0' <-> 'v1' line
13291328// (N.B. 'v0' and 'v1' are angles in radians)
@@ -1334,28 +1333,40 @@ function findIntersectionXY(v0, v1, a, xpyp) {
13341333 var yp = xpyp [ 1 ] ;
13351334 var dsin = clampTiny ( Math . sin ( v1 ) - Math . sin ( v0 ) ) ;
13361335 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 ) {
13511350 // horizontal v0 -> v1
1352- r = yp / Math . sin ( v0 ) ;
1351+ xstar = yp * cotanA ;
1352+ ystar = yp ;
13531353 } 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 ;
13561369 }
1357- xstar = r * Math . cos ( a ) ;
1358- ystar = r * Math . sin ( a ) ;
13591370 }
13601371
13611372 return [ xstar , ystar ] ;
@@ -1365,7 +1376,7 @@ function findIntersectionXY(v0, v1, a, xpyp) {
13651376// rearranged into 0 = a*x^2 + b * x + c
13661377//
13671378// where f(x) = m*x + t + yp
1368- // and x01 = (-b +/- del) / (2*a)
1379+ // and (x0, x1) = (-b +/- del) / (2*a)
13691380function findXYatLength ( l , m , xp , yp ) {
13701381 var t = - m * xp ;
13711382 var a = m * m + 1 ;
@@ -1454,15 +1465,14 @@ function makePolygon(r, sector, vangles) {
14541465function findPolygonOffset ( r , sector , vangles ) {
14551466 var minX = Infinity ;
14561467 var minY = Infinity ;
1468+ var vertices = makePolygon ( r , sector , vangles ) ;
14571469
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 ] ) ;
14641474 }
1465- return { top : minY + r , left : minX + r } ;
1475+ return [ minX , minY ] ;
14661476}
14671477
14681478function invertY ( pts0 ) {
@@ -1564,6 +1574,7 @@ function strRotate(angle) {
15641574 return 'rotate(' + angle + ')' ;
15651575}
15661576
1577+ // to more easily catch 'almost zero' numbers in if-else blocks
15671578function clampTiny ( v ) {
15681579 return Math . abs ( v ) > 1e-10 ? v : 0 ;
15691580}
0 commit comments