PDA

Ver la Versión Completa : Tchart y cálculo de valores en coordenadas del ratón (mouse)


fonx
26-10-2007, 11:23:29
Bueno, antes de nada comentar que no se porque el código para colocar imágenes está desactivado. En este post van dos imágenes, así q para verlas hay que hacer click en el enlace, y el post queda un poco deslucido. Solo es un comentario, nada más. Bueno, al grano :)

Tchart con varias series dibujadas. Mi intención es intentar calcular el valor de cada serie en el corte entre la serie y la X del ratón. Me explico, cuando paso el ratón por la gráfica este tiene unas coordenadas X e Y. La coordenada Y no me interesa, pero la X si ya que si pongo el puntero en un pixel determinado quiero que se me calcule el valor de cada serie a la misma altura X que la del ratón.

Obtener las coordenadas X e Y del ratón es sencillo:

chartGraficos.Canvas.Pixels[i,j];El primer problema es el siguiente, vease la siguiente imagen:

http://img141.imageshack.us/img141/1040/dibujozp7.gif

Las coordenadas del canvas, o tchart, o lo que sea empiezan en la flecha azul superior de la imagen. Las coordenadas de la flecha azul inferior seguro que son facilmente calculables. Pero lo que a mi me interesa son las coordenadas de las flechas rojas, es decir las coordenadas en el canvas del origen (el punto 0,0) y las coordenadas de la parte de arriba del gráfico, ya que como el gráfico es autoajustable al mayor de los valores de la gráficas, al tener el mayor valor de la gráfica y su x,y en el canvas y al tener el x,y en el canvas del 0,0 podemos calcular el valor en cada punto mediante una regla de tres ¿Me explico bien?

Pasemos al segundo problema, dando por hecho que hemos resuelto el primero. Echad un ojo a esta otra imagen:

http://img87.imageshack.us/img87/4790/dibujo2vk7.gif

Aquí muestro un zoom hecho al seleccionar con el ratón una parte del gráfico. ¿Ahora como hago para calcular los valores? Porque ya no tengo el punto 0,0, no el mayor valor de las series. Aquí de momento no tengo ideas para intentar solucionarlo. ¿Alguna idea?

Espero haber planteado bien el problema para q se entienda. Gracias de antemano por las posibles respuestas :)

rounin
26-10-2007, 17:18:58
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var xx, yy1, yy2: Double;
idx: TValuePos;
begin
{Screen coord -> Plot coord}
xx := Chart1.BottomAxis.CalcPosPoint(X);

{Binary search and interpolation (units in attachment) }
yy1 := ValueAt(ArrayAdapter(Series1, 'x'), ArrayAdapter(Series1, 'y'), xx);
{or}
if BinSearch(ArrayAdapter(Series2, 'x'), xx, idx)
then yy2 := ValueAt(ArrayAdapter(Series2, 'y'), idx)
else yy2 := NaN; // out of range

Caption := Format('%.3f %.3f %.3f', [xx, yy1, yy2]);
end;

fonx
29-10-2007, 10:09:10
Hey Rounin esto tiene muy buena pinta, busqueda binaria, interpolación...unas units muy útiles. Pero tengo un problema, en el IntegerFn y en el DoubleFn hay una directiva include

{$INCLUDE Fn.inc}

que no se puede resolver porque no tengo el archivo Fn.inc, y no vale quitar el include. ¿Que archivo es ese? ¿Viene en algún paquete de delphi? Estuve googleando a ver si encontraba algo referente al autor de estas units pero no encontré nada. ¿Me puedes echar una mano?

Muchas gracias de antemano, si esto funciona va a quedar muy muy chulo :)

fonx
29-10-2007, 10:40:27
¿Será porque uso Delphi5? ¿Alguien con otra versión más actual tiene ese fichero?

rounin
29-10-2007, 11:00:53
Eso es mi archivo, un parte de libreria de algoritmos genericos.

fonx
29-10-2007, 11:54:22
Esto funciona Rounin, eres un crack! :), solo me queda configurarlo para que me muestre las coordenadas de las gráficas que tengo pintadas y poco más.

Muchas gracias por la ayuda, este post puede ayudar a mucha gente que quiere hacer algo similar con el TChart.

Angel Fernández
17-07-2008, 15:24:56
Reflotando este hilo de hace ya casi 9 meses, me gustaría preguntar al foro si se puede saber qué serie es la que está siendo apuntada por el ratón en ese momento.

Esto que pregunto es útil cuando se representan muchas series en un gráfico de líneas, por ejemplo 20 ó 30 y aún con los colores no son suficiente para distinguir tantas líneas. Entonces, tú pones el ratón encima de una serie y en el hint o en un label, te dice qué serie es esa. Lo que hace Excel con los gráficos, vamos.

Gracias de antemano.

Un saludo.

Caro
17-07-2008, 16:32:07
Hola Angel Fernandez, puedes utilizar la función Clicked de la serie, ejemplo, digamos que tenemos dos series (Series1, Series2) en un Chart.


procedure TForm1.Chart1ClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Series1.Clicked(x,y)<>-1 then
showmessage('Serie 1');

if Series2.Clicked(x,y)<>-1 then
showmessage('Serie 2');
end;


Estoy utilizando el evento OnClickSeries, por lo que se va ejecutar cuando hagas click sobre alguna de las series, pero tu puedes utilizar otro evento como OnMouseMove...

Saluditos

Angel Fernández
17-07-2008, 22:58:24
Muchas gracias Caro, tu código me ha resuelto el problema.

Con tu permiso lo he depurado un poco. Muestra en un hint el título de la serie sobre la que hacer clic:

Colocar este código en el evento chart1.clickseries

for i:=0 to dbChart1.SeriesList.Count do
if dbChart1.Series[i].Clicked(x,y)<>-1 then
begin
txt:='Sensor '+dbChart1.SeriesList.Series[i].Title;
Break;
end;

dbchart1.Hint:=txt;
Application.HintPause:=1; //para que muestre enseguida el hint
dbchart1.ShowHint:=True;
Application.ActivateHint(Mouse.CursorPos); //muestra el hint


Un saludo.

Caro
18-07-2008, 00:26:27
No tienes que pedir permiso amiguito, me alegra que te haya servido ;).

Saluditos