Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2007
fonx fonx is offline
Miembro
 
Registrado: Feb 2007
Posts: 54
Poder: 12
fonx Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 26-10-2007
rounin rounin is offline
Miembro
 
Registrado: Sep 2005
Posts: 43
Poder: 0
rounin Va por buen camino
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;

Última edición por rounin fecha: 06-10-2008 a las 14:05:13.
Responder Con Cita
  #3  
Antiguo 29-10-2007
fonx fonx is offline
Miembro
 
Registrado: Feb 2007
Posts: 54
Poder: 12
fonx Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 29-10-2007
fonx fonx is offline
Miembro
 
Registrado: Feb 2007
Posts: 54
Poder: 12
fonx Va por buen camino
¿Será porque uso Delphi5? ¿Alguien con otra versión más actual tiene ese fichero?
Responder Con Cita
  #5  
Antiguo 29-10-2007
rounin rounin is offline
Miembro
 
Registrado: Sep 2005
Posts: 43
Poder: 0
rounin Va por buen camino
Eso es mi archivo, un parte de libreria de algoritmos genericos.

Última edición por rounin fecha: 06-10-2008 a las 14:05:13.
Responder Con Cita
  #6  
Antiguo 29-10-2007
fonx fonx is offline
Miembro
 
Registrado: Feb 2007
Posts: 54
Poder: 12
fonx Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 17-07-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: May 2004
Ubicación: Valencia - España
Posts: 141
Poder: 15
Angel Fernández Va por buen camino
¿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.
Responder Con Cita
  #8  
Antiguo 17-07-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: Jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 16
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 17-07-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: May 2004
Ubicación: Valencia - España
Posts: 141
Poder: 15
Angel Fernández Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 18-07-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: Jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 16
Caro Va por buen camino
No tienes que pedir permiso amiguito, me alegra que te haya servido .

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
mover VertScrollBar con la rueda del ratón (mouse) TrUnkS OOP 3 27-02-2007 04:46:34
Coordenadas TWebBrowser Delar Varios 2 03-11-2006 21:26:23
Coordenadas en el PaintBox fabiof2000 Gráficos 2 27-09-2006 10:08:03
pasar coordenadas gps a coordenadas builder iaav1 C++ Builder 3 03-07-2006 19:59:02
Representar coordenadas 3D blueicaro OOP 5 20-04-2006 17:03:14


La franja horaria es GMT +2. Ahora son las 00:51:14.


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