Así que básicamente estamos buscando para condicionalmente mostrar un texto de ayuda cuando la posición del cursor cumple con el requisito de que es más de una línea en la tabla. Dado que las líneas no son una entidad con la que podamos trabajar, es necesario calcular la línea entre los dos puntos más cercanos a cada lado del cursor y luego ver si su posición actual se encuentra en ella. Que simplifica tu ejemplo un poco:
función para calcular la distancia entre dos puntos:
function lineDistance(p1x, p1y,p2x, p2y) {
return Math.sqrt((p2x - p1x)*(p2x - p1x) + (p2y-p1y)*(p2y-p1y));
}
Suponiendo que sus dos puntos más próximos son A y B para el cursor C, entonces la distancia debe ser igual a AB
AC + BC
.
Para determinar si está en la línea: Math.abs(AB-(AC+BC)) < SomeThreshold
. El uso del umbral esencialmente dibuja un cuadro alrededor de la línea en la que puede caer el cursor.
A continuación, la ampliación de su código en los plothover
(jsFiddle)
$(placeholder).bind("plothover", function (event, pos, item) {
if (item) {
var tipText;
if (opts.xaxis.mode === "time" || opts.xaxes[0].mode === "time") {
tipText = stringFormat(to.content, item, timestampToDate);
} else {
tipText = stringFormat(to.content, item);
}
$tip.html(tipText).css({
left: tipPosition.x + to.shifts.x,
top: tipPosition.y + to.shifts.y
}).show();
} else {
// Extended for line hover
var series = plot.getData();
var xBeforeIndex = 0;
var xAfterIndex = -1;
var Threshold = 0.0000025;
var i = 1;
while (i <= series[0].data.length && xAfterIndex==-1) {
if (xAfterIndex == -1 && pos.x > series[0].data[i][0]) {
xBeforeIndex = i;
} else if (xAfterIndex == -1) {
xAfterIndex = i;
}
i++;
}
var onTheLine =
lineDistance(
series[0].data[xBeforeIndex][0]/10000,series[0].data[xBeforeIndex][1],
pos.x/10000, pos.y)
+lineDistance(pos.x/10000, pos.y,
series[0].data[xAfterIndex][0]/10000,series[0].data[xAfterIndex][1])
-lineDistance(
series[0].data[xBeforeIndex][0]/10000,series[0].data[xBeforeIndex][1],
series[0].data[xAfterIndex][0]/10000,series[0].data[xAfterIndex][1]);
if (Math.abs(onTheLine) < Threshold) {
tipText = "Found Line";
$tip.html(tipText).css({
left: tipPosition.x + to.shifts.x,
top: tipPosition.y + to.shifts.y
}).show();
} else {
$tip.hide().html('');
}
}
});
cosas no hecho aquí:
- Verificar los casos de borde más apropiadamente - lo anterior supone el primer y último puntos están en el bordes del gráfico.
- Agregue en su segundo gráfico
- Mejore el rendimiento de búsqueda del conjunto de datos utilizando un enfoque como bubblesort para encontrar los índices de antes/después.
- en cuenta que estoy reducción a escala del eje x por 10000. Los números eran demasiado grandes y en la gran brecha entre los dos primeros puntos hizo que las diferencias insignificantes eje Y (el resultado fue siempre cero entre estos dos puntos).
Nota: si agrega el segundo gráfico, necesitará buscar los puntos más cercanos para ambos gráficos y comprobar si se trata de una línea. Si sus líneas están cerca o se cruzan, podría simplemente hacer una línea de prioridad. Si le cuesta agregar la segunda línea, puedo ayudarlo más tarde.
¿cómo se desplaza el usuario sobre una información sobre herramientas? ¿no desaparecerá la información sobre herramientas cuando te concentres fuera del control? Si muestra un ejemplo, podría ayudarlo –
La información sobre herramientas para un punto de datos se representa mediante el uso del evento nativo "plothover" de flot, que se activa cuando un usuario se desplaza sobre un punto de datos. Sin embargo, no parece haber tal evento para la línea en sí. Un ejemplo sería difícil ya que está estrechamente integrado en la aplicación que estoy desarrollando. Veré lo que puedo hacer sin embargo. – gordyr
incluso un jsfiddle servirá, pero entiendo que podría ser difícil –