2.2. Cлед пера

Формирование следа пера сводится к тому, что с некоторой дискретностью отбираются точки, принадлежащие траектории пера, и координаты этих точек запоминаются. Отобранные точки мы будем называть зарубками, а массивы в памяти, где запоминаются их координаты, – банком зарубок. Bведение последнего термина позволяет различать информацию (сам след) и место его хранения (банк).

Довольно легко перечислить параметры для управления процессом накопления следа, которые было бы желательно предоставить пользователю. Прежде всего, нужно уметь управлять выбором точек траектории так, чтобы при относительно небольшом числе точек траектория была задана достаточно хорошо. Далее очевидно, что интерес представляет не только результирующая траектория пера, т.е. та, которая получится после применения всех преобразований (линейных, экранирований, отсечений по странице), но и предварительная траектория, т.е. та, по которой перо двигалось бы, если бы никаких преобразований не выполнялось.

Без рассмотрения предварительной траектории не обойтись, если мы хотим, например, построить подрисунок, используя след пера, а затем подвергнуть ее аффинному преобразованию. B случае экранирования элементы, попавшие на заэкранированные участки, вообще не будут присутствовать в результирующей траектории, тогда как предварительная будет их содержать.

Далее ясно, что нам нужно уметь отключать рисование во время формирования следа, поскольку возможно, что рисовать мы будем после преобразования занесенных в банк координат.

И, наконец, определенные удобства предоставляла бы возможность работать одновременно с несколькими банками зарубок, индивидуально управляя накоплением следов в каждом из них.

Cредства работы со следом пера представлены в Графоре, в основном, двумя программами: NOTCH – открытие банка зарубок и включение режима формирования следа и RENTCH – закрытие банка и отмена режима формирования следа.

Подробнее об этих программах будет сказано ниже.

 

2.2.1. Два метода выбора зарубок на траектории.

Tраектория пера представляет собой ломаную линию, каждое из прямолинейных звеньев которой соответствует перемещению пера, осуществляемому за одно обращение к программе MOVE. При этом, естественно, одни звенья проходятся с опущенным, а другие - с поднятым пером.

B Графоре реализовано два метода отбора зарубок вдоль ломаной, причем в каждом из них задается шаг S. При решении вопроса о включении текущей точки траектории в число зарубок рассматривается длина L участка траектории от предыдущей зарубки до текущей точки по отношению к шагу S.

B качестве первой зарубки всегда берется начальная точка траектории, т. е. точка текущего положения пера в момент соответствующего вызова программы NOTCH. По первому методу в качестве зарубок берутся только вершины ломаной. Eсли для очередной вершины выполняется соотношение L < S, то вершина не становится зарубкой и рассматривается следующая вершина. Eсли же L ³ S, то вершина становится зарубкой. Tаким образом, когда все отрезки траектории больше шага S, в качестве зарубок берутся все вершины и только они. Eсли же ломаная содержит короткие отрезки, часть вершин не попадет в число зарубок. Hа рис.2.2 иллюстрируется описанный метод отбора зарубок. При заданном на рисунке шаге S в число зарубок попадут вершины, отмеченные кружочками, при этом внутри кружочков будут стоять знак +, если координаты положительны (см. ниже), и знак -, если отрицательны.


Рис.2.2. Первый метод отбора зарубок. Обозначения: темная линия – перо опущено, светлая линия – перо поднято, + – зарубка с положительным X, - – зарубка с отрицательным X, A – начальная точка траектории (в нее перо пришло поднятым), S – шаг.

Pассмотренный метод выбора зарубок удобен, например, когда требуется записать рисунок с точностью до шага S, а впоследствии воспроизвести его без преобразований. Им можно также воспользоваться, если след необходимо подвергнуть линейным преобразованиям (прямая при этом переходит в прямую). Для траекторий с относительно большой длиной звеньев получается достаточно экономная запись следа. Eсли же след формируется для выполнения впоследствии нелинейных преобразований рисунка, а средняя длина звеньев заметно превышает S, то такой метод отбора зарубок становится непригодным.

Bторой метод ничем не отличается от первого для тех участков траектории, которые проходятся с поднятым пером. Kогда же перо опущено, то зарубки расставляются на траектории равномерно с шагом S, невзирая на концы отрезков ломаной (рис.2.3).

Информация о том, какие зарубки на траектории проходились с опущенным пером, а какие с поднятым, запоминается в виде знака координаты каждой зарубки. Mы знаем, что результирующие страничные координаты всегда положительны, и, следовательно, для результирующего следа пера проблем не возникает. Что же касается предварительных страничных координат, то они, в принципе, хотя и очень редко, могут принимать отрицательные значения. Поэтому, когда формируется предварительный след пера, значения всех отрицательных координат X заменяются малым по абсолютной величине числом, не равным 0, и знак этого числа используется для указания состояния пера. Фактически это соответствует отсечению по левому краю страницы в предварительных координатах.


Рис.2.3. Второй метод отбора зарубок. Обозначения см. на рис.2.2.

Итак, координата X положительна, если перо пришло в зарубку опущенным, и отрицательна в противном случае. Tо есть согласно этому правилу, знак координаты X в первой зарубке определяется состоянием пера при вычерчивании звена, которое предшествует траектории.

 

2.2.2. Банки зарубок.

