Vistas de página en total

miércoles, 26 de marzo de 2014

CIRCLE

   Siguiendo las funciones gráficas, la siguinete depues de la línea en impritancia es el circulo.
Al igual que he hecho con la línea utilizaré el algoritmo de Bresenham.

 
  El pseudocódigo del algoritmo es:
 
*Se capturan el radio r y el centro de la circunferencia (xc, yc).
 *Se obtiene el primer punto de la circunferencia centrada en origen (xc, yc) como (0, r).
 *Se cacula el valor inicial del parametro de decisión como p0=5/4 - r.
 Para k=0 hasta x>=y incrementa k
    Si pk < 0 
       *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk).
       *pk+1=pk+2xk+1+1.
    Sino
        *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk-1).
       *pk+1=pk+2xk+1+1-2yk+1.
    //Donde 2xk+1=2xk+2  y  2yk+1=2yk-2
 
 *Se determinan los puntos de simetría para los otros siete octantes.
 *Se mueve cada posición del pixel calculada (x,y) a la trayectoria circular centrada en (xc, yc) 
   y trazamos los valores de las coordenadas: x=x+xc y y=y+yc.
 Fin Para

   Fuente wikipedia.

     Aquí teneis la implementación del algoritmo en ensamblador, comentado en C, para que sirva de entreanmiento a la hora de codificar en lenguaje ensamblador otros algoritmos.




CIRCLE.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.


include graphics.mac


.model compact,pascal

        public _circle
.data

e dw 0     ;variable p procedimiento breshenham


.code
       ;algoritmo Bresenham
_circle proc uses ax bx dx si di,x0,y0,radio,color
        mov bx,0     ;x=0
        mov dx,radio      ;y=radio
        mov cx,dx   ;e=radio
        neg cx       ;e=-radio
        add cx,1    ; e=1-radio

      
while:        ;while (x<y)
        cmp bx,dx
        jb sig
        jmp fin
sig:
        call _dibuja8   ;dibuja en los 8 octantes
        inc bx       ;x=x+1
        cmp cx,0    ;if (e>0)
        jl else_if
        dec dx       ;y=y+1
        mov ax,bx
        sub ax,dx   ;x-y
        shl ax,1    ;(x-y)*2
        add ax,1  ;1*(x-y)+1
        add cx,ax    ;e=e+ 2*(x-y)+1
        jmp fin_if
else_if:
        mov ax,bx
        shl ax,1
        add ax,1         
        add cx,ax   ;e=e+2*x+1
fin_if:
     
        jmp while      
fin:
        ret
_circle endp 

;dibuja el punto en cada octante, referido a la coordenada origen del circulo
_dibuja8 proc
        mov si,bx          
        add si,x0           ;xc=x+x0
        mov di,dx          
        add di,y0           ;yc=y+y0
        putpixel si,di,color    ;pixel(x+x0,y+y0)
        mov si,dx          
        add si,x0           ;xc=y+x0
        mov di,bx          
        add di,y0           ;yc=x+y0
        putpixel si,di,color    ;pixel(y+x0,x+y0)
        mov si,bx             
        neg si
        add si,x0            ;xc=-x+x0
        mov di,dx          
        add di,y0           ;yc=y+y0
        putpixel si,di,color          ;pixel(-x+x0,y+y0)
        mov si,dx          
        add si,x0           ;xc=y+x0
        mov di,bx             
        neg di
        add di,y0               ;yc=-x+y0
        putpixel si,di,color           ;pixel(y+x0,-x+y0)
        mov si,bx             
        neg si
        add si,x0               ;xc=-x+x0
        mov di,dx 
        neg di              
        add di,y0               ;yc=-y+y0
        putpixel si,di,color          ;pixel(-x+x0,-y+y0)
        mov si,dx 
        neg si              
        add si,x0               ;yc=-y+x0
        mov di,bx             
        neg di
        add di,y0               ;xc=-x+y0
        putpixel si,di,color           ;pixel(-y+x0,-x+y0)
        mov si,bx          
        add si,x0           ;xc=x+x0
        mov di,dx 
        neg di              
        add di,y0               ;yc=-y+y0
        putpixel si,di,color          ;pixel(x+x0,-y+y0)
        mov si,dx 
        neg si              
        add si,x0               ;yc=-y+x0
        mov di,bx          
        add di,y0           ;yc=x+y0
        putpixel si,di,color           ;pixel(-y+x0,x+y0)
        ret
_dibuja8 endp       

end

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.