22
33var Lib = require ( '../../lib' ) ;
44var Fx = require ( '../../components/fx' ) ;
5- var Registry = require ( '../../registry ' ) ;
5+ var getTraceColor = require ( '../scatter/get_trace_color ' ) ;
66
77module . exports = function hoverPoints ( pointData , xval , yval , hovermode ) {
88 var cd = pointData . cd ;
@@ -12,66 +12,55 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
1212 var xpx = xa . c2p ( xval ) ;
1313 var ypx = ya . c2p ( yval ) ;
1414
15- // Find the closest arrow base point to the hover point
16- var minDistance = Infinity ;
17- var closestPoint = null ;
18- var closestIndex = - 1 ;
19-
20- // Each cd[i] is a calcdata point object with x/y
21- for ( var i = 0 ; i < cd . length ; i ++ ) {
22- var cdi = cd [ i ] ;
23- if ( cdi . x === undefined || cdi . y === undefined ) continue ;
24-
25- var px = xa . c2p ( cdi . x ) ;
26- var py = ya . c2p ( cdi . y ) ;
27-
28- var distance = Math . sqrt ( ( xpx - px ) * ( xpx - px ) + ( ypx - py ) * ( ypx - py ) ) ;
29-
30- if ( distance < minDistance ) {
31- minDistance = distance ;
32- closestPoint = cdi ;
33- closestIndex = i ;
34- }
35- }
36-
37- var maxHoverDist = pointData . distance === Infinity ? Infinity : ( trace . hoverdistance || 20 ) ;
38- if ( ! closestPoint || minDistance > maxHoverDist ) return ;
39-
40- // Create hover point data with proper label values and spikeline support
41- var hoverPoint = {
42- x : closestPoint . x ,
43- y : closestPoint . y ,
44- u : trace . u ? trace . u [ closestIndex ] : undefined ,
45- v : trace . v ? trace . v [ closestIndex ] : undefined ,
46- text : Array . isArray ( trace . text ) ? trace . text [ closestIndex ] : trace . text ,
47- name : trace . name || '' ,
48- trace : trace ,
49- index : closestIndex ,
50- // Label values for formatting
51- xLabelVal : closestPoint . x ,
52- yLabelVal : closestPoint . y ,
53- uLabelVal : trace . u ? trace . u [ closestIndex ] : undefined ,
54- vLabelVal : trace . v ? trace . v [ closestIndex ] : undefined ,
55- // Spikeline support
56- xa : pointData . xa ,
57- ya : pointData . ya ,
58- x0 : closestPoint . x ,
59- x1 : closestPoint . x ,
60- y0 : closestPoint . y ,
61- y1 : closestPoint . y ,
62- distance : minDistance ,
63- spikeDistance : minDistance ,
64- curveNumber : trace . index ,
65- color : trace . line ? trace . line . color : 'blue'
15+ var distfn = function ( di ) {
16+ var x = xa . c2p ( di . x ) - xpx ;
17+ var y = ya . c2p ( di . y ) - ypx ;
18+ return Math . max ( Math . sqrt ( x * x + y * y ) , 1 - 3 / Math . max ( 3 , di . mrc || 0 ) ) ;
6619 } ;
6720
68- // Set hover text
69- var hovertext = trace . hovertext || trace . text ;
70- if ( hovertext && hovertext [ closestIndex ] ) {
71- hoverPoint . hovertext = hovertext [ closestIndex ] ;
72- }
21+ Fx . getClosest ( cd , distfn , pointData ) ;
7322
74- return [ hoverPoint ] ;
23+ // skip if we didn't find a close point
24+ if ( pointData . index === false ) return ;
25+
26+ // the closest data point
27+ var di = cd [ pointData . index ] ;
28+ var xc = xa . c2p ( di . x , true ) ;
29+ var yc = ya . c2p ( di . y , true ) ;
30+
31+ // now we're done using the whole `calcdata` array, replace the
32+ // index with the original index
33+ pointData . index = di . i ;
34+
35+ var u = trace . u ? trace . u [ di . i ] : 0 ;
36+ var v = trace . v ? trace . v [ di . i ] : 0 ;
37+
38+ // Build extraText to show u and v values
39+ var extraText = 'u: ' + u + ', v: ' + v ;
40+
41+ Lib . extendFlat ( pointData , {
42+ color : getTraceColor ( trace , di ) ,
43+
44+ x0 : xc - 3 ,
45+ x1 : xc + 3 ,
46+ xLabelVal : di . x ,
47+
48+ y0 : yc - 3 ,
49+ y1 : yc + 3 ,
50+ yLabelVal : di . y ,
51+
52+ uLabelVal : u ,
53+ vLabelVal : v ,
54+
55+ extraText : extraText ,
56+
57+ spikeDistance : Math . sqrt ( ( xpx - xc ) * ( xpx - xc ) + ( ypx - yc ) * ( ypx - yc ) ) ,
58+ hovertemplate : trace . hovertemplate
59+ } ) ;
60+
61+ Lib . fillText ( di , trace , pointData ) ;
62+
63+ return [ pointData ] ;
7564} ;
7665
7766
0 commit comments