Cuadrados Espaciados Concéntricos


Objetivo: Cuadrados Espaciados Concéntricos
Buenas!

Creo que seria interesante tener un lugar, ya sea un post o si llega un día..un foro..jeje , dedicado al dibujo.
Con sus subforos. Podríamos tener, Cairo o Paint, OpenGL, SDL ( cosa que no vemos mucho).

Actualmente estoy viendo esta página donde aprendo un poco de PyGame. Aunque tengo manuales.

Programar juegos arcades con Pygame

Como es logico es para Python. Aunque acabo de comenzar y aun no me entero bien del tema.
Al realizar un ejemplo de dibujar rectángulos, no daba con el problema.
Imaginar que queréis dibujar algo como esto: ( Está hecho con gambas )

rectangulos

Me encontré el mismo problema tanto en PyGame como con gambas, no entendía por que me salía esto.
No es cuestión de saber el lenguaje, es cuestión de entender el problema.

rectangulos_mal

Cuando hacemos las cosas a veces no nos damos cuenta.
En este caso es un área de dibujo de 500 x 500, Cuando dibujamos un rectángulo tenemos el vértice superior izquierda
y el vértice inferior derecha.

Así que en este dibujo, los lados de nuestro rectángulo van disminuyendo a medida que nuestro vértice superior izquierdo se va desplazando hacía la derecha.
Nuestro vértice inferior izquierda se desplaza a la izquierda.

Pero, ah, ese era el problema. Donde comienza a dibujar tienes una parte por la izquierda y otro por la derecha, ( del mismo tamaño que debes restar
al segmento o lado que dibujas). Con lo que debes restar esos dos pequeños segmentos al segmento que forma nuestro lado.

Public Sub Form_Open()

End

Public Sub Dibujar()

Dim i As Integer

Paint.LineWidth = 2

For i = 0 To 500 Step 10
'Esto no vale
'Paint.Rectangle(i, i, 500 - i, 500 - i)
Paint.Rectangle(i, i, 500 - i * 2, 500 - i * 2)
Next
Paint.Stroke

End

Public Sub drw_Draw()

Dibujar

End



Ejercicio:

A los "osados", ¿ y si quiero tener rectángulos rellenos de colores ?. Pudiendo ver cada relleno de los colores.
¿ Necesitaremos un Paint.FIll para rellenar nuestros rectángulos ?.
¿ Cómo evitareis esto ?. Es que quiero ver lo mismo, pero con colores rellenos.

unsolocolor

Pd, ¿ Sabíais que el ejemplo anterior es más fácil en gambas ?.
Esto es en PyGame. No es que sea muy grande pero si hay que usar otras cosas más.

conpygame

Código:
# Importamos la librería de funciones llamada 'pygame'
# Tenemos que tener instalada la librería
import pygame
# inicializamos el motor de juegos
pygame.init()

# Definimos algunos colores
NEGRO = ( 0, 0, 0)
BLANCO = ( 255, 255, 255)

# Podemos usar la web www.colorpicker.com para ver la gama de colores
# El formato es ( R, G, B )

# Ponemos el ancho y alto del area de dibujo
# tama = [ ancho, alto ]

tama = [500, 500]
pantalla = pygame.display.set_mode(tama)

# Titulo de la ventana
pygame.display.set_caption('Rectángulos concéntricos espaciados')

# Se repetira hasta que el usuario haga clic en el botón de cerrar
done = False

# Lo usamos para que administre con cuanta rapidez actualizamos la pantalla
reloj = pygame.time.Clock()

# ---------- Programa Principal ----------------
while not done:
# Todos los eventos que queremos procesar deben ir debajo de este comentario
for evento in pygame.event.get(): # El usuario hace alguna cosa
if evento.type == pygame.QUIT:
done = True

# Todos los eventos que queremos procesar deben ir encima de este comentario

# Todo el codigo para dibujar debería ir debajo de este comentario

# Limpia la ventana y establece el color de fondo
pantalla.fill(BLANCO)

# Actualiza por completo nuestra pantalla Pygame
pygame.display.flip()

for i in range(0, 500, 10):
pygame.draw.rect(pantalla, NEGRO, [i, i, 500-i*2, 500-i*2], 2)

# Todo el codigo para dibujar debería ir encima de este comentario
# Limite de 20 imagenes por segundos
reloj.tick(20)

# Para salir
pygame.quit()


Saludos

última edición por Shell el Jueves, 10 Marzo 2016, 11:36; editado 2 veces

Rectangulos.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos.tar.gz
Tamaño: 11.98 KB
Descargado: 43 veces
Rectangulos.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos.tar.gz
Tamaño: 11.98 KB
Descargado: 43 veces
Rectangulos.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos.tar.gz
Tamaño: 11.98 KB
Descargado: 43 veces

Objetivo: Re: Cuadrados Espaciados Concéntricos
Fijaros el efecto que hace Stroke.

Public Sub Form_Open()

End

Public Sub Dibujar()

Dim i As Integer

Randomize

Paint.LineWidth = 2

For i = 0 To 500 Step 10
Paint.Rectangle(i, i, 500 - i * 2, 500 - i * 2)
Paint.Brush = Paint.Color(Color.RGB(Rnd * 255, Rnd * 255, Rnd * 255))
'Descomentar despues de la primera ejecución
Paint.Stroke
Next
'Primera ejecución. Comentar despues de la primera ejecución
'Paint.Stroke()

