24 de agosto de 2006

Gráficas de tarta con código VFP puro


Artículo original: PIE GRAPHICS WITH PURE VFP CODE
http://weblogs.foxite.com/vfpimaging/2006/03/24/pie-graphics-with-pure-vfp-code/
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York




¿Sabía usted que es posible dibujar un gráfico al estilo tarta con VFP sin necesidad de emplear ningún ActiveX o llamar a una función API? ¿Con código VFP puro?

Para dibujar cualquier círculo hay dos parámetros principales: un punto con las coordenadas en el centro del círculo (x,y) y el radio. Teniendo esto, es muy fácil calcular las coordenadas de cualquier punto en el borde de la circunferencia.

Incluso, si ya ha utilizado antes GDI+ o cualquier ActiveX para dibujar gráficos, pienso que es interesante conocer cómo se puede crear un círculo y cómo calcular las posiciones de cada punto.

Con este propósito, necesitaré recordarle los conceptos de seno y coseno.

En cualquier triángulo rectángulo, para cada ángulo:

Seno del ángulo = longitud del lado opuesto / longitud de la hipotenusa
Coseno del ángulo = longitud del lado adyacente / longitud de la hipotenusa

Hipotenusa de un triángulo es el lado más largo, el que es el opuesto al ángulo recto. El lado adyacente es el lado entre el ángulo en cuestión y el ángulo recto. El lado opuesto es el opuesto al ángulo en cuestión.


Entonces, imagine un triángulo rectángulo dentro de una circunferencia, como la imagen que se muestra debajo.

Seno del ángulo = el lado opuesto (altura o "Y") / hipotenusa (Radio) !!!

Altura = Seno del ángulo * Radio


Coseno del ángulo = lado adyacente (Ancho o "X" / hipotenusa (Radio) !!!

Ancho = Coseno del ángulo * Radio


Ahora, podemos crear un lazo comenzando con el ángulo 0 (cero) y terminando en 360 grados. Para cada paso, podemos calcular la posición de cada punto del círculo.

Entonces, todo será más sencillo para dibujar el gráfico. Para todos los propósitos., voy a utilizar el objeto line para dibujar líneas desde el centro del círculo hasta el punto X,Y que acabamos de calcular. ¡¡¡ Y eso es todo !!!

Existe un problema con el objeto line en VFP. Para dibujar una línea, necesitamos utilizar las propiedades Top, Left, Width, Height y LineSlant (especifica la forma de inclinación de las líneas, en dependencia del ángulo y la posición resultante en el cuadrante (un cuarto de la conferencia o círculo), necesité crear algo de código extra para ocuparme de eso. Preste atención al comando DO CASE que se muestra debajo.

PROCEDURE DRAWPIE
  PARAMETERS tnCenterX, tnCentery, tnRadius, tnStart, tnEnd, tnColor
  LOCAL lnLineWidth, n, x, y, lcObj, lnPointLeft, lnPointTop, lcSlant
  lnLineWidth = 3
  FOR n = tnStart TO tnEnd STEP (1 * lnLineWidth)
    x = COS(DTOR(n)) * tnRadius
    y = SIN(DTOR(n)) * tnRadius
    lcObj = "line" + TRANSFORM(n*100)
    Thisform.Container1.AddObject(lcObj,"line")
    DO CASE 
      CASE n >= 0 AND n < 90 && 1er cuadrante
        lnPointLeft = tnCenterX
        lnPointTop = tnCenterY - y
        lcSlant = "/"
      CASE n >=90 AND n < 180 && 2do cuadrante
        lnPointLeft = tnCenterx + x
        lnPointTop = tnCenterY - y
        lcSlant = "\"
      CASE n >= 180 AND n < 270 && 3er cuadrante
        lnPointLeft = tnCenterX + x
        lnPointTop = tnCenterY
        lcSlant = "/" 
      CASE n >= 270 AND n <= 360 && 4to cuadrante
        lnPointLeft = tnCenterX
        lnPointTop = tnCenterY
        lcSlant = "\" 
    ENDCASE 
    WITH Thisform.Container1.&lcObj.
      .LineSlant = lcSlant
      .BorderColor = tnColor
      .BorderWidth = lnLineWidth
      .Width = ABS(x)
      .Height = ABS(y)
      .left = lnPointLeft
      .Top = lnPointTop
      .Visible = .T.
    ENDWITH
  ENDFOR
RETURN

Puede que encuentre un poco lento este procedimiento, especialmente si lo ejecuta en una máquina lenta; ¡ pero funciona ! El problema fundamental es que añade muchos objetos en un formulario, en el caso de un lazo con paso 1, ¡ al menos 360 líneas!

Si dibujamos una línea con BorderWidth = 1, en algunos casos, los puntos calculados creará unos huecos entre las líneas. Un borde más ancho resolverá el problema. El paso más grande en el lazo (desde 0 a 360 grados), el más rápido el procedimiento que ejecuta, y menos objetos los que serán agregados.

Ejecute el formulario PieGraphics.scx desde el archivo adjunto, cambie los valores del cursor, radio, pasos y linewidth (ancho de líneas) y verifique todos los procedimientos para entender mejor este artículo.

¿Qué es lo próximo?

Por supuesto, en uno de mis futuros post, voy a trabajar el Gráfico de estilo tarta utilizando GDI+
Algunos de los aspectos descritos aquí, ayudarán a crear más gráficos interesantes.

Como siempre, por favor, envíe sus comentarios, sugerencias o arreglos.

Nota de la traductora: Junto a la autorización para publicar la traducción de este artículo, el autor, ha solicitado que: (y escribo textualmente) "coloque una referencia al artículo en UTMAG (http://www.utmag.com/wconnect/wc.dll?9,7,10,Spanish,2094), que aborda el tema de modo más completo, pero utilizando GDI+ (obviamente, ya traducido al español). Contiene códigos fuente, con una clase que permite crear gráficos planos y 3D, controlando la altura, controlar el tamaño del círculo, a colores y monocromático y colores en gradientes , separar trozos y controlar la distancia del centro , escribir encima de los trozos, agregar un título al gráfico, crear leyendas, controlar fuentes, controlar colores del trozo y del borde, ocultar trozos"


No hay comentarios. :

Publicar un comentario