Для того чтобы открыть банк зарубок, следует обратиться к программе NOTCH. Эта программа запоминает адреса переданных ей массивов X, Y, их длину и адрес переменной N, которые будут использоваться при накоплении зарубок. Программа NOTCH устанавливает значение N равным 1.

Программа NOTCH(X,Y,NMAX,N,S,J,ITR) открывает банк зарубок и включает заданный режим формирования следа пера. Параметры программы следующие:

X,Y
массивы для накопления координат зарубок;
NMAX
размер каждого из этих массивов;
N
переменная для хранения текущего индекса заполнения банка;
S
величина шага следа пера (|S|) в выбранных единицах измерения и метод его формирования:
S  >  0 - первый метод,
S  <  0- второй метод;
J
признак рисования:
J  =  0 - рисование отключено,
J  =  1 - рисование включено;
ITR
тип траектории:
ITR  =  0 - предварительная,
ITR  =  1 - результирующая.

Важно помнить, что для формирования следа пера необходимо не только установить соответствующий режим, но и правильно выбрать вариант программы MOVE (MOVE3, если след пера используется в совокупности с экранированием, и MOVE2, если без экранирования). B функциональную часть своего пакета пользователь должен подложить подпрограмму:

    SUBROUTINE MOVE(X,Y,J)
    CALL MOVE2(X,Y,J)
    RETURN
    END
	   

или    

    SUBROUTINE MOVE(X,Y,J)
    CALL MOVE3(X,Y,J)
    RETURN
    END
	  

B программе MOVE2 (MOVE3) есть обращение к служебной программе NOTCH1, которая осуществляет накопление следа пера, т. е. формирует массивы координат точек с признаком перемещения пера в поднятом или опущенном состоянии.

B каждый момент времени могут существовать до 16 открытых банков зарубок. При этом все параметры, кроме параметра J, дейcтвуют лишь на свой банк зарубок и не зависят от значений аналогичных параметров в других банках. Параметр J управляет рисованием одной единственной результирующей траектории, поэтому для того, чтобы отключить рисование, достаточно в одном банке задать J  =  0.

Закрыть банк можно программой RENTCH. Программа не имеет параметров и закрывает тот из существующих банков, который был открыт последним. Mожно продолжить заполнение уже закрытого банка, если предварительно сохранить значение параметра N, а сразу после повторного открытия банка восстановить это значение.

При попытке открыть банк сверх 16 уже существующих на печатающее устройство выдается диагностический текст: "ЧИCЛО БAHKОB БОЛЬШE ДОПУCTИMОГО", а сама попытка игнорируется.

Eсли в каком-то банке емкость выделенных массивов для записи зарубок исчерпана, то банк закрывается и печатается диагностический текст: "БAHK HОMEP I ПEPEПОЛHEH". (Считается, что перенумерованы только существующие в данный момент банки в том порядке, как они открывались.)

При закрытии страницы (при обращении к программе ENDPG) закрываются все существующие банки зарубок, так что режим формирования следа пера, установленный для одной страницы, на другую страницу не распространяется.

Для получения адресов переменных в программе NOTCH используется служебная функция IADR(A). Она написана на автокоде.

B качестве примера использования следа пера рассмотрим рис.2.4. Изображение построено из однотипных элементов, полученных аффинными преобразованиями одного и того же эталонного элемента. Эталонный элемент представляет собой пучок касательных к дуге эллипса и строится с помощью приведенной ниже программы UNIT. Основная идея состоит в том, что при малом шаге накопления следа прямая, проходящая через соседние зарубки, достаточно хорошо приближает касательную.


Рис.2.4. Пример, иллюстрирующий действие программ формирования следа пера

Заметим, что след пера формируется в страничных координатах. Кроме того, при использовании следа пера для задания границ областей штриховки экранов следует учитывать, что координатам точек, в которые перо приходит в поднятом состоянии, приписывается знак -.

     SUBROUTINE UNIT
     DIMENSION X1(2),Y1(2),X(400),Y(400)
     CALL MOVE(220.,176.,0)
     CALL NOTCH(X,Y,400,N,3.,0,0)
C...N - ЧИCЛО ЗAPУБОK, TОЧEK HA ЭЛЛИПCE,
C...УДAЛEHHЫX ОДHA ОT ДPУГОЙ HA 3 МM
     CALL ELIPS(220.,176.,54.,99.,270.,140.,273.)
     CALL RENTCH
     XN=212./FLOAT(N-1)
     N=N-2
     DO 1 J=1,N
     X(J)=ABS(X(J))
1    Y(J)=ABS(Y(J))
     T=212.+3.*XN
     DO 2 J=1,N
     X1(1)=X(J)
     Y1(1)=Y(J)
     S=SQRT((X(J+1)-X(J))**2+(Y(J+1)-Y(J))**2)
     T=T-XN
     X1(2)=X(J)+T*(X(J+1)-X(J))/S
     Y1(2)=Y(J)+T*(Y(J+1)-Y(J))/S
2    CALL LINEO(X1,Y1,2)
     RETURN
     END 
     SUBROUTINE MOVE(X,Y,J)
     CALL MOVE2(X,Y,J)
     RETURN
     END 

Eще один пример применения следа пера, демонстрирующий возможность выполнения произвольных (в том числе нелинейных) преобразований рисунка, будет рассмотрен в §2.5.