Dibujar. Refresco Del DrawingArea


Objetivo: Dibujar. Refresco Del DrawingArea
Buenas!.

Hoy me lleve una sorpresa que ya conocía pero no me hacía a la idea.
Si haces un dibujo en el cual pintas cinco lineas al azar, empiezas por la primera
y terminas por la ultima.. Ojo, he dicho trazadas "al azar".

Ahora bien, ¿ cómo trasladas eso a hacerlo en un DrawingArea con la clase Paint ?.

En DrawingArea tenemos un método que es Dibujar. Draw.
Entonces si relacionamos lo que hicimos para dibujar en nuestro papel esas cinco líneas.
Podríamos interpretarlo de la misma forma dentro del método Draw del DrawingArea,
trazaríamos nuestras cinco líneas.

Es algo repetitivo, ¿no ?. Entonces podíamos usar un bucle. Pero,
¿ recordáis que los trazados eran aleatorios ?.

En este caso si llamamos a una función que genera las coordenadas de cada una de esas líneas.
podemos llevarnos una sorpresa.

Le digo al procedimiento, generame dos líneas aleatorias en el DrawingArea. Pero también antes
creame un circulo y ya luego trazas las líneas. Todo eso en el método Draw del DrawingArea.

Así que nuestro programa podría ser de esta forma:

Const RADIO As Integer = 100

Private cpizarra As New Point
Private acordenadas As New Float[][]

Public Sub Form_Open()

Randomize

cpizarra.x = Pizarra.W / 2
cpizarra.Y = Pizarra.H / 2

End

Public Sub CrearCoordenadas(x0 As Float, y0 As Float, n As Integer)

Dim i As Integer
Dim dx As Float
Dim dy As Float
Dim d As Float
Dim listacoordenadas As New Float[]

For i = 0 To n - 1
d = Rnd(0, Pi * 2)
dx = x0 + RADIO * Sin(d)
dy = y0 + RADIO * Cos(d)
listacoordenadas.Insert([x0, y0, dx, dy])
acordenadas.Add(listacoordenadas.Copy())
listacoordenadas.Clear
Next

End

Public Sub DibujaCirculo()

Paint.LineWidth = 2
Paint.Arc(cpizarra.x, cpizarra.y, RADIO)
Paint.Brush = Paint.Color(Color.Red)
Paint.Stroke

End

Public Sub DibujaLineas()

Dim coordenada As Float[]

Paint.LineWidth = 2
For Each coordenada In acordenadas
Paint.MoveTo(coordenada[0], coordenada[1])
Paint.LineTo(coordenada[2], coordenada[3])
Next
Paint.Brush = Paint.Color(Color.Blue)
Paint.Stroke

End

Public Sub Pizarra_Draw()

CrearCoordenadas(cpizarra.x, cpizarra.y, 2)
DibujaCirculo()
DibujaLineas()

End


Fijaros que he generado dentro del método Draw, las coordenadas y luego he dibujado el circulo y le he dicho que dibuje las líneas.

Con eso obtendríamos esto:

generalineasrefresco

Pero...¿ No eran dos líneas ?.

¿ Quien sabe lo que ha ocurrido ?.

Ahora bien, hagamos lo mismo con la generación de las coordenadas fuera del método Draw.

Const RADIO As Integer = 100

Private cpizarra As New Point
Private acordenadas As New Float[][]

Public Sub Form_Open()

Randomize

cpizarra.x = Pizarra.W / 2
cpizarra.Y = Pizarra.H / 2
CrearCoordenadas(cpizarra.x, cpizarra.y, 2)

End

Public Sub CrearCoordenadas(x0 As Float, y0 As Float, n As Integer)

Dim i As Integer
Dim dx As Float
Dim dy As Float
Dim d As Float
Dim listacoordenadas As New Float[]

For i = 0 To n - 1
d = Rnd(0, Pi * 2)
dx = x0 + RADIO * Sin(d)
dy = y0 + RADIO * Cos(d)
listacoordenadas.Insert([x0, y0, dx, dy])
acordenadas.Add(listacoordenadas.Copy())
listacoordenadas.Clear
Next

End

Public Sub DibujaCirculo()

Paint.LineWidth = 2
Paint.Arc(cpizarra.x, cpizarra.y, RADIO)
Paint.Brush = Paint.Color(Color.Red)
Paint.Stroke

End

Public Sub DibujaLineas()

Dim coordenada As Float[]

Paint.LineWidth = 2
For Each coordenada In acordenadas
Paint.MoveTo(coordenada[0], coordenada[1])
Paint.LineTo(coordenada[2], coordenada[3])
Next
Paint.Brush = Paint.Color(Color.Blue)
Paint.Stroke

End

Public Sub Pizarra_Draw()

DibujaCirculo()
DibujaLineas()

End


Obtenemos esto:

volviendoainsistir
Ahora si. Dos líneas. Todo por anticipado, la creación de las coordenadas.

¿ Os acordáis de la clase Draw ?. ¿ De la cache del DrawingArea ?
Aparentemente tenemos tres ordenes en el método Draw en la primera forma.
Se podrían haber dibujado 6 líneas. Tan solo que al mover ventanas, menús, se actualiza
la zona de dibujo del DrawingArea y comienza a generar y a generar líneas una y otra vez.

No es como dibujar en un papel..me cachis!.

Saludos

Objetivo: Re: Dibujar. Refresco Del DrawingArea
No he vuelto a usar desde hace años la propiedad cache del DrawingArea.
Siempre la tengo a False.

Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4905s (PHP: -50% SQL: 150%)
Consultas SQL: 44 - Debug off - GZIP Activado