Gráficos vectoriales con Visual Basic .NET

Marzo 2003

Cipriano Valdezate Sayalero y Manuel Valdezate Sayalero

 


 

Trayectos

 

Sería muy interesante construir una clase que generara un deteminado dibujo para poder plasmarlo cuantas veces quisiéramos y donde quisiéramos. VSNET nos ofrece una. Se trata de GraphicsPath. GraphicsPath tiene estructura de colección, de tal modo que podemos añadir y/o eliminar a discreción las formas componentes del dibujo. El dibujo resultante queda así encapsulado dentro de un objeto de tipo GraphicsPath.

 

Además, GraphicsPath nos regala una capacidad añadida: el punto inicial de cada forma se conecta con el final de la forma anterior, a menos que lo impidamos invocando al método StartFigure(). Por eso se llama Path (camino, ruta), porque, salvo prohibición vía código, todas las formas se conectan formando una línea que las atraviesa a todas, formando su trayectoria, de ahí mi traducción de “trayecto”.

 

El siguiente ejemplo muestra la potencia de este objeto al reutilizarse para dibujar un eje cartesiano de coordenadas sobre una superficie milimetrada. He aquí nuestro objetivo:

 

 

Y aquí el código:

 

Private Sub DibujaGrid()

        Dim i As Short

        Dim Intervalo As Integer

 

        Dim Lienzo As Graphics = Me.CreateGraphics

 

        'Definimos tres objetos GraphicsPath

        'uno encapsulará los dos ejes

        'otro encapsulará la cuadrícula gruesa y el tercero la fina

 

        Dim Ejes As New GraphicsPath()

        With Ejes

            'Eje horizontal

            'La diferencia entre Me.Height y Me.ClientSize.Height

            'es que Me.Height mide la distancia entre los dos bordes,

            'mientras que Me.ClientSize.Height toma en cuenta sólo el área cliente.

            'El área cliente es la superficie del formulario en la que

            'se pueden depositar controles. Por tanto, están excluidos

            'del área cliente la barra de título y los bordes

 

.AddLine(New Point(Me.ClientSize.Width / 2, 0), (New Point(Me.ClientSize.Width / 2, Me.ClientSize.Height)))

.StartFigure() 'para que no una los dos ejes con otra línea

.AddLine(New Point(0, Me.ClientSize.Height / 2), New Point(Me.ClientSize.Width, Me.ClientSize.Height / 2))

        End With

 

        'el método DrawPath toma como argumentos

        'un lapicero y un trayecto

        'Aquí el trayecto lo devuelve la función Grid

        'escrita a continuación

 

        'Primero dibujamos la cuadrícula fina

Lienzo.DrawPath(New Pen(Color.LightGreen, 1), Grid(Me, 10))

Lienzo.DrawPath(New Pen(Color.LightGreen, 2), Grid(Me, 50)) 'luego la gorda

Lienzo.DrawPath(New Pen(Color.HotPink, 4), Ejes) 'y al final los ejes

        'El orden es importante porque determina qué líneas pasan por encima de cuáles

 

Lienzo.Dispose() 'Al final cerramos el objeto Graphics

End Sub

 

Private Function Grid(ByVal Formulario As Form, ByVal Intervalo As Integer) As GraphicsPath

        Dim i As Short

 

        'Necesitamos saber el resto obtenido de dividir la anchura o la altura

        'por la distancia entre cada línea recogida en el parámetro Intervalo

        'Para ello el operador mod nos viene que ni pintado.

        'Dividimos el resultado por dos para repartir el margen

        'a los dos extremos de la cuadrícula

        Dim MargenXInicial As Integer = (Formulario.ClientSize.Width Mod Intervalo) / 2

        Dim MargenYInicial As Integer = (Formulario.ClientSize.Height Mod Intervalo) / 2

 

        Dim Trayecto As New GraphicsPath()

        With Trayecto

 

            'Comenzando por el margen inicial, vamos dibujando líneas

            'guardando entre ellas la distancia que nos indica la variable Intervalo

 

            'Líneas verticales

For i = MargenXInicial To Me.Width - MargenXInicial Step Intervalo

                .AddLine(New Point(i, 0), New Point(i, Me.ClientSize.Height))

                .StartFigure()

Next

 

            'Líneas horizontales

For i = MargenYInicial To Me.Height - MargenYInicial Step Intervalo

                .AddLine(New Point(0, i), New Point(Me.ClientSize.Width, i))

                .StartFigure()

Next

 

        End With

 

        Return Trayecto

End Function

 

 


Índice del curso GDI+
 

la Luna del Guille o... el Guille que está en la Luna... tanto monta...