ورود

View Full Version : اصلاح کد رسم بیضی



kiuhnmgtrdcv
شنبه 27 تیر 1388, 20:53 عصر
سلام دوستان
من کد رسم یه بیضی با زبان سی نوشتم میخوام این کد به زبان اسمبلی برگردانم ولی دچار مشکل شدم لطفا این کدی که من به زبان اسمبلی نوشتم ایرادهاشو بگیرید


#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
void main()
{
long d1,d2;
long rx,ry,rxsq,rysq,tworxsq,tworysq,dx,dy;
int gd=DETECT,gm,x,y;
clrscr();
printf("enter x radius of the ellipse(20)");
scanf("%ld",&rx);
printf("enter y radius of the ellipse(40)");
scanf("%ld",&ry);
initgraph(&gd,&gm,"");

rxsq=rx*rx;
rysq=ry*ry;
tworxsq=2*rxsq;
tworysq=2*rysq;
x=0;
y=ry;
d1=rysq-rxsq*ry+(0.25*rxsq);
dx=tworysq*x;
dy=tworxsq*y;


do{
putpixel(200+x,200+y,15);
putpixel(200-x,200-y,15);
putpixel(200+x,200-y,15);
putpixel(200-x,200+y,15);
if(d1<0)
{
x=x+1;
y=y;
dx=dx+tworysq;
d1=d1+dx+rysq;
}
else
{
x=x+1;
y=y-1;
dx=dx+tworysq;
dy=dy-tworxsq;
d1=d1+dx-dy+rysq;
}
delay(200);
}
while(dx<dy);
d2=rysq*(x+0.5)*(x+0.5)+rxsq*(y-1)*(y-1)-rxsq*rysq;
do{
putpixel(200+x,200+y,15);
putpixel(200-x,200-y,15);
putpixel(200+x,200-y,15);
putpixel(200-x,200+y,15);
if(d2>0){
x=x;
y=y-1;
dy=dy-tworxsq;
d2=d2-dy+rxsq;
}
else


{
x=x+1;
y=y-1;
dy=dy-tworxsq;
dx=dx+tworysq;
d2=d2+dx-dy+rxsq;
}
}
while(y>0);
getch();
}کد اسمبلی

من در این کد به دومتغیر ورودی rx,ry مقدار اولیه دادم
[code] mov rx,30
mov ry,10

putpix macro x,y
mov cx,x
mov dx,y
mov ah,0ch
mov al,9
int 10h
endm

init macro
mov al,13h
mov ah,0
int 10h
endm

.model small
.stack 128
.data
d1 dw 0
d2 dw 0
rx dw 0
ry dw 0
rxsq dw 0
rysq dw 0
tworxsq dw 0
tworysq dw 0
x dw 0
y dw 0
dxx dw 0
dyy dw 0
km1 dw 0
km2 dw 0
km3 dw 0
two dw 2
four dw 4

.code
main proc far
mov ax,@data
mov ds,ax
init
mov rx,30
mov ry,10

mov ax,rx
mul ax
mov rxsq,ax

mov ax,ry
mul ax
mov rysq,ax

mov ax,rxsq
mul two
mov tworxsq,ax

mov ax,rysq
mul two
mov tworysq,ax

mov x,0
mov bx,ry
mov y,bx
;-----
;d1=rysq-rxsq*ry+(0.25*rxsq)
;4d1=4rysq-4rxsq*ry+(rxsq);
;avali
mov ax,rysq
mul four
mov cx,ax
;avali
mov ax,rxsq
mul ry
mul four
mov bx,ax
;
sub cx,bx
add cx,rxsq
;
mov ax,cx
div four
mov d1,ax
;-----
mov ax,rxsq
mul two
mov dxx,ax
mov ax,rysq
mul two
mov dyy,ax
;***loop1
lw1:cmp dxx,ax
jge endw1
;putting
;200+x
mov bx,x
add bx,200
;200+y
mov cx,y
add cx,200
putpix bx,cx
;200-x
mov bx,x
sub bx,200
neg bx
;200-y
mov cx,y
sub cx,200
neg cx
putpix bx,cx
;200+x
mov bx,x
add bx,200
;200-y
mov cx,y
sub cx,200
neg cx
putpix bx,cx
;200-x
mov bx,x
sub bx,200
neg bx
;200+y
mov cx,y
add cx,200
putpix bx,cx
cmp d1,0
jge else1
inc x
mov bx,tworysq
add dxx,bx
mov bx,rysq
add d1,bx
jmp ifexit
else1:
inc x
dec y
mov bx,tworysq
add dxx,bx
mov bx,tworxsq
sub dyy,bx
;d1=d1+dx-dy+rysq;
mov bx,dxx
sub bx,dyy
add bx,rysq
add d1,bx
ifexit:
;delay(200)
;mov cx,0fffh
;ldelay:
;loop ldelay
jmp lw1
endw1:
;d2=rysq*(x+0.5)*(x+0.5)+rxsq*(y-1)*(y-1)-rxsq*rysq;
;4d2=rysq*(2x+1)*(2x+1)+4rxsq*(y-1)*(y-1)-4rxsq*rysq;
;4d2=km1+km2+km3
;km1
mov ax,x
mul two
add ax,1
mul ax
mul rysq
mov km1,ax
;km2
mov ax,y
dec ax
mul ax
mul rxsq
mul four
mov km2,ax
;km3
mov ax,rxsq
mul ax
mul four
mov km3,ax

mov ax,km1
add ax,km2
add ax,km3
div four
mov d2,ax

;***loop2
lw2:
cmp y,0
jle endw2
;putting
;200+x
mov bx,x
add bx,200
;200+y
mov cx,y
add cx,200
putpix bx,cx
;200-x
mov bx,x
sub bx,200
neg bx
;200-y
mov cx,y
sub cx,200
neg cx
putpix bx,cx
;200+x
mov bx,x
add bx,200
;200-y
mov cx,y
sub cx,200
neg cx
putpix bx,cx
;200-x
mov bx,x
sub bx,200
neg bx
;200+y
mov cx,y
add cx,200
putpix bx,cx

cmp d2,0
jle else2
dec y
mov bx,tworxsq
sub dyy,bx
;d2=d2-dy+rxsq;
mov bx,rxsq
add bx,dyy
sub d2,bx
jmp ifexit2
else2:
inc x
dec y
mov bx,tworxsq
sub y,bx
add dx,tworysq
;d2=d2+dx-dy+rxsq;
mov bx,dxx
add bx,rxsq
sub bx,dyy
sub d2,dx
ifexit2:
jmp lw2
endw2:
getch:mov ah,0
int 16h
mov ah,4ch
int 21h

main endp
end main

kiuhnmgtrdcv
شنبه 27 تیر 1388, 21:14 عصر
با این دو تا ارور چی کار کنم ؟
http://img2.pict.com/4c/e5/35/1228808/0/33.gif
http://img2.pict.com/4c/e5/35/1228808/0/33.gif

kiuhnmgtrdcv
دوشنبه 29 تیر 1388, 11:35 صبح
سلام من که نرسیدم این پروژه سرموعد تحویل بدم ولی برای دوستانی که میخواهند این کارو انجام بدند : برای رسم شکل هندسی در اسمبلی باید از الگوریتم BresnHam استفاده کرد من کد بالا بهینه کردم ولی بعلت کمی وقت نتونستم به طور کامل اینو درست کنم

kiuhnmgtrdcv
پنج شنبه 15 مرداد 1388, 18:24 عصر
سلام دوستان
من بالاخره موفق شدم یه بیضی در اسمبلی رسم کنم
plotadot تابعی که یه پیکسل رسم مکینه
واقعا کار طاقت فرسایی بود





.MODEL small
.DATA


X_centre EQU [si]
Y_centre EQU [si+2]
A EQU word ptr [si+4]
B EQU word ptr [si+6]
colour EQU byte ptr [si+8]
plotadot EQU [si+14]

X_offset dw ?
Y_offset dw ?
temp dw ?
;----------------------------------------------------------------
.CODE
PUBLIC ellipse

ellipse proc uses ax bx cx dx

mov al,colour


mov cx,X_centre
mov dx,Y_centre
add dx,B

call plotadot


mov dx,Y_centre
sub dx,B

call plotadot

add cx,A
mov dx,Y_centre

call plotadot

mov cx,X_centre
sub cx,A

call plotadot


mov cx,A
dec cx

eloop: push cx

mov temp,cx
fild temp
fimul temp
fild A
fimul A

fdiv
fld1
fsubr
fsqrt
fimul B
fistp y_offset

mov dx,Y_offset
mov X_offset,cx
mov cx,X_centre
add cx,X_offset

mov dx,Y_centre
add dx,Y_offset

call plotadot

mov dx,Y_centre
sub dx,Y_offset

call plotadot
mov cx,X_centre
sub cx,X_offset

call plotadot

mov dx,Y_centre
add dx,Y_offset

call plotadot

skip: pop cx
loop eloop

ret
ellipse endp
end

SMRAH1
یک شنبه 27 دی 1388, 14:44 عصر
سلام
من که نتونستم کامپایلش کنم (تابع plotadot + فراخوانی مناسب و کامپایلر Tasm)لطفا کد کامل رو بگذارید (که کامپایل بشه . اجرا شه) تا ما هم فیض ببریم.
موفق باشید

kiuhnmgtrdcv
یک شنبه 27 دی 1388, 22:37 عصر
شما اینو امتحان کنید یا حق


putpix macro x,y
mov cx,x
mov dx,y
mov ah,0ch
mov al,9
int 10h
putpix endm

init macro
mov al,12h
mov ah,0
int 10h
init endm

.MODEL small

EXTRN plot4:proc
.386

.DATA
X_centre EQU [si] ;Centre of the ellipse
Y_centre EQU [si+2] ;
A EQU word ptr [si+4] ;Ellipse 1/2 width
B EQU word ptr [si+6] ;Ellipse 1/2 height
colour EQU byte ptr [si+8] ;Colour attribute
E_angle EQU dword ptr [si+10] ;For possible later expansion. REAL4
plotadot EQU [si+14] ;Address of the pixel plotting routine

