+ -
当前位置:首页 → 问答吧 → 8086Bresenham算法画圆!

8086Bresenham算法画圆!

时间:2010-12-16

来源:互联网

前两天,masmaster在论坛张榜悬赏捉拿游戏天平,我一直惦记着,可那天平游戏要画圆的,我不会.
这两天我就专门考究了下Bresenham算法画圆,下午打了腹稿,晚上正式汇编... ...
辛苦脑动还真得到了回报,竟一战而下--拿下了Bresenham算法画圆!
先发个图,这次发下源代码了.希望有参考价值.
另外,因为显示器的比例关系,可能在一些显示器上显示出的是椭圆,那不关我的程序的事了...本来是做在320*200*256色模式下的,可在笔记本实机下没通过(虚拟机下通过了),就改在640*480816色模式下了...

图与源如下:(就没写注释了)


DATAS SEGMENT
xs db ?
yh db ?
 color dw 0
  rr dw 0
  rx dw 0
  ry dw 0
  xx dw 0
  yy dw 0
  zd dw 0
  zg dw 0
  yd dw 0
  yg dw 0
  x8 dw 8 dup (0)
  y8 dw 8 dup (0)
 paktq db "Press any key to quit!$"
DATAS ENDS

STACKS SEGMENT
  db 100h dup (0)
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
  MOV AX,DATAS
  MOV DS,AX
  mov ax,stacks
  mov ss,ax
  mov sp,100h
  mov ah,0fh
  int 10h
  mov xs,al
  mov yh,bh
  mov ax,12h
  int 10h
  mov ax,500h
  int 10h
   
  mov ax,4
  mov bx,50
  mov cx,320
  mov dx,320
   
  call yuan
   
  mov dx,offset paktq
  mov ah,9
  int 21h
  mov ah,7
  int 21h
  mov al,xs
  mov ah,0
  int 10h
  mov al,yh
  mov ah,5
  int 10h
   
  MOV AH,4CH
  INT 21H
   
  yuan:
  push ax
  push bx
  push cx
  push dx
  mov color,ax
  mov rr,bx
  mov rx,cx
  mov ry,dx
  mov yy,bx
  HY:
  call HD
  mov ax,xx
  cmp ax,yy
  jnb yuanover
  xor dx,dx
  mov ax,xx
  inc ax
  mul ax
  shl ax,1
  rcl dx,1
  mov zg,dx
  mov zd,ax
   
  xor dx,dx
  mov ax,yy
  mul ax
  shl ax,1
  rcl dx,1
  add ax,1
  adc dx,0
   
  add zd,ax
  adc zg,dx
   
  xor dx,dx
  mov ax,rr
  mul ax
  shl ax,1
  rcl dx,1
  mov yd,ax
  mov yg,dx
   
  xor dx,dx
  mov ax,yy
  mov bx,2
  mul bx
  add yd,ax
  adc yg,dx
   
  mov ax,zg
  cmp ax,yg
  ja Y_1
  jb y_0
  mov ax,zd
  cmp ax,yd
  jb y_0
  y_1:
  dec yy
  Y_0:
  inc xx
  jmp HY
   
  yuanover:
  pop dx
  pop cx
  pop bx
  pop ax
  ret
   
  HD:
  push ax
  push bx
  push cx
  push dx
  mov cx,8
  mov si,offset x8
  mov di,offset y8
  mov bx,rx
  mov dx,ry
  d8d:
  mov [si],bx
  mov [di],dx
  add si,2
  add di,2
  loop d8d
   
  mov cx,xx
  mov dx,yy
  add [si-16],cx
  add [di-16],dx
  add [si-14],cx
  sub [di-14],dx
   
  sub [si-12],cx
  add [di-12],dx
  sub [si-10],cx
  sub [di-10],dx
   
  add [si-8],dx
  add [di-8],cx
  add [si-6],dx
  sub [di-6],cx
   
  sub [si-4],dx
  add [di-4],cx
  sub [si-2],dx
  sub [di-2],cx
   
  mov cx,8
  h8d:
  push cx
  sub si,2
  sub di,2
  mov ax,color
  mov ah,0ch
  mov bh,0
  mov dx,[di]
  mov cx,[si]
  int 10h
  pop cx
  loop h8d
   
  pop dx
  pop cx
  pop bx
  pop ax
  ret
   
CODES ENDS
  END START



作者: nanlingcg   发布时间: 2010-12-16

学习~~~

作者: masmaster   发布时间: 2010-12-16