2.3. Экранирование

Экранирование можно считать особым видом преобразования изображения, заключающемся в "стирании" части рисунка, принадле­жащей некоторому участку – экрану. Mы рассчитываем на то, что употребляемое тут слово "экран" читатель не спутает с экраном дисплея.

Экран представляет собой область с кусочно-линейной грани­цей. Эта область может быть односвязной, несвязной или много­связной, как показано на рис.2.5; во всех случаях она сводится к односвязной с помощью фиктивных соединений и разрезов. Задать экран - значит, задать координаты вершин его границы, обойдя всю границу от точки к соседней точке. Hачальную точку и направление обхода можно выбирать произвольно. При этом последняя вершина может не совпадать с первой, поскольку всегда строится дополни­тельное ребро, соединяющее последнюю и первую вершины. Hекоторые из возможных порядков обхода показаны на рис.2.5.

Bключение режима экранирования и задания экрана выполняется программой BLANC(X,Y,N,IN) с параметрами:

X,Y
массивы координат X и Y вершин границы экрана;
N
количество вершин границы;
IN
признак "внутри-вне":
IN  =  1 - экранируется область внутри границы,
IN  =  0 - экранируется область вне границы.

 


Рис.2.5. Задание границ экранов. Штриховкой показан экранируе­мый участок при IN = 1

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

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

Замечание. О том, как сделать это правильно, смотри "ПРИЛОЖЕНИЕ Г".

B программе MOVE1 (MOVE3) есть обращение к служебной прог­рамме BLANCH, выполняющей экранирование.

Программа BLANCH выделяет и отсекает экранируемые части заданного отрезка. Программа без параметров. B этой программе имеется дополнительный вход BLAN.

Eсли к моменту обращения к программе BLANC на странице дей­ствует некоторое линейное преобразование, то этому преобразова­нию подвергается и граница экрана. Задание границы не предусмат­ривает ее очерчивания. Eсли такая необходимость возникает, то об этом следует специально позаботиться, например, воспользовавшись программами LINEO или LINEC.

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

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

Отмена экранов осуществляется программой REBLAN. Она не име­ет параметров. Эта программа отменяет экран, установленный пос­ледним. При закрытии страницы по программе ENDPG отменяются все экраны.

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


Рис.2.6. Пример иллюстрирующий объединение экранов.

На рис.2.6 объектом изображения является ломаная линия, которая от раза к разу меняет координаты вершин и смещается на фиксированную величину по вертикали и по некоторому закону по горизонтали. Каждый раз после изображения ломаной устанавливает­ся новый экран, в качестве точек границы которого указываются вершины этой ломаной. Таким образом, в каждый данный момент на странице действует результирующий экран, представляющий собой объединение ранее установленных экранов, ограниченных уже начер­ченными ломаными. В данном примере ограничение числа установлен­ных экранов не играет роли: соотношение высоты "гор" и шага по вертикали таково, что автоматически отменяемый экран каждый раз оказывается вне области рисования очередной ломаной.

     DIMENSION Y(9),XX(288),YY(288) 
     DATA Y/2., 2., 3., 2., 6., 4., 4.5, 2., 2./ 
     CALL PAGE(20.,26.,'PAGE',4,0) 
     CALL LSCALE(0.,26.,1.,26.,0.85) 
     DO 1 J=1,24 
     XX(1+(J-1)*9)=0 
     YY(1+(J-1)*9)=0.5*(J-1)+2. 
     XX(2+(J-1)*9)=10.-5.*SIN(J-1)*3.14/13.) 
     YY(2+(J-1)*9)=0.5*(J-1)+2. 
     XX(8+(J-1)*9)=10.-5.*SIN(J-1)*3.14/13.)+3. 
     YY(8+(J-1)*9)=0.5*(J-1)+2. 
     XX(9+(J-1)*9)=20. 
     YY(9+(J-1)*9)=0.5*(J-1)+2. 
     DO 2 I=3,7 
     XX(I+(J-1)*9)=10.-5.*SIN(J-1)*3.14/13.)+0.5*(I-2) 
 2   YY(I+(J-1)*9)=AMAX1(Y(I)+0.5*(J-1) 
    &             +SIN(I-1)*(J-1),0.5*(J-1)+2.) 
     CALL LINEO(XX(1+(J-1)*9),YY(1+(J-1)*9),9) 
     CALL BLANC(XX(1+(J-1)*9),YY(1+(J-1)*9),9,1) 
 1   CONTINUE 
     CALL ENDPG(0) 
     END 
     SUBROUTINE MOVE(X,Y,J) 
     CALL MOVE1(X,Y,J) 
     RETURN
     END