martes, 10 de febrero de 2015

Perfección

(es) Perfección

(eo) Senerareco

Perfección

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