V.4.8. В ы в о д р и с у н к о в на п р и н т е р ...Вы печатаете на клавиатуре заклинание, и вот экран дисплея оживает, показывая объекты, которых не было и не может быть ни- когда. Ф.П.Брукс Твердая копия - зафиксированное на бумажном носителе изображение на экране дисплея. Толковый словарь по вычислительной технике и программированию А сейчас мы научим Вас выводить на печатающее устройство (принтер) ри- сунки, изображенные компьютером на экране дисплея. Для этого используем вспомогательную подпрограмму, записанную в двоичных кодах, загрузка кото- рой в оперативную память компьютера осуществляется подпрограммой с именем HARDCOPY.BAS . П р и м е р 1 [14]. Восстановим облик хищного тираннозавра (ящера-раз- ───────────────── бойника), жившего в мезозойскую эру (он достигал высоты 5 м, длины 14 м). NEW Ok 10 CLS:COLOR 1,15,8:SCREEN2:R=5/6 30 READ N:IF N=0 THEN 350 50 READ X1,Y1:X1=X1/2:Y1=Y1/.9:Y1=Y1*R 70 FOR P=2 TO N:READ X2,Y2:X2=X2/2:Y2=Y2/.9:Y2=Y2*R 90 LINE(X1,Y1)-(X2,Y2),1:X1=X2:Y1=Y2:NEXT P 130 GOTO 30 135 'Основная часть туловища тираннозавра 140 DATA 38,223,60,180,71,173,65,174,63,179,64,180,62,185,62,187,60,19 2,60,194,57,200,57,202,55,183,55,182,59,172,58,171,62,165,57,170,50,22 0,31,233,31,245,40,260,60,290,67,315,72 170 DATA 345,80,360,87,380,105,400,127,425,145,452,155,502,164,450,164, 434,162,415,158,395,153,362,138,323,132,283,125 190 'Большая задняя лапа. 200 DATA 16,289,92,250,120,250,135,260,157,233,163,247,163,240,165,257, 164,256,166,272,159,270,153,278,140,280,120,285,120,310,120,330,112 230 'Маленькая задняя лапа. 240 DATA 11,295,127,303,158,278,162,288,162,282,163 250 DATA 291,164,283,165,315,162,315,157,325,137,323,132 260 'Передняя лапа. 270 DATA 11,238,77,220,87,192,99,192,102,195,100 280 DATA 198,102,200,100,203,102,205,98,218,96,255,83 290 'Остальная часть тираннозавра. 300 DATA 3,258,114,245,105,228,93,3,222,86,215,77,210,65 320 'Глаз. 330 DATA 4,220,42,210,45,215,40,220,42,0 350 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 360 A=USR(0)'Вызов подпрограммы вывода на принтер,загруженной ранее в оперативную память подпрограммой HARDCOPY.BAS 370 END '"What you see is what you get!" 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 55070 DATA EF,21,9B,EF,CD,87,EF,0E,08,2A,AC 55080 DATA EF,CD,4A,00,57,E6,0F,5F,CB,3A,CB,3A 55090 DATA CB,3A,CB,3A,00,3E,0F,BA,20,0D,BB 55100 DATA 20,03,AF,18,11,CD,7F,EF,EE,FF,18 55110 DATA 0A,BB,28,04,3E,FF,18,03,CD,7F,EF,23 55120 DATA 22,AC,EF,06,08,21,AE,EF,CB,27,CB 55130 DATA 1E,23,10,F9,0D,20,BE,06,08,21,AE 55140 DATA EF,7E,CD,A5,00,23,10,F9,2A,AC,EF,AF 55150 DATA BD,20,A9,3E,0D,CD,A5,00,3E,0A,CD 55160 DATA A5,00,3E,38,BC,20,94,21,A2,EF,CD 55170 DATA 87,EF,C9,CB,AC,CD,4A,00,CB,EC,C9,7E 55180 DATA FE,FF,C8,CD,A5,00,23,18,F6,1B,54,31 55190 DATA 36,1B,45,1B,3E,0E,FF,1B,53,30,32,35 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 2. Лучше гор могут быть только горы. ───────────── В.Высоцкий Л.Карпентер и независимо от него А.Фурнье и Д.Фассел изобрели метод "ф р а к т а л е й"("fractal"), в котором неправильность естественных объ- ектов (линия берега,горы и т.д.) имитируется компьютером за счет внесения случайных вариаций в представленный художником рисунок, делая гладкие ли- нии изломанными и т.п. Методом фракталей удается получать на удивление ре- алистические горы, долины, с раскиданными по ним валунами,береговые линии, скопления звезд, цветные географические карты, хлопья снега, ветви деревь- ев и т.д., а художнику остается лишь задать небольшое количество точек. Алгоритм метода изложен в монографии [15]. В пространстве берется некоторый исходный треугольник и над ним выпол- няется следующая процедура. Находятся средние точки всех сторон треуголь- ника и переносятся (не обязательно в одной плоскости) на расстояние, про- порциональное длине соответствующей стороны. Коэффициент пропорциональнос- ти при этом выбирается случайным образом. Соединяя три получившиеся в ре- зультате точки, определяем четыре новых треугольника. Затем та же процеду- ра по очереди применяется к каждому из этих четырех треугольников. Теперь образуется 16 треугольников и т.д. Таким образом, из одного исходного тре- угольника можно получить целое множество треугольников, образующих очень сложную полигональную поверхность. Ее изображение создается обычным обра- зом: удаляются скрытые поверхности, и затем производится закраска. Приведенная ниже программа позволяет в любой момент времени вывести ри- сунок, изображенный на экране, "на принтер" по нажатию клавиши "p",после чего Вы можете продолжить работу программы, нажав любую клавишу. Итак,включайте скорее принтер... NEW Ok 10 COLOR 1,15,8:SCREEN2:C=120:O=RND(-TIME) 20 DIM P(300,2),L(300,2) 30 P(1,1)=10:P(1,2)=170:P(2,1)=240:P(2,2)=170:L(1,1)=1:L(1,2)=2:PTS=2: LNS=1:J=PTS:K=LNS 40 FOR I=1 TO LNS:J=J+1:K=K+1:S=LNS 50 IF I=1 THEN P1=J-1:P2=K-1:DIM Q3(S),Q4(S),Q5(S),Q6(S) 60 A=L(I,1):B=L(I,2):X1=P(A,1):Q3(I)=X1:Y1=P(A,2):Q4(I)=Y1 70 X2=P(B,1):Q5(I)=X2:Y2=P(B,2):Q6(I)=Y2:LINE(X1,Y1)-(X2,Y2):IF I==LB(X2-XA) THEN 210 180 LB(X2-XA)=Y2 190 IF UB(X2-XA)=0 THEN UB(X2-XA)=Y2 200 GOTO 230 210 IF Y2<=UB(X2-XA) THEN 240 220 UB(X2-XA)=Y2 230 LINE((X1-80)/2,Y1)-((X2-80)/2,Y2) 240 X1=X2:Y1=Y2 250 NEXT X,Z 350 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 360 A=USR(0) '──▶ 370 END '"What you see is what you get!" 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 4. Для написания данного алгоритма требуются знание мате- ───────────── матики в объеме средней школы. NEW Фраза из учебника по программированию Ok 2 DIM G(2000) 'Программа построения поверхностей! 4 DEFFNZ(X,Y)=(60^(2/3)-(X^2+Y^2)^(1/3))^(3/2) 'L=0 5 'DEFFNZ(X,Y)=SQR(20^2-(SQR(X^2+Y^2)-35)^2) 'L=0 6 'DEFFNZ(X,Y)=10*COS(.24*SQR(X^2+Y^2)) 'L=0 7 'DEFFNZ(X,Y)=COS(.1*X)*COS(.1*Y)*10 'L=0 8 'DEFFNZ(X,Y)=25*COS(2.5E-03*X*Y) 'L=0.6, L=0 9 'DEFFNZ(X,Y)=75*EXP(-SQR(X^2+Y^2)^2/600) 'L=0 10 'DEFFNZ(X,Y)=64E-05*X*Y*(X*X-Y*Y)/SQR(X^2+Y^2)'L=1.4, 'L=2 12 'DEFFNZ(X,Y)=SIN(SQR(X^2+Y^2)/5)/SQR(X^2+Y^2)*175 'L=0 13 'DEFFNZ(X,Y)=30*COS(X*.05*EXP(-Y*.01)) 'L=.785, L=0 14 'DEFFNZ(X,Y)=(X^2-Y^2)/45 'L=.785, L=0 15 'DEFFNZ(X,Y)=20*COS((X+Y)/LOG(X^2+Y^4+.5)) 'L=.785, L=0 16 'DEFFNZ(X,Y)=30*COS((X+Y)/LOG(X^2+Y^2+.5)) 'L=.785, L=0 17 'DEFFNZ(X,Y)=10*SIN(.1*(ABS(X)+ABS(Y))) 'L=0 18 INPUT"Угол поворота";L!:N!=COS(L!):M!=SIN(L!) 19 DEFFNF(X,Y)=FNZ(X*N!-Y*M!,X*M!+Y*N!) 20 COLOR1,15,1:SCREEN2:A=SQR(2) 30 FOR T=-90*A TO 90*A STEP A:W=-100:V=100:C=0:FOR I=-60 TO 60 STEP 6: J=I-T 35 IF J>60 OR J<-60 THEN 70 37 'IF20^2<(SQR(I^2+J^2)-35)^2THEN 70 'Только для строки 5! 40 'IF I=0 AND J=0 THEN 70 'Только для строк 10 и 12! 43 IF (I^2+J^2)^(1/3)>60^(2/3)THEN70 'Только для строки 4! 49 Y1%=INT(.70634*(I+J)+FNF(I,J)+.5) 50 IFY1%>W THEN W=Y1%:C=C+1:IF C=1 THENG(INT(T)+220)=W:V=W:GOTO 60 ELS E 60 55 IF Y1%60 OR I<-60 THEN 120 90 'IF20^2<(SQR(I^2+J^2)-35)^2THEN120 'Только для строки 5! 91 'IF I=0ANDJ=0 THEN 120 'Только для строк 10 и 12! 93 IF(I^2+J^2)^(1/3)>60^(2/3)THEN120 'Только для строки 4! 99 Y1%=INT(.70634*(I+J)+FNF(I,J)+.5) 100 IF Y1%>W THEN G(INT(T)+220)=Y1% ELSE 120 110 PSET(INT(120+.70634*(I-J)+.5),94-Y1%) 120 NEXTJ,T 150 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 160 A=USR(0) '──▶ 200 END 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· ··· 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 5 [16]. Рисуют головой, а не руками. ───────────── Микельанджело Буонарроти NEW Ok 15 COLOR 1,15,8:CLS:PRINT"Для вывода полученного графика на принтер на жмите клавишу ESC":PRINT 20 PRINT "1. Построение графика функции в декартовых координатах":PRIN T "2. Построение кривых в полярных координатах":INPUT"Режим (1,2)";SW: ON SW GOTO 110,390 50 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 70 ' ∗ Построение графика функции в декартовых координатах∗ 90 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 110 SX=255:SY=191:HY=SY/2 'Форматирование экрана дисплея! 120 CLS:DEFFNA(X)=EXP(-ABS(X))*SIN(1/X) 130 PRINT"Область изменения X:" 140 INPUT"min-значение:";A:INPUT"max-значение:";B:PRINT 160 IF A>=B THEN PRINT"Ошибка!":GOTO130 170 INPUT"Количество точек на единицу площади экрана";W 180 C=(B-A)/100:M=1E-30:SCREEN2 'C-шаг 200 FORX=ATOBSTEPC:IFX=0THENNEXT'Учет области определения! 220 Y=ABS(FNA(X)):IF MSY THEN NEXT 290 PSET(U,V),1:NEXT:GOTO 800 320 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 340 ' ∗ Кривые в полярных координатах ∗ 370 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 390 SX=255:SY=191:RAT=.86:HY=SY/2:HX=SX/2 410 CLS:DEFFNA(Z)=COS(8*Z) 420 ?"X=COS(A·Z)COS(8·Z)":?"Y=SIN(B·Z)COS(8·Z)":PRINT 440 INPUT"A=";A:INPUT"B=";B 450 M=1E-30:FOR Z=0 TO 8*ATN(1):R=ABS(FNA(Z)) 470 IF MSXTHENNEXT 530 V=HY+HY*SIN(B*Z)*R/M:IF V<0 OR V>SY THEN NEXT 550 PSET(U,V),1:NEXT 800 PIT$=INKEY$:IF PIT$<>CHR$(27) THEN 800 830 GOSUB 850'──▶ 840 A=USR(0):END '───────▶ 850 DT=&HEF00:DEFUSR=DT:RESTORE 890 860 FOR I=0 TO &HAB:READ DT$:POKE DT+I,VAL("&H"+DT$) 880 NEXT:RETURN '──▶ 890 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· ··· 1030 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 6. Обратите внимание на подпрограмму вывода на принтер ───────────── она написана на "чистом" MSX-BASIC ! NEW Ok 20 SCREEN 2:COLOR 13,1,1:CLS 40 CIRCLE (120,96),88:CIRCLE (120,96),88,,,,8/11 60 CIRCLE (120,96),88,,,,5/11:CIRCLE (120,96),88,,,,2/11 80 CIRCLE (120,96),88,,,,11/8:CIRCLE (120,96),88,,,,11/5 100 CIRCLE (120,96),88,,,,11/2 110 PAINT (86,27):PAINT (121,26):PAINT (154,27):PAINT (51,65) 150 PAINT (94,50):PAINT (141,50):PAINT (187,61):PAINT (67,76) 190 PAINT (121,69):PAINT (169,71):PAINT (44,95):PAINT (88,102) 230 PAINT (150,97):PAINT (193,97):PAINT (68,121):PAINT (121,120) 270 PAINT (169,119):PAINT (57,133):PAINT (95,144):PAINT (142,143) 310 PAINT (187,129):PAINT (85,162):PAINT (122,167):PAINT (151,164) 350 LINE (32,8)-(208,184),,B 360 PAINT(41,24):PAINT(195,22):PAINT(43,171):PAINT(193,170) 400 COLOR 7:LINE (212,4)-(27,188),,B:LINE (214,3)-(24,189),,B 430 GOSUB 1000 '──▶ 440 COLOR 15,4,7:END 1000 ' ∗∗∗∗∗∗∗∗∗ (C) by TOSHIBA ∗∗∗∗∗∗∗∗∗ 1040 DEFINT A-Z 1050 SMO=PEEK(&HFCAF) 1060 IF SMO<>2 THEN BEEP:RETURN 1070 BAK=PEEK(&HF3EA) 1080 COL=BASE(11) 1090 CGP=BASE(12) 1100 LPRINT CHR$(27);"T16";CHR$(27);"E";CHR$(14); 1110 LPRINT CHR$(27);">";:POKE &HF418,1 1120 FOR YIN=1 TO 24 1130 LPRINT CHR$(27);"S0256"; 1140 FOR XIN=1 TO 32 1150 FOR CLR=1 TO 8 1160 DT(CLR)=0 1170 NEXT CLR 1180 FOR BIN=1 TO 8 1190 DT=VPEEK(CGP):CGP=CGP+1 1200 C0=VPEEK(COL):COL=COL+1 1210 C1=(C0 AND &HF0)/&H10 1220 C0=C0 AND &HF 1230 IF C0<>BAK AND C1<>BAK THEN DT=&HFF:GOTO 1260 1240 IF C0=BAK AND C1=BAK THEN DT=0:GOTO 1260 1250 IF C1=BAK THEN DT=DT XOR &HFF 1260 DT$=BIN$(DT+256) 1270 FOR CAL=1 TO 8 1280 DT(CAL)=DT(CAL)+VAL(MID$(DT$,CAL+1,1))*(2^(BIN-1)) 1290 NEXT CAL 1300 NEXT BIN 1310 FOR LOT=1 TO 8 1320 LPRINT CHR$(DT(LOT)); 1330 NEXT LOT 1340 NEXT XIN:LPRINT 1350 NEXT YIN:LPRINT CHR$(27);"A";CHR$(27);"N"; 1360 LPRINT CHR$(15);CHR$(27);"<":POKE &HF418,0 1370 RETURN '──▶