error dd 0 ;Signed error value
Asquared dd 0
Bsquared dd 0
Y_times_Asquared dd 0
;-------------------------------------------------------------------------------
.CODE
PUBLIC ellipse
;-----------------------------------------------;
; X**2/A**2 + Y**2/B**2 = 1 ;
; ;
; Where, 2A is the ellipse width and B is the ;
; ellipse height. ;
; ;
; Uses the Keitzle algorithm ;
;
;-----------------------------------------------;

ellipse proc uses ax bx cx dx di

xor edi,edi
xor cx,cx ;Intialise X coordinate to 0
mov di,B ; " Y coordinate to B

xor eax,eax ;Make sure the high word is clear
mov ax,A
mul eax
mov Asquared,eax ;A^2
mul edi
mov Y_times_Asquared,eax ;Y*A^2; initial value

xor eax,eax
mov ax,B
mul eax
mov Bsquared,eax ;B^2

mov ebx,0 ;Use ebx to hold X*B^2
mov error,0 ;Intialise the error to 0

; Plot the octant from the top to the top-right


.WHILE ebx <= Y_times_Asquared ;While X*B^2 <= Y*A^2

call plot4 ;cx & di hold the X & Y coordinates

mov eax,Bsquared
mul ecx ;Multiply by X
mov ebx,eax ;ebx now contains X*B^2
add eax,eax ;2*X*B^2
add eax,Bsquared ;2*X*B^2 + B^2
add error,eax ;Update the error value
inc cx ;Increment X
mov eax,Asquared
mul edi ;edx:eax = Y*A^2
mov Y_times_Asquared,eax ;Update value

.IF error >= eax ;If error >= Y*A^2

add eax,eax ;2*Y*A^2
sub eax,Asquared ;2*Y*A^2 - A^2
sub error,eax ;Error = error - 2*Y*A^2 + A^2
dec di ;Decrement Y

.ENDIF
.ENDW

; Plot the octant from right to top-right

xor ecx,ecx
mov cx,A ;Set X to A

mov edi,0 ;Set Y to 0
mov error,0

mov Y_times_Asquared,0

.WHILE ebx > Y_times_Asquared ;While X*B^2 > Y*A^2

call plot4

mov eax,Asquared
mul edi ;Multiply by Y2
mov Y_times_Asquared,eax ;Update value
add eax,eax ;2*Y*A^2
add eax,Asquared ;2*Y*A^2 + A^2
add error,eax ;Update the error value
inc di ;Increment Y

mov eax,Bsquared
mul ecx ;edx:eax = X*B^2
mov ebx,eax ;ebx now contains X*B^2

.IF error >= eax ;IF error >= X*B^2

add eax,eax ;2*X*B^2
sub eax,Bsquared ;2*X*B^2 - B^2
sub error,eax ;Error = error - 2*X*B^2 + B^2
dec cx ;Decrement X

.ENDIF
.ENDW

ret
ellipse endp
end

SMRAH1
یک شنبه 27 دی 1388, 23:21 عصر
سلام

از توجهت ممنونم.با این حال چند سئوال مهم وجود داره:
1) دقیقا از چه اسمبلری استفاده کنم؟ (با Tasm و ...کار نمی کنه چون جملاتی مثل IF و While رو نمیشناسن شاید باید از fasm یا ... استفاده بشه)
2) به نظر میاد یک فایل برنامه دیگه (به زبان دیگه ) همراه برنامه باشه چون توابعی مثل plot4 اصلا معرفی نشدن و برنامه اصلا EntryPoint نداره.
3) اگر ممکنه خط دستور کامپایل رو هم بگذار (منظورم اینه که شاید باید از سوئیچ خاصی در کامپایل یا لینک استفاده کنم)

موفق باشی

kiuhnmgtrdcv
دوشنبه 28 دی 1388, 22:28 عصر
تابع plot4...


.MODEL small

EXTRN normalise:dword
.DATA
xc EQU [si]
yc EQU [si+2]
colour EQU byte ptr [si+8]
plotadot EQU [si+14]

temp dw ?
Xcoord dw ?
Ycoord dw ?

.CODE
PUBLIC plot4

plot4 PROC USES bx cx dx di

mov al,colour
mov dx,di
mov Xcoord,cx
mov Ycoord,dx
add cx,XC
add dx,YC
push dx

call plot

mov dx,Ycoord
neg dx
add dx,YC
mov di,dx
call plot

mov cx,Xcoord
neg cx
add cx,XC
pop dx

call plot

mov dx,di

call plot

ret

plot4 ENDP

plot proc




sub dx,YC
mov temp,dx
fild temp

fdiv normalise

fistp temp
mov dx,temp
add dx,YC

call plotadot

ret
plot endp

end


از masm استفاده کنید
روش بالا سریع ترین روش نیست
بهترین و سریع ترین الگوریتم ، الگوریتم Bresnham است