Rectángulos con bordes redondos con Pygame
March 16, 2008Los hemos visto en todos lados. Los rectángulos con bordes redondeados invaden el escritorio, los videojuegos y demás. Es la nueva moda. Y sin embargo muchos no sabemos que ese efecto muy llamativo es en realidad un simple truco de geometría.
Como tenía una aburrida tarde, me dediqué a programar con Pygame una clase que permita dibujar esta clase de figuras. Pueden ver el código fuente aquí.
Si ejecutan el .py obtendrán el siguiente resultado:
Pero aún no hemos hablado de como es el efecto. Bien, lo vamos a explicar.
- Obtenemos las cordenadas del rectángulo a dibujar
- Pedimos un radio para los bordes (A más radio, más redondo es el rectángulo)
- Restamos a las líneas que forman el rectángulo el doble del radio
- Dibujamos el borde redondo usando un arco. Para esto, atentos a lo siguiente:
Ur rectángulo es una figura de 4 lados y cuyos ángulos son de 90º. Sin embargo, para dibujar el arco, sabremos bien que un arco es simplemente un "pedazo" de círculo, por lo que especificamos los ángulos de inicio y fin del mismo. Entonces ocurre una curiosa correlación.
Si tenemos que un rectángulo originalmente tiene ángulos de 90º, 90 x 4 = 360º. Lo que significa que los arcos de los bordes son "1/4" de círculo. Por esa razón se usan los siguientes valores:
- Borde Izquierdo Superior: 90º - 180º
- Borde Derecho Superior: 180º - 270º
- Borde Izquierdo Inferior: 270º - 360º
- Borde Derecho Inferior: 0º - 90º
Con eso tenemos todo un círculo perfecto. Por razones de imperfección de las pantallas y los ángulos se le han sumado +1 al borde izquierdo inferior.
Ya tenemos una clase que dibuje rectángulos con borde. Sería deseable que alguien más entendido de Python analize el código para ver si es factible incluir esto dentro de Pygame. Al menos para mí, una función así sería muy útil.
El código es libre y puede usarse para lo que se desee. (Licencia MIT para los interesados)
He tomado ejemplos e ideas de la página LoserJuegos: Este y este.
El código fuente de la función __arc__ ha sido un mero porte de la función Arco() en C, de un código fuente de fhenix tomado de la página LoserJuegos. El código original es este.
Cualquier error o mejora que propongan a este código favor de reportarlo en los comentarios.




