1、为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。 圆有“八对称性”,如下图所示。 显然,我们只需要知道了圆上的一个点的坐标 (x, y) ,利用八对称性,我们马上就能得到另外七个对称点的坐标。 给出圆心的坐标(0, 0)和半径,求圆图像的最佳逼近点。我们求的八分之一圆孤为(0, R) -(R2,R2),可知最大位移方向是x方向,x0 = 0, y0 = R,每次对x自增,然后判断y是否减1,直到x = y为止(从点(0, R)到圆的八分之一处就有这种情况)。误差量由(x, y) = x2 + y2 - R2给出。先找递推关系,若当前d =
2、F(x + 1, y - 0.5) 0,则y须减1,则下一d值为d = F(x + 2, y - 1.5) = (x + 2)2 + (y - 1.5)2 - R2 = d + 2x - 2y + 5,若当前d = F(x + 1, y - 0.5) 0即d 0.25,这和d 0等价,所以d取初值1 - R。1.4 程序流程图与程序代码1.41 流程图1.42 程序源代码data segment m dw ?n db ? ;像素颜色值 r dw 30 ;五环半径 x1 dw 80 ;第一个圆的圆心 y1 dw 80 x2 dw ?y2 dw ?x3 dw ?y3 dw ?x4 dw ?y4 d
3、w ?x dw ?y dw ?d dw ?a dw ?b dw ?data ends code segment assume cs:code,ds:data main proc far start: mov ax,data mov ds,ax ;mov si,0 mov di,0 mov si,x1 mov x3,si mov si,y1 mov y3,si call circulmain endp ;*五环绘制子程序* circul proc near push si mov ah,0 mov al,0dh int 10h *依次绘制正面五环* front:mov n,0eh;第一个环,黄色
4、 mov x,0 mov bx,r mov y,bx mov si,x3 mov x1,si mov si,y3 mov y1,si call single_circle mov n,0ah;第二个环,绿色 add y1,bx shr bx,1 mov n,04h;第三个环,红色 mov n,09h;第四个环,蓝色 add x1,bx mov n,08h; 第五个环,灰色 jmp back*绘制背面面各环* back:第一个环,红色 mov n,08;第二个环,灰色 第三个环,蓝色 第四个环,绿色 第五个环,黄色 pop sicall delayjmp frontcircul endp *逐步
5、进给调整坐标,单环绘制* single_circle proc near mov si,1 sub si,r mov d,si ;d=1-r,x=0 lin3: mov si,x ;si=x mov di,y ;di=y=r add si,x1 add di,y1 mov dx,si ;dx=si+x1 mov cx,di ;cx=di+y1 mov si,x ;mov di,y cmp si,di ;比较x与y,xy则八分之一圆弧绘制结束 jg lin call hua ;xy cmp d,0 ;jge lin1 ;mov si,2 mov ax,0 mov AX,SI imul x mov
6、 si,ax add si,3 add d,si lin2: inc x jmp lin3 lin1: mov si,2 mov ax,si mov di,x sub di,y imul di add si,5 dec y jmp lin2 lin:ret single_circle endp huadian proc near ;写像素,al=颜色值,bh=页号 mov ah,0CH mov al,n mov bh,0 huadian endp *八分法绘制圆环* hua proc near call huadian ;画第一点 (x,y) mov x2,dx mov y2,cx sub d
7、x,x1 sub cx,y1 xchg dx,cx add dx,x1 add cx,y1 画对称点(y,x) mov dx,x2 mov cx,y2 mov m,dx add m,dx sub dx,m 画点(-y,x) mov m,cx add m,cx sub cx,m 画点(-y,-x) 画点 (x,-y) 画点(-x,-y) 画点 (-x,y) 画点 (y,-x) call delay hua endp *延时* delay proc near push dx push cx mov dx,2000 d1: mov cx,3000d2: loop d2 dec dx jnz d1 pop cx pop dx delay endp code ends end start
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1