https://foro.gambas-es.org/viewtopic.php?f=1&t=5236&p=30845#p30845
-----------------------------------
Shell
Jueves, 10 Marzo 2016, 11:25

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.

[url=http://programarcadegames.com/index.php?lang=es]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 )

 [img]http://foro.gambas-es.org/files/images/768/rectangulos.png[/img]

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.

 [img]http://foro.gambas-es.org/files/images/768/rectangulos_mal.png[/img] 

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.

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

[/code]

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

 [img]http://foro.gambas-es.org/files/images/768/unsolocolor.png[/img] 

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. :-)

 [img]http://foro.gambas-es.org/files/images/768/conpygame.png[/img] 

Código:
[code linenumbers=false syntax=python]
# 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()
[/code]

Saludos


