目录 上一页 下一页 下一章

-250- PC机汇编语言实战精解















end_line:








code

mov
mov
mov
mov
int

inc
mov
cmp
ja
mul
div
mov
jmp

mov
int

mov
int

mov
int
ends
end
ch,0
dh,0
al,1
ah,0ch
10h

x0
al,x0
al,x1
end_line
byte ptr k
byte ptr k+1
y0,al
pixel

ah,0
16h

ax,0003h
10h

ah,4ch
21h

start


;选择青色
;在CX-DX指定的位置画一个点


;X坐标加1,得下一个点的X坐标
;将新的X坐标送入AL寄存器
;已经画到最后一个点了吗?
;已经画到最后一个点,转END_LINE
;计算(K x X)

;将算出的Y坐标存入Y0
;转PIXEL继续画点

;等待键盘输入


;设置字符显示模式3


;结束进程



  此程序并未直接给出直线的斜率K,而是给出直线起始点与终止点的坐标,通过两个点的坐标计算出K。这好象有些繁琐,程序的指令增多,计算量也大了,这样设计程序不是自找麻烦吗?
  大家平时一想起直线首先想到公式"y=Kx+b",然而真正在纸上画直线时几乎没有人考虑什么斜率、截距之类的东西。谁都愿意在知道起止点的情况下画线,直尺一连即可,这是最省事的。
  任何一个成功的图形制作软件在画直线时都不会要求用户输入斜率、截距这样的参数,都是要求用户输入起止点坐标,或者让用户用鼠标器直接定起止点,而对于用户来说这种画线方式也是最直观,最方便的。这也就是说,把程序设计成这样一种形式其实是为程序的用户着想,虽然这个程序不可能有什么用户。
  上面这个程序可以画出从点(0,0)至(199,199)这样一条对角线来,看上去效果还能让人接受。然而如果将程序中Y1的值改成1的话那么这个程序可就有问题了。
  当然这个程序仍然可以运行并能画出线来,但是这条线的效果可就不能让人接受了。仔细观察这条线可以看到,组成线条的前199个点都位于屏幕第一行,只有最后一个点位于下面一行。这又是为什么呢?
  问题的关键在于电脑显示器的分辨率是有限的,计算机只能在"整数"坐标位置显示点,不可能在两个扫描行之间显示出点来。所以当程序计算出某个点的Y坐标为199/200时,计算机也只能将此点画在第一行或下一行,具体要画在哪一行和程序取整的方法有关。
  如果程序对所有计算出来的Y坐标都直接取整的话,那么理论上位于(199,199/200)处

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章