Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Tchart y cálculo de valores en coordenadas del ratón (mouse) (https://www.clubdelphi.com/foros/showthread.php?t=49656)

fonx 26-10-2007 11:23:29

Tchart y cálculo de valores en coordenadas del ratón (mouse)
 
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:

Código:

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



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:



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

Código:


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

Código:

{$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

¿Se puede saber qué serie está debajo del puntero del ratón?
 
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.

Código Delphi [-]
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

Código Delphi [-]
  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


La franja horaria es GMT +2. Ahora son las 02:03:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi