(es) Perfección
(eo) Senerareco
http://dx.doi.org/10.13140/RG.2.2.34092.90243
Descripción artística:
Una circunferencia perfecta.
Motivación:
Una circunferencia puede considerarse como la figura geométrica más perfecta.
Descripción técnica:
Es una circunferencia dibujada con el algoritmo de línea de Bresenham.
Algoritmo básico para dibujar una circunferencia de un pixel de grueso (en lenguaje C):
// Función auxiliar
void marcarPixelesCicunferencia(int x, int y, int xc, int yc){
marcarPixel( x+xc, y+yc);
marcarPixel( x+xc,-y+yc);
marcarPixel(-x+xc, y+yc);
marcarPixel(-x+xc,-y+yc);
marcarPixel( y+xc, x+yc);
marcarPixel( y+xc,-x+yc);
marcarPixel(-y+xc, x+yc);
marcarPixel(-y+xc,-x+yc);
}
void circunferencia_punto_medio(int xc, int yc, int radio){
int x,y,d;
x=0;
y=radio;
d=1-radio;
marcarPixelesCicunferencia(x,y, xc,yc);
while(y>x){
if(d<0){
d += x * 2 + 3;
}else{
d += (x - y) * 2 + 5;
y--;
}
x++;
marcarPixelesCicunferencia(x,y, xc,yc);
}
}
Código (Python):
#!/usr/bin/env python
# coding: utf-8
# Copyright 2015 Eduardo Adam Navas López
# Este programa es Software Libre liberado bajo la licencia GNU GPLv3 o su versión más reciente:
# http://www.gnu.org/licenses/gpl.html
import pygame
import pygame.gfxdraw
#prueba = False
prueba = True
if prueba:
TAM = 500
else:
TAM = 8000
RADIO_CIRCULO = (TAM/2) * 9 / 10
GRUESO_CIRCUNFERENCIA = TAM * 2 / 500
COLOR_FONDO = (255,255,255)
COLOR_CIRCUNFERENCIA = pygame.Color(0,0,0)
ANCHO = TAM
ALTO = TAM
def dibujarCircunferencia(xc, yc, re, ri, color):
"""Dibuja una circunferencia con centro (xc,yc)
y radio exterior re e interior ri.
"""
global pantalla
if re <= ri: return #No funcionaría el algoritmo
def marcarPixel(x,y):
pantalla.set_at(( x+xc, y+yc), color)
pantalla.set_at(( x+xc,-y+yc), color)
pantalla.set_at((-x+xc, y+yc), color)
pantalla.set_at((-x+xc,-y+yc), color)
pantalla.set_at(( y+xc, x+yc), color)
pantalla.set_at(( y+xc,-x+yc), color)
pantalla.set_at((-y+xc, x+yc), color)
pantalla.set_at((-y+xc,-x+yc), color)
def marcarLineaH(xi,xf,y):
i = xi
while i<=xf:
marcarPixel(i,y)
i = i+1
limites = {}
x = 0
y = re
d = 1-re
while y>x:
if d<0:
d += x*2+3
else:
d += (x-y)*2+5
limites[y] = [None, x]
y = y-1
x = x+1
x = 0
y = ri
d = 1-ri
if limites.has_key(y):
limites[y][0] = x
else:
limites[y] = [x, None]
while y>x:
if d<0:
d += x*2+3
x = x+1
else:
d += (x-y)*2+5
y = y-1
x = x+1
if limites.has_key(y):
limites[y][0] = x
else:
limites[y] = [x, None]
for cada_y, (xi,xf) in limites.iteritems():
if xi is None:
marcarLineaH(0,xf,cada_y)
elif xf is None:
marcarLineaH(xi,cada_y,cada_y)
else:
marcarLineaH(xi,xf,cada_y)
def dibujar(pantalla):
pantalla.fill(COLOR_FONDO)
#Círculo exterior
dibujarCircunferencia(TAM/2, TAM/2, RADIO_CIRCULO+GRUESO_CIRCUNFERENCIA, RADIO_CIRCULO, COLOR_CIRCUNFERENCIA)
pygame.display.flip()
if __name__ == "__main__":
global pantalla
pygame.init()
pantalla = pygame.display.set_mode((ANCHO, ALTO))
pygame.display.set_caption("Circunferencia")
dibujar(pantalla)
if prueba:
raw_input("Presione una tecla para salir")
else:
pygame.image.save(pantalla, "circ.png")
Código (CFDG):
# Copyright 2015 Eduardo Adam Navas López
# Este archivo es Software Libre liberado bajo la licencia GNU GPLv3 o su versión más reciente:
# http://www.gnu.org/licenses/gpl.html
#Para generar la imagen:
#$ cfdg -s 8000 circ.cfdg circ.png
CF::Size = [s 1.1 1.1]
startshape circunferencia
shape circunferencia{
CIRCLE[]
CIRCLE[b 1 s 0.99]
}
No hay comentarios:
Publicar un comentario