(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