PDA

View Full Version : ساخت متوازی الاضلاع و رنگ کردن آن



armin28
جمعه 04 دی 1388, 12:54 عصر
سلام چطوری میتونم یک متوازی الاضلاع در اسمبلی رسم کنم و اونو رنگ کنم لطفاکمک کنید.

mortezamsp
یک شنبه 06 دی 1388, 00:25 صبح
رسم خط رو که بلدی ؟
تو یه حلقه ، هربار یه خط از x تا y رسم میکنی و بعد مقدار x,y رو اظافه میکنی .مثلا یه واحد . این میشه یه متواضی الاضلاع رنگ شده .

sjhosseini
یک شنبه 06 دی 1388, 10:07 صبح
از این ماکروها می تونی استفاده کنی
سه ماکرو نوشتم Line, Bar , Rectangle

Line macro x1,y1,x2,y2,color
LOCAL else1, jmp1, jmp2
LOCAL else2
LOCAL else3
LOCAL while1
LOCAL while2
LOCAL next1
LOCAL next2
LOCAL continue1
LOCAL continue2
LOCAL exit

;dy = y2 - y1;
mov ax,y2
sub ax,y1
mov ddy,ax
;dx = x2 - x1;
mov ax,x2
sub ax,x1
mov ddx,ax
;if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
cmp ddy,0
jge else1
neg ddy
mov stepy,-1
jmp far ptr next1
else1: mov stepy,1
next1:
;if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
cmp ddx,0
jge else2
neg ddx
mov stepx,-1
jmp far ptr next2
else2: mov stepx,1
next2:
;dy=2*dy , dx=2*dx
mov ax,ddy
add ax,ax
mov ddy,ax
mov ax,ddx
add ax,ax
mov ddx,ax
;X=x1 , Y=y1
mov ax,x1
mov XX,ax
mov ax,y1
mov YY,ax

;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
mov ax,ddx
cmp ax,ddy
jng else3
;if(dx>dy)
;{
;fraction =2*dy-dx
mov ax,ddy
add ax,ax
sub ax,ddx
mov fraction,ax

while1: mov ax, XX
cmp ax, word ptr x2
;je far ptr exit
jne jmp1
jmp far ptr exit
jmp1:

;while (XX!=x2)
;{
cmp fraction,0
jl continue1
;Y += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction -= dx
mov ax,fraction
sub ax,ddx
mov fraction,ax
continue1: ;X += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction += dy
mov ax,fraction
add ax,ddy
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp far ptr while1
;}
;}
else3: ;else
;{
;fraction = 2*dx-dy
mov ax,ddx
add ax,ax
sub ax,ddy
mov fraction,ax

while2: mov ax, YY
cmp ax,word ptr y2
;je far ptr exit
jne jmp2
jmp far ptr exit
jmp2:
;while (YY!=y2)
;{
cmp fraction,0
jl continue2
;XX += stepx
mov ax,XX
add ax,stepx
mov XX,ax
;fraction -= dy
mov ax,fraction
sub ax,ddy
mov fraction,ax
continue2: ;YY += stepy
mov ax,YY
add ax,stepy
mov YY,ax
;fraction += dx
mov ax,fraction
add ax,ddx
mov fraction,ax
;putpixel(XX,YY,color)
mov cx, XX ; column
mov dx, YY ; row
mov al, color ; white
mov ah, 0ch ; put pixel
int 10h
jmp far ptr while2
;}
;}
exit:
endm

Rectangle macro x1,y1,x2,y2,color
Line x1,y1,x2,y1,color
Line x2,y1,x2,y2,color
Line x2,y2,x1,y2,color
Line x1,y2,x1,y1,color
endm

Bar macro x1,y1,x2,y2,color
LOCAL next,loop1,jmp1,exit,Yend
Yend dw ?
mov ax,y1
sub ax,y2
jge next
neg ax
next: mov cx,ax
mov ax,y1
mov Yend,ax
loop1: cmp cx,-1
jne jmp1
jmp far ptr exit
jmp1:
dec cx
push cx
Line x1,Yend,x2,Yend,color
pop cx
inc Yend
jmp loop1

exit:
endm

برای صدا زدن ماکروها از این کدها استفاده کن

mov x1,0
mov y1,0
mov x2,300
mov y2,200
mov color,3
Bar x1,y1,x2,y2,color
قبلاش متغیرهای x,y را تعریف کن
موفق باشید