ВВЕДЕНИЕ
Эту книгу можно читать по-разному. Во-первых, ее можно рассматривать как книгу рецептов графических программ, позволяющих рисовать сложные картинки с помощью SPECTRUMa. Мы надеемся, что после того, как читатель нарисует эти картинки, у него возникнет желание узнать побольше о самих программах. Во-вторых, из некоторых программ можно составить пакет графических программ для генерации различного вида диаграмм (круговых диаграмм, гистограмм и графиков для коммерческих и лабораторных целей). И, наконец, главной целью данной книги является введение в предмет машинной графики, который начинается с ознакомления читателя с элементарными понятиями, а заканчивается такими сложными темами, как символьная графика, построение трехмерных объектов и алгоритмы удаления скрытых линий (и поверхностей).
Сложные программы, которые нам встретятся в этой книге, слишком связаны между собой, чтобы можно было ограничиться для их описания одними листингами. Более того, мы увидим, что некоторые элементарные алгоритмы повторяются чрезвычайно часто. По этой причине мы используем метод «сверху вниз» или модульный метод при составлении и изложении наших программ. Решение каждой задачи сводится к решению ряда более простых задач. Последние, в свою очередь, разлагаются на несколько еще меньших решаемых задач модулей. Каждый из этих модулей оформляется в виде подпрограммы бейсика, каждой из которых дается имя (состоящее из строчных букв). После чего эти модули объединяются для решения поставленной графической задачи.
Так как листинги программ используются для представления алгоритма решения той или иной подзадачи, то мы решили избегать использования утверждений вроде GO SUB 6000. Вместо этого мы предпочитаем присвоить идентификатору подпрограммы значение адреса в начале программы (например, LET SCENE A/3=6000), что позволяет нам использовать утверждения типа GO SUB SCENE A/3.
Спектрум-версия языка бейсик не позволяет передавать параметры в подпрограммы. Значения входных параметров должны задаваться операторами присваивания вне подпрограммы. А, кроме того, если выходные параметры используются вне подпрограммы, то их имена должны быть известны. Это обстоятельство может затруднить использование чужих пакетов подпрограмм. Пользователь должен знать имена входных и выходных параметров; в наших подпрограммах мы используем операторы-комментарии REM IN (для идентификации входных параметров). Мы нумеруем строки программы так, что все номера строк всех программных операторов оканчиваются нулями, а комментарии располагаются на строчках с номерами от 1 до 9 (кроме названий программ). Сразу за комментарием, объявляющим имя программы, на строчках с номерами, оканчивающимися на 1 и 2, следуют комментарии REM IN и REM OUT, описывающие входные и выходные параметры.
Для тех, кто желает только использовать программы, их полный список приводится в конце каждого параграфа вместе с подходящими значениями входных параметров.
Рекомендуем всем, включая серьезных читателей, перед чтением каждого параграфа, записать эти подпрограммы вместе с соответствующими входными данными на ленту или дискету. После этого программы можно загружать и выполнять (LOAD, MERGE, RUN) по мере их появления в тексте.
Наши программы написаны для SPECTRUMa с объемом памяти 48К: если у вашего компьютера память 16К, то вам следует прочитать приложение "А", где указаны необходимые изменения, которые надо внести в программы
В качестве показательного примера мы приводим программу, рисующую тело вращения (см. рис. 1).
Рис. 1
Эта программа требует выполнения операции MERGE с листингами программ 2.1 ("START"), 2.2 (две функции FNX и FNY), 2.3 ("SETORIGIN"), 2.4 ("MOVETO"), 3.3 ("CLIP" и "LINETO"). Эта комбинация программ называется "LIB1". Она предназначена для рисования на экране фигур, состоящих из линий.
К "LIB1" следует добавить листинги 3.4 ("ANGLE"), 8.1 ("MULT3", "IDR3"), 8.2 ("TRAN3"), 8.3 ("SCALE3"), 9.1 ("LOOK3"), 9.2 ("MAIN PROGRAM"). Комбинацию этих подпрограмм мы называем "LIB3", они служат для трансформации и осмотра тел в трехмерном пространстве.
Нам также потребуется подпрограмма, приведенная на листинге 10.3 ("REVBOD") и подпрограмма "FLYSAU" на листинге А. LISTING A
6000 REM SCENE3/FLYING SAUSER 6010 DIM X(12): DIM Y(12) 6020 DIM S(6): DIM T(6)
6030 DIM A(4,4): DIM B(4,4): DIM R(4,4) 6040 DATA 0,3,3,2,5,1,5,0,4,-1,0,-3 6050 RESTORE SCENE3
6060 LET REVBOD=6500
6069 REM CREATE OBJECT.
6070 LET NUMV=5
6080 INPUT "NUMBER OF ";"HORIZONTAL LINES=";NUMH
6090 INPUT "ANGLE PHI=";PHI
6100 FOR I=1 TO NUMV+1: READ S(I),T(I):NEXT I
6109 REM POSITION THE OBSERVER.
6110 GO SUB IDR3: GO SUB LOOK3
6119 REM DRAW OBJECT.
6120 GO SUB REVBOD
6130 RETURN
Для того чтобы получить фигуру, на рис. 1, значения входных параметров должны быть:
HORIZ=12, VERT=8, NUMH=16, PHI=0, EX=1, EY=2, EZ=3, DX=0, DY=0, DZ=0.
Каждое значение задается после соответствующего запроса программы. Наберитесь терпения, так как получение этой картинки займет минут пять. Пропустите программу с различным значением входных параметров. Что произойдет, если HORIZ=6 и VERT=4, а значения остальных параметров те же? Положите HORIZ=15, VERT=10, EX=1, EY=2, EZ=3, DX=1, DY=0, DZ=0. Попробуйте NUMH=20, PHI=0,1. Чтобы понять, что при этом происходит, вам придется прочитать первые десять глав.
Этот пример иллюстрирует метод изложения, принятый в книге. Если вы хорошо печатаете, или приобрели кассету с программами, то вы получите рисунок относительно сложного объекта за минимальное время. Даже если вы печатаете одним пальцем (как это делают авторы), то тогда у вас не возникнет особых сложностей, чтобы пропустить ту или иную программу перед тем, как начать изучать эту книгу.
Мы надеемся, что этот пример вдохновит вас на то, чтобы опробовать все программы, приведенные в книге, проверить большую часть примеров, а затем приступить к составлению собственных рисунков.
Теперь вы можете приступить к чтению оставшейся части книги. Желаем вам многих приятных часов с вашим компьютером.