· Text 619 · w8 · inlagg
Jag satt och pula litet med assembler och lyckades göra en rutin för
att rita linjer. Då blev jag glad. Men när jag till sist prövade upptäckte
jag att den var slö, lika slö som samma rutin i BASIC. Då deppade jag
ihop: - Är jag så soppig. Nåväl.
Så här ser logik-schemat ut:
integer: X1,Y1,X2,Y2,Color,Dfdx,Dfdy,Dx,Dy,X,Y;
LINE(X1,Y1,X2,Y2)
INIT_seq_
Dfdx:=X2-X1;
Dfdy:=Y2-Y1;
Dx:=SGN(Dfdx);
Dy:=SGN(Dfdy);
X:=X1;
Y:=Y1;
NDOT_sel_ _if_ ABS(Dfdx)>ABS(Dfdy)
Ndots:=ABS(Dfdx);
NDOT_or_
Ndots:=ABS(Dfdy);
NDOT_end_
INIT_end_
PLOT(X,Y);
DRAW_iter_ _while_ Ndots>0
STEP_sel_ _if_ F(X+Dx,Y)<F(X,Y+Dy) && F(X+Dx,Y)<F(X+Dx,Y+Dx)
X:=X+Dx;
STEP_or_ _if_ F(X,Y+Dy)<F(X+Dx,Y) && F(X,Y+Dy)<F(X+Dx,Y+Dx)
Y:=Y+Dy;
STEP_or_
X:=X+Dx;
Y:=Y+Dy;
STEP_end_
PLOT(X,Y);
Ndots:=Ndots-1;
DRAW_end_
LINE_end_
F_seq_
Q:=(Y-Y1)*Dfdx-(X-X1)*Dfdy
RETURN ABS(Q)
F_end_
Vad rutinen egentligen gör är att man kollar derivatan i tre koordinater
'framför' den punkt man befinner sig på. Den koordinat vars derivata
som ger största likhet med derivatan man får genom att ta start- och
slutkoordinat.
samband:
Y2 - Y1 Y - Y1
--------- = --------
X2 - X1 X - X1
För att likhet skall råda måste punkten (X,Y) ligga exakt på linjen mellan
P1 och P2. Desto längre bort punkten ligger desto större olikhet kommer
det att bli.
Om man korsmultiplicerar uttrycket och flyttar över det ena ledet till
andra sidan får man uttrycket i funktionen F.
(Y - Y1)*(X2 - X1) - (X - X1)*(Y2 - Y1)
Med hjälp av detta kan man bestämma till vilken punkt man skall gå härnäst.
Om det finns nån som kan få ner detta i assembler (vilket jag iofs har
gjort men det blev inte så bra, fungerade gjorde den förvisso, men inte
tillräckligt snabbt). Eller om det finns nån som har nån bättre metod
så skulle jag uppskatta det. Rutinen skall användas i assembler så en
snutt i assembler vore uppskattat.
När jag fått ordning på't så skall klubben få't. Vad det blir får ni
se, om det blir klart nå'n gång. (tyffverr blir det nog bara för 806,
<men om nån vill ta källkoden så kan han göra om det till ABC800).
moss / Patric