Схема потока данных для устройства ввода позиции приведена иа черт. 10.
Преобразование с номером ноль имеет вначале наивысший входной приоритет ввода, поэтому входные данные устройства ввода позиции в МК будут совпадать с НК до тех пор, пока не будет задано преобразование нормирования с более высоким приоритетом ввода. Если какое-либо преобразование нормирования больше не будет использоваться для преобразования входных данных устройства ввода позиции в МК, оно может быть сделано фактически недоступным путем назначения ему более низкого входного приоритета поля вывода, чем у преобразования с номером ноль.
Допускается изменять входной приоритет поля вывода при вводе и у преобразования с номером ноль.
В отчете о событии, помещенным в очередь событий устройством ввода позиций в режиме СОБЫТИЕ, позиция из КУ
Схема потока входных данных для устройства ввода позиции
Черт. 10
«преобразована в соответствующую позицию в МК. Если во время выполнения преобразований станции и нормирования их парамет- рЬЕ изменяются, то может возникнуть конфликтная ситуация. Поэтому при реализации следует рассматривать преобразования как ресурсы, которые могут захватываться и освобождаться конкурирующими процессами.
В течение промежутка времени между занесением отчета о событии в очередь событий и выполнением функции ОЖИДАТЬ СОБЫТИЕ, при котором из очереди удаляются входные данные устройства ввода позиции, прикладная программа может изменить параметры преобразования нормирования и преобразования станции. Чтобы введенная позиция в КУ соответствовала позиции в МК, полученной из очереди событий, прикладная программа не должна изменять параметры преобразований пока устройство ввода позиций находится в режиме СОБЫТИЕ.
Преобразование входных данных устройства ввода последовательности позиций
Замечания, которые касались преобразования данных, вводимых с устройства ввода позиций, применимы и к преобразованию входных данных устройства ввода последовательности позиций, но они усложняются тем, что преобразование осуществляется над множеством точек.
При генерации каждой точки последовательности позиций координаты этой точки преобразуются из КУ в НК с помощью преобразования, обратного преобразованию станции. Входные данные устройства ввода последовательности позиций можно получить лишь для позиций, лежащих внутри той части текущего поля вывода станции, на которую отображается текущее окно станции (по аналогии с получением входных данных устройства ввода позиции). Таким образом, входные данные устройства ВВОДА ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИИ’всегда состоят из точек в НК в диапазоне [0., 1.] X [0., 1.].
Чтобы передать прикладной программе значения координат точек в мировых координатах, координаты точки должны быть преобразованы из НК в КУ преобразованием, обратным одному из преобразований нормирования. Позиции в НК, полученные от устройства ВВОДА ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИЙ, сравниваются с полями вывода преобразований нормирования с целью найти такое преобразование нормирования, поле вывода которого содержит все эти точки и имеет наивысший приоритет.
Точки, полученные от устройства ввода последовательности позиций, затем преобразуются с помощью преобразования, обратного этому преобразованию нормирования, и передаются прикладной программе в МК вместе с номером использованного преобразования нормирования.
Если устройство ВВОДА ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИЙ находится в режиме ОПРОС, то используемое преобразование нормирования может изменяться между последовательными опросами.
При работе в режиме СОБЫТИЕ может возникнуть конфликтная ситуация, аналогичная той, которая возникает при работе с устройством ввода позиции. В течение промежутка времени между занесением отчета о событии в очередь событий и выполнением функции ОЖИДАТЬ СОБЫТИЕ, при котором из очереди удаляются входные данные устройства ВВОДА ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИИ, прикладная программа может изменить параметры преобразования нормирования и преобразования станции. Чтобы введенные оператором позиции в КУ соответствовали позициям в МК, полученным из очереди событий, прикладная программа не должна менять параметры преобразований нормализации, пока устройство ВВОДА ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИИ находится в режиме СОБЫТИЕ.
Сегменты
Понятие о сегментах
В' ЯГС графические примитивы вывода могут быть объединены в сегменты, а также могут создаваться вне сегментов. Каждый сегмент имеет свое уникальное имя, задаваемое из прикладной программы. Допускаются следующие действия над сегментами:
преобразование;
изменение видимости (видимый/невидимый);
выделение (например мерцанием);
упорядочение отображения сегментов, что влияет на изображение перекрывающихся примитивов;
изменение чувствительности к указанию;
удаление;
изменение имени;
вставление сегмента в отрытый сегмент или в поток примитивов вне сегментов.
Этим операциям подвергаются только примитивы, входящие в состав сегментов. Прикладная программа не имеет доступа к примитивам, созданным вне сегментов, после того, как они были сгенерированы.
Каждый примитив в сегменте имеет связанный с ним ИДЕНТИФИКАТОР УКАЗАНИЯ, который образует второй уровень именования. Единственной задачей ИДЕНТИФИКАТОРА УКАЗАНИЯ является идентификация примитивов, его нельзя использовать для других целей. Этот уровень именования введен в ЯГС для уменьшения накладных расходов при работе с сегментами в приложениях, где при вводе необходимо различать большое число отдельных частей изображения, а необходимость в преобразованиях сегментов менее важна.
В то время, как имена сегментов являются уникальньїми, идентификатор указания может быть произвольно приписан как к одиночному примитиву вывода, так и к группе примитивов вывода в сегменте, как показано в следующей последовательности функций:
ЗАДАТЬ ИДЕНТИФИКАТОР УКАЗАНИЯ (4);
СОЗДАТЬ СЕГМЕНТ (1);
Функции вывода; {сегмент-1, ИДЕНТИФИКАТОР УКАЗАНИЯ-4}
ЗАДАТЬ ИДЕНТИФИКАТОР УКАЗАНИЯ (2);
Функции вывода; {сегмент-1, ИДЕНТИФИКАТОР УКАЗАНИЯ-2}
ЗАКРЫТЬ СЕГМЕНТ (1);
Функции вывода; {примитивы не указываемы, ИДЕНТИФИКАТОР УКАЗАНИЯ-2)
ЗАДАТЬ ИДЕНТИФИКАТОР УКАЗАНИЯ (5);
Функции вывода; {примитивы не указываемы, ИДЕНТИФИКАТОР УКАЗАНИЯ-5}
СОЗДАТЬ СЕГМЕНТ (2);
Функции вывода; {сегмент-2, ИДЕНТИФИКАТОР УКАЗАНИЯ-5}
ЗАДАТЬ ИДЕНТИФИКАТОР УКАЗАНИЯ (3);
Функции вывода; {сегмент-2, ИДЕНТИФИКАТОР УКАЗАНИЯ-3}
ЗАКРЫТЬ СЕГМЕНТ (2).
После закрытия сегмента примитивы, входящие в его состав, уже не могут быть изменены; нельзя также добавить в сегмент новые примитивы или удалить существующие. Не предусмотрено никаких функций по расширению сегмента после его закрытия. Вместе с примитивами в памяти сегментов сохраняются прямоугольники отсечения и атрибуты примитивов (геометрические атрибуты, атрибуты, управляющие негеометрическими характеристиками и ИДЕНТИФИКАТОР УКАЗАНИЯ). Однако допускается выполнять геометрические преобразования, изменять атрибуты сегмента, вносить изменения в таблицы связок станции и таблицы цвета, на которые есть ссылки внутри сегмента. Все значения, описывающие состояние сегмента (например имя, атрибуты сегмента и список станций, активных во время создания сегмента), запоминаются в таблице состояния сегмента, которая хранится в ЯГС в течение всего времени существования сегмента.
Каждый сегмент запоминается на всех станциях, активных в момент создания сегмента (СОЗДАТЬ СЕГМЕНТ). Его можно удалить со всех графических станций функцией УНИЧТОЖИТЬ СЕГМЕНТ. Он может быть удален также с конкретной станции функцией УДАЛИТЬ СЕГМЕНТ ИЗ СТАНЦИИ. Можно удалить все сегменты, записанные в память определенной станции, путем обращения к функции ОЧИСТИТЬ СТАНЦИЮ.
Память сегментов на станциях ВЫВОД и ВВОД/ВЫ- ВОД называется памятью сегментов станции (ПСС). ЯГС поддерживает также и другую систему памяти для независимого от станции хранения изображений во время выполнения прикладной задачи, которая называется общей памятью сегментов (ОПС). Сегменты из ППС нельзя пересылать на другие станции, в то время как из ОПС можно.
Сегменты имееют свои уникальные имена в пределах всей памяти сегментов. Реализация ЯГС должна обеспечивать достаточно большое число доступных имен сегментов (например 32000).
Атрибуты сегментов
Атрибуты сегментов воздействуют на все примитивы, входящие в состав сегмента. Имеются следующие атрибуты сегмента:
ПРЕОБРАЗОВАНИЕ СЕГМЕНТА;
ВИДИМОСТЬ — сегмент изображается или не изображается;
ВЫДЕЛЕНИЕ — видимый сегмент выделяется (например мерцанием) или не выделяется;
ПРИОРИТЕТ СЕГМЕНТА — если части сегментов (например ПОЛИГОНАЛЬНАЯ ОБЛАСТЬ, МАТРИЦА ЯЧЕЕК) перекрываются, то предпочтение отдается сегменту с большим приоритетом как в случае изображения этих сегментов, так и при указании на них;
ЧУВСТВИТЕЛЬНОСТЬ К УКАЗАНИЮ — возможность выбора сегмента с помощью устройства указания.
Атрибуты сегмента уникальны для каждого сегмента и не могут изменяться на станциях. Атрибуты сегмента по умолчанию (тождественное преобразование, видимый, нормальный, приоритет ноль, неуказываемый) приписываются сегменту в момент создания. Атрибуты можно изменить у любого существующего сегмента, включая открытый сегмент.
Приоритет сегментов воздействует только на изображаемые сегменты (т. е. на преобразование сегмента и преобразование станции, включая отсечение для каждого примитива сегмента). Если части примитивов перекрываются другими видимыми сегментами с более высоким приоритетом, то эти части могут быть невидимыми. Поддерживает ли станция эту возможность или нет, указывается в таблице описания станции. Предполагается, что реализация этой возможности должна быть аппаратной. При этом не обязательно реализовывать операцию экранирования на нерастровых дисплеях. Когда примитивы в сегменте перекрываются, решение вопроса о визуальном представлении перекрывающихся частей оставляется на усмотрение реализации. Получающийся результат должен быть отражен в документации на реализацию.
При указании на примитивы сегментов, перекрывающие друг друга, выбирается сегмент с более высоким приоритетом. Если же перекрываются примитивы одного сегмента или сегментов с равными приоритетами, то результат указания зависит от реализации.
Преобразования сегмента
Преобразование сегмента производит отображение НК в НК. Оно выполняет перенос, масштабирование и поворот. Преобразование сегмента определяется матрицей преобразования.
Матрица преобразования имеет размерность 2X3, в том числе часть 2X2 для масштабирования и поворота и часть 2Х X 1 для переноса. С помощью вспомогательных функций (СФОРМИРОВАТЬ МАТРИЦУ ПРЕОБРАЗОВАНИИ, ВЫЧИСЛИТЬ РЕЗУЛЬТИРУЮЩУЮ МАТРИЦУ ПРЕОБРАЗОВАНИЙ) прикладная программа может формировать матрицы преобразования. Фиксированный центр, относительно которого выполняется масштабирование и поворот, и вектор переноса могут быть заданы в МК или НК. В первом случае значения фиксированного центра и переноса в МК сначала преобразуются с использованием текущего преобразования нормирования.
Преобразование сегмента выполняется после преобразования нормирования, но перед отсечением.
Преобразование, заданное функцией ЗАДАТЬ ПРЕОБРАЗОВАНИЕ СЕГМЕНТА, в памяти сегментов не выполняется, а только заносится в таблицу состояния сегмента. При каждом перечеркивании сегмента это преобразование сегмента выполняется перед отсечением. Последовательные обращения к функции ЗАДАТЬ ПРЕОБРАЗОВАНИЕ СЕГМЕНТА для одного и того же сегмента не накапливаются; каждая последующая матрица преобразования записывается на место предыдущей. Обратившись к функции ЗАДАТЬ ПРЕОБРАЗОВАНИЕ СЕГМЕНТА с единичной матрицей преобразования, можно получить первоначальный сегмент без потери информации. Преобразование сегмента не действует на входные данные устройства ввода позиции.
Отсечение и память сегментов станции
Отсечение производится после выполнения преобразования нормирования и преобразования сегмента. Каждый примитив отсекается по прямоугольнику отсечения, который связывается с примитивом в момент включения его в сегмент. Если запись «индикатор отсечения» в таблице состояния ЯГС в этот момент имеет значение ОТСЕКАТЬ, то в качестве прямоугольника отсечения, связанного с примитивом, указывается прямоугольник отсечения из таблицы состояния ЯГС; в противном случае он устанавливается равным области НК [0., 1.] X [0., 1.].
Прямоугольники отсечения не преобразуются преобразованием сегмента и поэтому отсечение всегда выполняется по прямоугольнику, стороны которого параллельны осям координат пространства
Для выполнения операций над сегментами требуется такая организация их хранения, при которой сегменты могут повторно использоваться на графических станциях, которые были активны в момент их создания. Примитивы вне сегментов не могут повторно использоваться. ЯГС не определяет способ организации и формат памяти сегментов (если только могут выполняться любые операции над сегментами, и обеспечивается корректное применение операции отсечения к каждому примитиву).
Общая память сегментов
В общей памяти сегментов (ОПС) сегменты могут запоминаться для последующего использования функциями ВЫВЕСТИ СЕГМЕНТ НА СТАНЦИЮ, СВЯЗАТЬ СЕГМЕНТ СО СТАНЦИЕЙ и ВСТАВИТЬ СЕГМЕНТ. Ни одна из перечисленных функций не изменяет содержимого сегментов. В реализации ЯГС допускается использовать только одну ОПС.
Как показано на черт. 9, на видовом конвейере точка входа в блок записи примитивов в ОПС непосредственно следует за точкой, в которой данные распределяются по станциям. То есть ОПС рассматривается как станция (категории ОПС). Примитивы перед их распределением по графическим станциям преобразуются из мировых координат в НК.