https://foro.gambas-es.org/viewtopic.php?f=1&t=6913
-----------------------------------
Shell
Sabado, 14 Abril 2018, 13:39

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".  :roll: 

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:

[code linenumbers=false syntax=gambas]
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
[/code]

Fijaros que he generado[b] dentro[/b] 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:

 [img]https://foro.gambas-es.org/files/images/768/generalineasrefresco.png[/img]

Pero...¿ No eran dos líneas ?.  :o  ;-)

¿ Quien sabe lo que ha ocurrido ?.  :roll:

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

[code linenumbers=false syntax=gambas]
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
[/code]

Obtenemos esto:

 [img]https://foro.gambas-es.org/files/images/768/volviendoainsistir.png[/img] 
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


-----------------------------------
Shell
Sabado, 14 Abril 2018, 13:57

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