End

Public Sub drw_Draw()

Dibujar

End



Dentro del bucle se dibuja cada uno de los lado concéntricos en colores aleatorios, solo que el bucle es tan rápido
que no da tiempo a verlo. Obteniendo algo como esto:

rectangulos_a_un_solo_color_1457607337_544423

Fijaros el efecto de refresco que hace el DrawingArea cuando pasáis un ventana por encima de el, cuando
lo movéis. Cuando seleccionamos una ventana y luego la del dibujo

Si queramos que nuestro dibujo permaneciera, deberíamos usar banderas.

Ahora descomentamos el Paint.Stroke del interior del bucle y comentamos el externo.

rectangulos_bordes_distintos_colores

Con eso, quizás tenemos la pista para rellenar de colores los cuadrados.

Vaya, he puesto rectángulos, cuando son cuadrados.

Saludos


Rectangulos2.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos2.tar.gz
Tamaño: 12.12 KB
Descargado: 43 veces
Rectangulos2.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos2.tar.gz
Tamaño: 12.12 KB
Descargado: 43 veces
Rectangulos2.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos2.tar.gz
Tamaño: 12.12 KB
Descargado: 43 veces

Objetivo: Re: Cuadrados Espaciados Concéntricos
Parece que el número de pasos en el bucle es la mitad del lado. Es algo que no se.
Pero si se hace una especie de animación hace un efecto bien raro.

Se siguen moviendo los vértices...

Private i As Integer

Public Sub Form_Open()

Randomize
Timer1.Delay = 18
Timer1.Start

End


Public Sub Dibujar2b()

Paint.Rectangle(i, i, 500 - i * 2, 500 - i * 2)
'Paint.Brush = Paint.Color(Color.RGB(Rnd * 255, Rnd * 255, Rnd * 255))
Paint.Brush = Paint.Color(Color.Green)
Paint.Fill(True)
Paint.Brush = Paint.Color(Color.Black)
Paint.Stroke

End

Public Sub drw_Draw()

Dibujar2b

End

Public Sub Timer1_Timer()

If i = 500 Then
Timer1.Stop
Else
i += 10
Endif
drw.Refresh

End


Por eso el bucle en los otros ejemplos, debería ser 250, En el timer se puede poner el limite a 250.
Y no veremos ese "rebote"

Había cometido el mismo error, el limite del tamaño del área de dibujo, y me estaba llegando al borde de este,
cuando solo debería llegar a la mitad. Pero no se ve. Quizás al hacer la segunda pasada del dibujo, se debería ver mas grueso el trazado.
En PyGame si lo he visto. ( El mismo error ).

Saludos

última edición por Shell el Jueves, 10 Marzo 2016, 14:01; editado 3 veces

Rectangulos4.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos4.tar.gz
Tamaño: 12.26 KB
Descargado: 46 veces
Rectangulos4.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos4.tar.gz
Tamaño: 12.26 KB
Descargado: 46 veces
Rectangulos4.tar.gz
Descripción:  
Descargar
Nombre del archivo: Rectangulos4.tar.gz
Tamaño: 12.26 KB
Descargado: 46 veces

Objetivo: Re: Cuadrados Espaciados Concéntricos
Después de ver "una posible" forma de hacer el ejercicio.
El "borde" del primer cuadrado aparenta ser la mitad de los otros. ¿ Alguien sabe el por qué ?.

rellenocolores

Public Sub Form_Open()
Randomize
End

Public Sub Dibujar() 'Posibilidad Una

Dim i As Integer
Dim anchodebrocha As Integer

anchodebrocha = 50
Paint.LineWidth = anchodebrocha

For i = 0 To 250 Step anchodebrocha
Paint.Rectangle(i, i, 500 - i * 2, 500 - i * 2)
Paint.Brush = Paint.Color(Color.RGB(Rnd * 255, Rnd * 255, Rnd * 255))
Paint.Stroke
Next

End

Public Sub drw_Draw()

Dibujar

End


Seguro que me vuelvo a confundir en lo mismo.
No hay nada mejor que la depuración. Es una cosa tan simple y ya veis como se complica.

Saludos

Objetivo: Re: Cuadrados Espaciados Concéntricos
Pues si, es distinto.

Si en vez de Paint.Stroke usamos Paint.Fill cambia totalmente y el ancho del cuadrado es el adecuado.

Public Sub Dibujar() 'Posibilidad Una

Dim i As Integer
Dim anchodebrocha As Integer

anchodebrocha = 50
Paint.LineWidth = anchodebrocha

For i = 0 To 250 Step anchodebrocha
Print i
Paint.Rectangle(i, i, 500 - i * 2, 500 - i * 2)
Paint.Brush = Paint.Color(Color.RGB(Rnd * 255, Rnd * 255, Rnd * 255))
Paint.Fill
Next

End


Por eso, había dos posibilidades. O bien dibujas los bordes con Stroke y un ancho de pincel o haces un cuadrado relleno, dentro de otro.

rectangulos_ancho_correcto

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.4852s (PHP: -66% SQL: 166%)
Consultas SQL: 49 - Debug off - GZIP Activado