Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

lunes, 15 de octubre de 2012

Lista de Poligonos: ejemplo de uso de clases

Este es un pequeño ejemplo de como usar clases contenidas en otras clases.

Este es un ejemplo de uso de clases que contienen array de otras clases.
Lo podéis usar, en problemas donde una lista contienen otra lista de objetos, y a su vez esa lista contienen otras listas.
 
Queremos generar el dibujo de una lista de polígonos. Esta lista de polígonos esta compuesta por polígonos que tienen una propiedad de color y una lista de vértices o coordenadas. Este número de vértices es aleatorio, pueden variar de 2 a 7. Y el color puede ser elegido por el usuario.

Podemos hacer el siguiente esquema:
  Siguiendo este esquema podemos desarrollar las clases, con sus propiedades y métodos.

Clases Coordenada:
-->
' Gambas class file

'un vertice del poligono
Property x0 As Integer
Private hx0 As Integer

Property y0 As Integer
Private hy0 As Integer

Private Function x0_Read() As Integer

Return hx0

End

Private Sub x0_Write(Value As Integer)

hx0 = value

End

Private Function y0_Read() As Integer

Return hy0

End

Private Sub y0_Write(Value As Integer)

hy0 = value

End

Clase Poligono:
-->

' Gambas class file

Property colores As Integer
Private hcolores As Integer

Property puntos As ClassCoordenada[]

Private hpuntos As New ClassCoordenada[]

Private Function puntos_Read() As ClassCoordenada[]

Return hpuntos

End

Private Sub puntos_Write(Value As ClassCoordenada[])

hpuntos = Value

End

Private Function colores_Read() As Integer

Return hcolores

End

Private Sub colores_Write(Value As Integer)

hcolores = Value

End

Public Sub dibuja(area As DrawingArea)

Dim a As Integer

Draw.Begin(area)
'dibujo la linea con el color del poligono
Draw.Foreground = hcolores
For a = 0 To hpuntos.Max - 1
Draw.Line(hpuntos[a].x0, hpuntos[a].y0, hpuntos[a + 1].x0, hpuntos[a + 1].y0)
Next

Draw.Line(hpuntos[hpuntos.max - 1].x0, hpuntos[hpuntos.max - 1].y0, hpuntos[hpuntos.max].x0, hpuntos[hpuntos.max].y0)

Draw.End

End

Clase Lista de Poligonos:
-->
' Gambas class file

Property pol As ClassPoligono[]
Private hpol As New ClassPoligono[]

Private Function pol_Read() As ClassPoligono[]

Return hpol

End

Private Sub pol_Write(Value As ClassPoligono[])

hpol = value

End

Public Sub dibujo(area As DrawingArea)

Dim p As ClassPoligono

'recorremos la lista...
 
For Each p In hpol
p.dibuja(area)
Next

End

Ahora vamos al formulario principal:



Y su código:
-->
' Gambas class file

Public poligonos As New ClassArrayPoligonos 'lista de poligonos..

Public Sub _new()

End

Public Sub Form_Open()

Randomize 'generador aleatorio iniciado...
Me.center

End

Public Sub ToggleButton1_Click()

Dialog.Color = ToggleButton1.background
If Dialog.SelectColor() Then Return
ToggleButton1.background = Dialog.Color

End

Public Sub ButtonCrea_Click()

Dim pol As New ClassPoligono
Dim pto As ClassCoordenada
Dim a As Integer
'creo un poligono, el color lo elige el usuario, y con N puntos aleatorias...

pol.colores = ToggleButton1.background
For a = 0 To Rnd(2, 8) ' de 2 puntos a 7 puntos...
pto = New ClassCoordenada
pto.x0 = Int(Rnd(0, DrawingArea1.w))

pto.y0 = Int(Rnd(0, DrawingArea1.h))

pol.puntos.Add(pto)
pto = Null
Next

'añado el poligono creado al array de poligonos...
poligonos.pol.Add(pol)
ButtonRedibuja_Click()

End

Public Sub ButtonRedibuja_Click()

'dibujo los poligonos...
poligonos.dibujo(DrawingArea1)
LabelNumero.text = poligonos.pol.Count

End

Public Sub ButtonOkBorrado_Click()

If ValueBox1.value <= poligonos.pol.max Then poligonos.pol.Delete(ValueBox1.value)

If poligonos.pol.count = 0 Then
DrawingArea1.Background = &HFFFFFF&
Else
DrawingArea1.Clear()
Endif

ButtonRedibuja_Click()
ValueBox1.value = 0

End

Video explicativo:
Código fuente del ejemplo: enlace
(realizado en gambas 3.3.90)

No hay comentarios:

Publicar un comentario

A falta de donativos... un poco de publicidad