Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Dibujar. Refresco Del DrawingArea
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron