| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4453 人关注过本帖
标题:我这个程序为什么只画出半个圆。
只看楼主 加入收藏
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
我这个程序为什么只画出半个圆。
我想画一个圆,为什么只画出半个圆?

data segment
 source_buffer db 40 ('a')
 circle DB 00H,00H,47H,0C0H,3FH,0F0H,3FH,0F8H,3FH,0F8H,7FH,0FCH,7FH,0FCH,7FH,0FCH
    DB 7FH,0FCH,7FH,0FCH,3FH,0F8H,3FH,0F8H,1FH,0F8H,07H,0C4H,00H,02H,00H,00H
 row dw 50
 col dw 50
 
 lp1num db 0
 lp2num db 2
 lp3num db 0 ;第3层循环的次数,最大为8
 cmpnum db 80h
 
data ends

;
code segment
main proc far
assume cs:code,ds:data,es:data
start:
 push ds
 sub ax,ax
 push ax
 mov ax,data
 mov ds,ax
 
 MOV AH,00H
 MOV AL,12H
 INT 10H
 MOV AH,0BH
 MOV BH,00
 MOV BL,00H
 INT 10H

 mov si,offset circle
 call show


FLAG3:
 MOV  AH,0
 INT  16H
 CMP  AL,1BH
 JZ  EXIT
 JMP FLAG3

EXIT:
 RET



show proc near
 push ax
 push bx
 push cx
 push dx
 push si
 push word ptr row
 push word ptr col

 ;mov cx,16
 mov ah,0ch
 mov dx,row
 mov cx,col
 mov al,00001010b
 int 10h



 mov lp1num,0
lp1:
 
 mov lp2num,0
 mov lp3num,0
lp2:
 mov bl,[si]
 mov cmpnum,80h
lp3:test bl,cmpnum
 jz wr2
 mov al,00001010b
 int 10h
 jmp ag3
wr2:
 mov al,0
 int 10h
ag3:
 shr cmpnum,1
 
 inc cx

 ; inc cx
 inc lp3num
 cmp lp3num,8
 jb lp3
 inc si
 inc lp2num
 cmp lp2num,2
 jb lp2
 inc dx
 mov cx,col
 inc lp1num
 cmp lp1num,16
 jb lp1
   



 



exitshow:




   
 pop word ptr col
 pop word ptr row
 pop si
 pop dx
 pop cx
 pop bx
 pop ax
ret
show endp









main endp
code ends
 end start

[此贴子已经被作者于2016-7-27 08:20编辑过]

2016-07-27 07:53
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-27 07:53
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:20 
楼主的代码稍复杂了些,简化一下如下:

程序代码:
data segment

 circle DB 00H,00H,47H,0C0H,3FH,0F0H,3FH,0F8H,3FH,0F8H,7FH,0FCH,7FH,0FCH,7FH,0FCH
    DB 7FH,0FCH,7FH,0FCH,3FH,0F8H,3FH,0F8H,1FH,0F8H,07H,0C4H,00H,02H,00H,00H

 row dw 50

 col dw 50

 color db 00001010b ;color
data ends

code segment
main proc far
assume cs:code,ds:data,es:data
start:

 mov ax,data

 mov ds,ax

 mov ax,0012h

 int 10h

 mov si,offset circle

 call show
FLAG3:

 MOV  AH,0

 INT  16H

 CMP  AL,1BH

 JZ  EXIT

 JMP FLAG3
EXIT:

 mov ax,0003h

 int 10h

 mov ah,4ch

 int 21h
main endp

show proc near

 mov dx,row

 mov bh,0    ;
 mov bp,16  ;外圈(行) ,垂直点数
sh0:

 push bp

 mov bp,16  ;内圈(列),水平点数
 mov cx,col 

 mov ax,[si] ;取值
 xchg al,ah  ;交换
 mov di,ax

 mov ah,0ch

 mov al,color
sh2:

 shl di,1  ;移出到 cf
 jnc sh3 ;无点
 int 10h ;有点印出
sh3:   

 inc cx  ;下一点
 dec bp  ;完了一列? 
 jnz sh2 ;
 add si,2 ;下一行
 pop bp  ;
 inc dx  ;坐标移下一行
 dec bp  ;行回圈
 jnz sh0

 ret
show endp
code ends

 end start


图片附件: 游客没有浏览图片的权限,请 登录注册
2016-07-27 11:38
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
谢谢了

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-27 14:22
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 4楼 zhulei1978
其实有个疑问,班竹的代码只能算是画出一个16x16点阵的程序,只是刚巧点阵中是圆的像点而已,真正画圆的程序至少须定义一个中心点坐标(x,y)和半径Radius,像这样
PUSH X
PUSH Y
PUSH Radius
CALL Circle

像这个
图片附件: 游客没有浏览图片的权限,请 登录注册


或者是win32的API
invoke Ellipse,hDC, Left,Top,Right,Bottom

c++的原型就是
BOOL Ellipse(
  _In_ HDC hdc,
  _In_ int nLeftRect,
  _In_ int nTopRect,
  _In_ int nRightRect,
  _In_ int nBottomRect
);



[此贴子已经被作者于2016-7-28 07:56编辑过]

2016-07-28 07:55
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
我只会画点阵圆了,你的代码能分享下吗

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-28 09:25
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 6楼 zhulei1978
可以的,先贴一个320x200模式13h,这个简单些,有空整理一下640x480模式再发。

画圆子程式用法:
mov       dx,坐标x
mov       di,坐标y
mov       al,颜色
mov       bx,半径
call      Circle  

这个程式以 (160,100)为圆心,1为半径,画一个蓝色的圆,然后半径加5再画,直到半径80为止,最后用白色画外围。若要画实心圆,每次累加值改为1即可。

程序代码:
                    .MODEL small
                    .286 
                    .data

rr dw 1
rr_max equ 80
                    .CODE 

Start:              mov       ax,@data
                    mov       ds,ax

                    mov       ax,13h
                    int       10h                 ;mode 13h 
                    push      0a000h 
                    pop       es                  ;es in video segment 

next:
                    mov       dx,160              ;Xc 坐标x
                    mov       di,100              ;Yc 坐标y
                    mov       al,01h              ;颜色 Colour blue
                    mov       bx,RR               ;半径 Radius
                    call      Circle              ;Draw circle
                    ;inc       rr                 ;画实心圆
                    add       rr,5
                    cmp       rr,rr_max
                    jbe       next

                    mov       dx,160              ;Xc
                    mov       di,100              ;Yc 
                    mov       al,07h              ;Colour white
                    mov       bx,RR               ;Radius
                    call      Circle              ;Draw circle

                    mov       ah,0
                    int       16h                 ;Wait for key 
                    mov       ax,3 
                    int       10h                 ;Mode 3 
                    mov       ah,4ch 
                    int       21h                 ;Terminate 
;*** Circle 
; dx= x coordinate center 
; di= y coordinate center 
; bx= radius 
; al= colour 
Circle:             mov       bp,0                ;X coordinate 
                    mov       si,bx               ;Y coordinate 
c00:                call      _8pixels            ;Set 8 pixels 
                    sub       bx,bp               ;D=D-X 
                    inc       bp                  ;X+1 
                    sub       bx,bp               ;D=D-(2x+1) 
                    jg        c01                 ;>> no step for Y 
                    add       bx,si               ;D=D+Y 
                    dec       si                  ;Y-1 
                    add       bx,si               ;D=D+(2Y-1) 
c01:                cmp       si,bp               ;Check X>Y 
                    jae       c00                 ;>> Need more pixels 
                    ret 
_8pixels:           call      _4pixels            ;4 pixels 
_4pixels:           xchg      bp,si               ;Swap x and y 
                    call      _2pixels            ;2 pixels 
_2pixels:           neg       si 
                    push      di 
                    add       di,si 
                    imul      di,320 
                    add       di,dx 
                    mov       es:[di+bp],al 
                    sub       di,bp 
                    stosb 
                    pop       di 
                    ret 
                    END       Start 




图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-7-28 20:50编辑过]

2016-07-28 20:47
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
这是一个通用画圆程式,有两个可变参数的子程序。

1.模式
ax=模式(04-13h,103h,105h),04h-13h是vga模式,大于100h是svga模式,常用的有:
12h=640x480
13h=320x200
103h=800x600
105h=1024x768
用法,例如设定1024x768
mov     ax,105h ;set SVGA mode 105h=1024x768
call    SetVideo

2.画圆子程序
用法:
mov       cx,坐标x ;(0-模式中行数-1,若640x480,则x范围是 0-639)
mov       dx,坐标y ;(0-模式中列数-1,若640x480,则y范围是 0-479)
mov       al,颜色  
mov       bx,半径  ;(0-???,数值超过屏幕范围则不能看见)
call      Circle

以下的代码是在1024x768模式下画一个实心蓝的同心圆,外围白色。
注意:程式并不检查x,y坐标和半径的有效范围,用者须自行检定(超出范围的参数不会令程式崩溃)。

程序代码:
                .MODEL small
                .286
                .data
Radius dw 1                            ;start value
Radius_max equ 200                     ;max Radius limit

                .CODE
Start:          mov     ax,@data
                mov     ds,ax
                ;set mode (04-13h,103h,105h)
                ;12h=640x480
                ;13h=320x200
                ;103h=800x600
                ;105h=1024x768
                mov     ax,105h        ;set SVGA mode 105h=1024x768
                call    SetVideo
next:           mov     cx,320          ;Xc 坐标x
                mov     dx,250          ;Yc 坐标y
                mov     al,01h          ;颜色 Colour blue
                mov     bx,Radius       ;半径 
                call    Circle          ;Draw circle
                inc     Radius
                ;add     Radius,5
                cmp     Radius,Radius_max
                jbe     next
                mov     cx,320          ;Xc 坐标x
                mov     dx,250          ;Yc 坐标y
                mov     al,07h          ;Colour white
                mov     bx,Radius       ;Radius
                call    Circle          ;Draw circle
                mov     ah,0
                int     16h             ;Wait for key
                mov     ax,3
                int     10h             ;Mode 3
                mov     ah,4ch
                int     21h             ;Terminate
;*** Circle 
; cx= x coordinate center 
; dx= y coordinate center 
; bx= radius 
; al= colour 
Circle:         mov     bp,0            ;X coordinate
                mov     si,bx           ;Y coordinate
c00:            call    _8pixels        ;Set 8 pixels
                sub     bx,bp           ;D=D-X
                inc     bp              ;X+1
                sub     bx,bp           ;D=D-(2x+1)
                jg      c01             ;>> no step for Y
                add     bx,si           ;D=D+Y
                dec     si              ;Y-1
                add     bx,si           ;D=D+(2Y-1)
c01:            cmp     si,bp           ;Check X>Y
                jae     c00             ;>> Need more pixels
                ret
_8pixels:       call    _4pixels        ;4 pixels
_4pixels:       xchg    bp,si           ;Swap x and y
                call    _2pixels        ;2 pixels
_2pixels:       neg     si
                pusha
                mov     ah,0ch
                add     dx,si
                add     cx,bp
                mov     bh,0
                int     10h
                shl     bp,1
                sub     cx,bp
                int     10h
                popa
                ret
;-------------------------------------------------------------------------
SetVideo:       pusha
                cmp     ax,13h        ;is mode larger then 13h
                ja      SetV10        ;yes
                int     10h             ;mode 12h(640x480),13h(320x200)
                jmp    short SetV20

SetV10:         mov     bx,ax
                mov     ah,4fh         ;set mode to SVGA 
                mov     al,02h
                int     10h
                mov     ah,4fh
                mov     al,05h
                mov     bh,00h
                mov     bl,00h
                mov     dx,7            ;page number
                int     10h
SetV20:         popa
                ret
;-------------------------------------------------------------------------
                END       Start 


图片附件: 游客没有浏览图片的权限,请 登录注册




[此贴子已经被作者于2016-7-29 13:48编辑过]

2016-07-29 07:51
zhulei1978
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
感谢楼主的无私奉献

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-07-29 09:12
快速回复:我这个程序为什么只画出半个圆。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022226 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved