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
). 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)