Apagada docs

Aprendiendo a programar el pasado

Herramientas de usuario

Herramientas del sitio


es:basic:gwbasic:pinta.bas

Pinta, Pintarel y Zoomdraw

Pinta

Pinta es un programa que permite dibujar en la pantalla (rudimentariamente) y genera un listado basic. El propio programa confía en la instrucción CHAIN MERGE para ir ejecutando el programa generado.

10 REM programa simple de dibujo por comandos
20 SCREEN 2:CLS:LINEA=10
30 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1
40 ESTADO=0
50 IN$=INKEY$:IF IN$="" THEN GOTO 50
60 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y)
70 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV)
80 IF IN$="8" THEN Y=Y-1
90 IF IN$="2" THEN Y=Y+1
100 IF IN$="6" THEN X=X+1
110 IF IN$="4" THEN X=X-1
120 IF IN$=CHR$(13) THEN GOSUB 220
130 IF IN$=CHR$(27) THEN ESTADO=1
140 P=POINT(X,Y):PSET (X,Y):IF P=1 THEN PRESET(X,Y)
150 PV=POINT(XV,YV):PSET (XV,YV):IF P=1 THEN PRESET(XV,YV)
160 IF IN$="S" OR IN$="s" THEN GOSUB 300
170 IF IN$="p" OR IN$="P" THEN GOSUB 390
180 IF IN$="B" OR IN$="b" THEN GOSUB 350
190 IF IN$="C" OR IN$="c" THEN GOSUB 220
200 IF IN$="L" OR IN$="l" THEN GOTO 460
210 GOTO 50
220 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN
230 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN
240 IF ESTADO=2 THEN LINE (XV,YV)-(X,Y),,B:GOTO 260
250 LINE (XV,YV)-(X,Y)
260 B$=(STR$(LINEA)+"line ("+STR$(XV)+","+STR$(YV)+")-("+STR$(X)+","+STR$(Y)+")")
270 IF ESTADO=2 THEN B$=B$+",,b"
280 PRINT #1,B$:LINEA=LINEA+10
290 ESTADO=0:RETURN
300 REM grabar
310 INPUT "Grabar archivo. Nombre? ";A$
320 PRINT #1,LINEA;"linea=";LINEA
330 CLOSE #1:SHELL "copy temporal.bas "+A$:OPEN "TEMPORAL.BAS" FOR APPEND AS #1
340 RETURN
350 REM borrar
360 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT "                "
370 IF A$="S" OR A$="s" THEN RUN
380 RETURN
390 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y)
400 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV)
410 PAINT (X,Y),1
420 IF P=0 THEN PSET(X,Y) ELSE PRESET(X,Y)
430 IF PV=0 THEN PSET(XV,YV) ELSE PRESET(XV,YV)
440 B$=(STR$(LINEA)+"paint("+STR$(X)+","+STR$(Y)+"),1")
450 PRINT #1,B$:LINEA=LINEA+10:RETURN
460 INPUT "nombre del archivo?";N$
470 OPEN N$ FOR APPEND AS #2
480 CLOSE #1
490 SHELL"copy "+N$+" temporal.bas >NUL":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
500 PRINT #1 ,"9999 common linea:chain "+CHR$(34)+"pinta3"+CHR$(34)+",520":CLOSE #1
510 CLS:RUN "temporal"
520 REM LINEA=EOF(1)*10
530 OPEN "temporal.bas" FOR APPEND AS #1:GOTO 50


Pintarel

Pintarel es la siguiente evolución de Pinta. En lugar de insertar coordenadas absolutas, inserta coordenadas relativas en el listado basic generado, de forma que se puede mover el dibujo (por aquella época yo no imaginaba que se podía hacer algo parecido con DRAW).

10 REM programa simple de dibujo por comandos/relativo
20 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1
30 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1
40 ESTADO=0
50 IN$=INKEY$:IF IN$="" THEN GOTO 50
60 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y)
70 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV)
80 IF IN$="8" THEN Y=Y-1
90 IF IN$="2" THEN Y=Y+1
100 IF IN$="6" THEN X=X+1
110 IF IN$="4" THEN X=X-1
120 IF IN$=CHR$(13) THEN GOSUB 220
130 IF IN$=CHR$(27) THEN ESTADO=1
140 P=POINT(X,Y):PSET (X,Y):IF P=1 THEN PRESET(X,Y)
150 PV=POINT(XV,YV):PSET (XV,YV):IF P=1 THEN PRESET(XV,YV)
160 KEY 1,"SALVAR":KEY(1)ON:ON KEY (1) GOSUB 300
170 KEY 2,"PINTAR":KEY(2)ON:ON KEY (2) GOSUB 390
180 KEY 3,"BORRAR":KEY(3)ON:ON KEY (3) GOSUB 350
190 KEY 4,"CUADRO":KEY(4)ON:ON KEY (4) GOSUB 215
200 KEY 5,"CARGAR":KEY(5)ON:ON KEY (5) GOSUB 460
210 GOTO 50
215 IN$="c"
220 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN
230 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN
240 IF ESTADO=2 THEN LINE (XV,YV)-(X,Y),,B:GOTO 260
250 LINE (XV,YV)-(X,Y)
260 B$=(STR$(LINEA)+"line ((" +STR$(XV)+"px)*rx,("+STR$(YV)+"py)*ry)-((" +STR$(X)+"+px)*rx,("+ STR$(Y)+"+py)*ry),c")
270 IF ESTADO=2 THEN B$=B$+",,b"
280 PRINT #1,B$:LINEA=LINEA+10
290 ESTADO=0:RETURN
300 REM grabar
310 INPUT "Grabar archivo. Nombre? ";A$
320 PRINT #1,LINEA;"linea=";LINEA
330 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
340 RETURN
350 REM borrar
360 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT "                "
370 IF A$="S" OR A$="s" THEN RUN
380 RETURN
390 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y)
400 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV)
410 PAINT (X,Y),1
420 IF P=0 THEN PSET(X,Y) ELSE PRESET(X,Y)
430 IF PV=0 THEN PSET(XV,YV) ELSE PRESET(XV,YV)
440 B$=(STR$(LINEA)+"paint(("+STR$(X)+"+px)*rx,("+STR$(Y)+"+py)*ry),c")
450 PRINT #1,B$:LINEA=LINEA+10:RETURN
460 INPUT "nombre del archivo?";N$
470 OPEN N$ FOR APPEND AS #2
480 CLOSE #1:CLOSE #2
490 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
500 PRINT #1 ,"9999 common linea:chain "+CHR$(34)+"pintaxxx"+CHR$(34)+",520":CLOSE #1
510 CLS:RUN "temporal"
520 REM LINEA=EOF(1)*10
530 OPEN "temporal.bas" FOR APPEND AS #1:GOTO 50


Zoomdraw

Zoomdraw añade a Pintarel la posibilidad de cambiar el tamaño de los objetos pintados, es decir, crea objetos que, además de poderse desplazar (cambiando px y py) se pueden cambiar de tamaño (cambiando rx y ry) (en realidad esta posibilidad ya estaba en pintarel, pero faltaba poder cambiar el tamaño del archivo cargado).

