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, q – зарубка с отрицательным 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.