Os dejo la version 2, que no usa ni divisiones ni multiplicaciones. Seguramente se podrá hacer más sencilla. Ya os lo diré cuando me ponga a ASMizarla ...
Por cierto, experimentando con esta rutina, he descubierto varias curiosidades del BASIC, como que recorta las coordenadas que se salen de pantalla y distorsiona las líneas que apuntan fuera de ella, o que mis líneas no quedan igual que las hace el BASIC...
Por cierto, aún no he mirado el algoritmo de Bresenham (que ya me vale
![Tongue](../../Smileys/default/tongue.gif)
). Tal vez le eche un vistazo para ver una alternativa.
NOTAS: La rutina está hecha para hacer el movimiento de un sprite. Si se quiere representar una línea, basta quitar el REM de la línea 1127, quitar la 1168 y modificar la condición de la 1190.
5 CLS
7 DEFINT A-Z
10 'algoritmo para desplazamiento
20 'lineal de un sprite
30 'v 2 - orientado a ASM - 19/8/2009
40 '
50 'punto inicio
60 INPUT "Inicio X,Y";XA,YA
70 '
80 'punto destino
90 INPUT "Destino X,Y";XB,YB
110 '
120 'calculo alto y ancho
130 'y valores absolutos
140 AL=YB-YA
150 AN=XB-XA
160 '
162 BL=ABS(AL)
165 BN=ABS(AN)
170 IF BN>BL THEN S=BN ELSE S=BL 'S toma el valor del eje mayor = pasos
200 'incrementar o decrementar coordenadas?
210 IF AN<0 THEN IX=-1 ELSE IX=1
220 IF AL<0 THEN IY=-1 ELSE IY=1
500 PRINT
510 PRINT"Alto ";AL
520 PRINT"Ancho ";AN
530 PRINT
550 PRINT"Pasos (longitud de linea)";S
560 PRINT
570 PRINT"Incremento X,Y ";IX,IY
1000 PRINT
1005 PRINT "A continuacion se representara la linea. Primero se dibujara con el comando LINE del BASIC. Pulsa una tecla para que se dibuje punto a punto con los valores calculados."
1007 PRINT
1010 PRINT "Pulsa una tecla para continuar ";INPUT$(1)
1020 '
1030 COLOR 15,4,4
1040 SCREEN 5
1042 OPEN "grp:" AS 1
1050 '
1060 LINE (XA,YA)-(XB,YB),15
1070 '
1080 PRINT INPUT$(1)
1090 '
1100 X=XA:Y=YA
1110 PX=BN:PY=BL 'contadores de "pasos"
1120 'se resta la dimension menor de la mayor
1125 '
1127 REM PSET (X,Y),1
1130 IF PX>=PY THEN PX=PX-PY:X=X+IX:PY=BL
1140 IF PY>=PX THEN PY=PY-PX:Y=Y+IY:PX=BN
1168 PSET (X,Y),1
1170 'se decrementa el contador de pasos "1". si es 0, hemos acabado
1180 S=S-1
1185 REM PRINT INPUT$(1)
1190 IF S>0 THEN 1120
1999 PRINT INPUT$(1)
2000 PSET (XB,YB),7
9999 BEEP
10000 PRINT INPUT$(1)