10 REM programa simple de dibujo por comandos/relativo
15 KEY ON
20 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320
30 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410
40 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370
50 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230
60 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480
70 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560
75 KEY 7,"CIRCULO":KEY(7) ON:ON KEY (7) GOSUB 700
80 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1
90 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1
100 ESTADO=0
110 IN$=INKEY$:IF IN$="" THEN GOTO 110
120 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY)
130 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY)
140 IF IN$="8" THEN Y=Y-1/RY
150 IF IN$="2" THEN Y=Y+1/RY
160 IF IN$="6" THEN X=X+1/RX
170 IF IN$="4" THEN X=X-1/RX
180 IF IN$=CHR$(13) THEN GOSUB 240
190 IF IN$=CHR$(27) THEN ESTADO=0
200 P=POINT(X*RX+PX,Y*RY+PY):PSET (X*RX+PX,Y*RY+PY):IF P=1 THEN PRESET(X*RX+PX,Y*RY+PY)
210 PV=POINT(XV*RX+PX,YV*RY+PY):PSET (XV*RX+PX,YV*RY+PY):IF P=1 THEN PRESET(XV*RX+PX,YV*RY+PY)
220 LOCATE 1,1:PRINT USING"####.###";X,Y:GOTO 110
230 IN$="c"
240 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN
250 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN
260 IF ESTADO=2 THEN LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY),,B:GOTO 280
265 IF ESTADO=3 THEN GOSUB 700
270 LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY)
280 B$=(STR$(LINEA)+"line (" +STR$(XV)+"*rx+px,"+STR$(YV)+"*RY+py)-(" +STR$(X)+"*rx+px,"+ STR$(Y)+"*ry+py),c")
290 IF ESTADO=2 THEN B$=B$+",,b"
300 PRINT #1,B$:LINEA=LINEA+10
310 ESTADO=0:RETURN
320 REM grabar
330 INPUT "Grabar archivo. Nombre? ";A$
340 PRINT #1,LINEA;"linea=";LINEA
350 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
360 RETURN
370 REM borrar
380 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT "                "
390 IF A$="S" OR A$="s" THEN RUN
400 RETURN
410 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY)
420 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY)
430 PAINT (X*RX+PX,Y*RY+PY),1
440 IF P=0 THEN PSET(X*RX+PX,Y*RY+PY) ELSE PRESET(X*RX+PX,Y*RY+PY)
450 IF PV=0 THEN PSET(XV*RX+PX,YV*RY+PY) ELSE PRESET(XV*RX+PX,YV*RY+PY)
460 B$=(STR$(LINEA)+"paint("+STR$(X)+"*rx+px,"+STR$(Y)+"*ry+py),c")
470 PRINT #1,B$:LINEA=LINEA+10:RETURN
480 INPUT "nombre del archivo?";N$
490 OPEN N$ FOR APPEND AS #2
500 CLOSE #1:CLOSE #2
510 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
520 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",540,all":CLOSE #1
530 CLS:RUN "temporal"
540 BEEP:REM LINEA=EOF(1)*10
550 BEEP:OPEN "temporal.bas" FOR APPEND AS #1:KEY ON:GOTO 620
560 LOCATE 22,1:INPUT "¨Tama¤o x,y?",RX,RY:LOCATE 22,1:PRINT SPACE$(80)
570 LOCATE 22,1:INPUT "¨coordenadas?",PX,PY:LOCATE 22,1:PRINT SPACE$(80)
580 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",600,all":CLOSE #1
590 CLS:CHAIN "temporal",10,ALL
600 REM carga las teclas de nuevo
610 OPEN "temporal.bas" FOR APPEND AS #1:KEY ON
620 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320
630 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410
640 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370
650 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230
660 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480
670 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560
680 GOTO 110
700 IF ESTADO=0 THEN XV=X:YV=Y:ESTADO=3:RETURN
710 IF ESTADO>0 AND ESTADO<3 THEN RETURN
720 RA=((X-XV)^2+(Y-YV)^2)^(1/2)
730 CIRCLE (XV*RX+PX,YV*RY+PY),RA*RX,C,,,(RX/RY)
740 B$=STR$(LINEA)+"CIRCLE ("+STR$(XV)+"*RX+PX,"+STR$(YV)+"*RY+PY),"+STR$(RA)+"*RX,C,,,(RY/RX)"
750 PRINT #1,B$:LINEA=LINEA+10:RETURN

Zoomgraf

Realmente no tengo muy claro qué añade Zoomgraf a todo esto…

10 REM programa simple de dibujo por comandos/relativo
15 KEY ON
20 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320
30 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410
40 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370
50 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230
60 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480
70 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560
80 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1
90 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1
100 ESTADO=0
110 IN$=INKEY$:IF IN$="" THEN GOTO 110
120 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY)
130 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY)
140 IF IN$="8" THEN Y=Y-1/RY
150 IF IN$="2" THEN Y=Y+1/RY
160 IF IN$="6" THEN X=X+1/RX
170 IF IN$="4" THEN X=X-1/RX
180 IF IN$=CHR$(13
 
) THEN GOSUB 240
190 IF IN$=CHR$(27) THEN ESTADO=0
200 P=POINT(X*RX+PX,Y*RY+PY):PSET (X*RX+PX,Y*RY+PY):IF P=1 THEN PRESET(X*RX+PX,Y*RY+PY)
210 PV=POINT(XV*RX+PX,YV*RY+PY):PSET (XV*RX+PX,YV*RY+PY):IF P=1 THEN PRESET(XV*RX+PX,YV*RY+PY)
220 LOCATE 1,1:PRINT USING"####.###";X,Y:GOTO 110
230 IN$="c"
240 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN
250 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN
260 IF ESTADO=2 THEN LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY),,B:GOTO 280
270 LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY)
280 B$=(STR$(LINEA)+"line (" +STR$(XV)+"*rx+px,"+STR$(YV)+"*RY+py)-(" +STR$(X)+"*rx+px,"+ STR$(Y)+"*ry+py),c")
290 IF ESTADO=2 THEN B$=B$+",,b"
300 PRINT #1,B$:LINEA=LINEA+10
310 ESTADO=0:RETURN
320 REM grabar
330 INPUT "Grabar archivo. Nombre? ";A$
340 PRINT #1,LINEA;"linea=";LINEA
350 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
360 RETURN
370 REM borrar
380 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT "                "
390 IF A$="S" OR A$="s" THEN RUN
400 RETURN
410 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY)
420 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY)
430 PAINT (X*RX+PX,Y*RY+PY),1
440 IF P=0 THEN PSET(X*RX+PX,Y*RY+PY) ELSE PRESET(X*RX+PX,Y*RY+PY)
450 IF PV=0 THEN PSET(XV*RX+PX,YV*RY+PY) ELSE PRESET(XV*RX+PX,YV*RY+PY)
460 B$=(STR$(LINEA)+"paint("+STR$(X)+"*rx+px,"+STR$(Y)+"*ry+py),c")
470 PRINT #1,B$:LINEA=LINEA+10:RETURN
480 INPUT "nombre del archivo?";N$
490 OPEN N$ FOR APPEND AS #2
500 CLOSE #1:CLOSE #2
510 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1
520 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",540,all":CLOSE #1
530 CLS:RUN "temporal"
540 BEEP:REM LINEA=EOF(1)*10
550 BEEP:OPEN "temporal.bas" FOR APPEND AS #1:KEY ON:GOTO 620
560 LOCATE 22,1:INPUT "¨Tama¤o x,y?",RX,RY:LOCATE 22,1:PRINT SPACE$(80)
570 LOCATE 22,1:INPUT "¨coordenadas?",PX,PY:LOCATE 22,1:PRINT SPACE$(80)
580 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",600,all":CLOSE #1
590 CLS:CHAIN "temporal",10,ALL
600 REM carga las teclas de nuevo
610 OPEN "temporal.bas" FOR APPEND AS #1:KEY ON
620 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320
630 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410
640 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370
650 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230
660 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480
670 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560
680 GOTO 110


Ejemplo de código generado

Ejemplo de imagen generada con Pinta.bas: una casita en un paisaje, y bajo ella el mensaje "Pulse cualquier tecla para continuar"

5 SCREEN 2
10 LINE( 356, 86)-( 331, 77)
20 LINE( 331, 77)-( 304, 87)
30 LINE( 304, 87)-( 246, 71)
40 LINE( 246, 71)-( 278, 61)
50 LINE( 278, 61)-( 331, 77)
60 LINE( 356, 87)-( 356, 102)
70 LINE( 356, 102)-( 307, 102)
80 LINE( 307, 102)-( 306, 102)
90 LINE( 305, 102)-( 305, 88)
100 LINE( 305, 102)-( 244, 88)
110 LINE( 244, 88)-( 245, 72)
120 LINE( 245, 72)-( 245, 72)
130 LINE( 245, 82)-( 211, 73)
140 LINE( 211, 73)-( 152, 77)
150 LINE( 152, 77)-( 132, 68)
160 LINE( 132, 68)-( 43, 86)
170 LINE( 130, 68)-( 13, 78)
180 LINE( 13, 78)-( 42, 75)
190 LINE( 42, 75)-( 7, 65)
200 LINE( 212, 74)-( 245, 77)
210 LINE( 297, 66)-( 368, 59)
220 LINE( 368, 59)-( 411, 51)
230 LINE( 411, 51)-( 434, 34)
240 LINE( 434, 34)-( 460, 40)
250 LINE( 460, 40)-( 586, 47)
260 LINE( 586, 47)-( 639, 33)
270 LINE( 435, 34)-( 505, 42)

Este sitio web utiliza cookies. Al utilizar el sitio web, usted acepta almacenar cookies en su computadora. También reconoce que ha leído y entendido nuestra Política de privacidad. Si no está de acuerdo abandone el sitio web.Más información
es/basic/gwbasic/pinta.bas.txt · Última modificación: 2024/03/31 12:35 por nepenthes