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.