Text
                    Дж. Фоли, А. вэн Дэм
Основы
интерактивной г
машинной
графики
В 2-х книгах
Перевод с английского
канд. физ.-мат. наук В. А. Галактионова,
канд. физ.-мат. наук Ю. М. Лазутина
и О. Н. Родинко
под редакцией
канд. физ.-мат. наук Ю. М. Баяковского
Каб.-Балк. республик нгкэа научна*
Е V7; '-В «П М ОТF кчА
к ;с..и Н. К. Крупской
г. .'ia..t-чик, ул. Ногиова 42
Москва «Мир» 1985

Fundamentals of Interactive Computer Graphics JAMES D. FOLEY The George Washington University ANDRIES VAN DAM Brown University Addison-Wesley Publishing Company Reading, Massachusetts • Menlo Park, California • London • Amsterdam Don Mills, Ontario • Sydney 1982
Ф7с;(Л УДК 68 ГЗ. 082.5 Фоли Дж., вэн Дэм А. Ф 74 Основы интерактивной машинной графики: В 2-х книгах. Кн. 1. Пер. с англ.— М.: Мир, 1985.— 368 с., ил. Монография написана известными американскими учеными В русском переводе выпускается в двух книгах Книга 1 посвящена классической векторной графике. Рассмотрены устройства ввода и вывода графической информации, методы реализа- ции и применения простого графического пакета, организация 1 рафнческого диалога и математические аспекты машинной графики Для специалистов в области машиностроения архитектуры, строительства, вычислительной техники, а также для студентов старших курсов соответствующих специальностей вузов 240500000С-129 Ф "~04“Г(01)-85 168-85, ч. 1 ББК 32.97 6Ф7.3 Редакция литературы по информатике и электронике Copyright © 1982 by Addison-Wesley Publishing Company, Inc, © Перевод на русский язык, «Мир», 1985
ОГЛАВЛЕНИЕ Предисловие редактора перевода ....................................... 5 Предисловие авторов................................................... 7 Глава 1. Что такое интерактивная графика?......................... 11 1.1. Введение................................................. 11 1.2. Обработка образов как анализ изображений................. 14 1.3. Достоинства интерактивной графики 15 1.4. Типичные примеры использования машинной графики........ 18 1.5. Классификация применений................................. 24 1.6. Интерактивная графика в будущем — обычный вид взаимодейст- вия .......................................................... 26 1.7. Краткая история машинной графики......................... 31 1.8. Программистская модель интерактивной графики............. 39 Упражнения.................................................... 43 Глава 2. Основы интерактивного графического программи- рования ........................................................... 45 2.1. Модели, описание изображения и интерактивность........... 45 2.2. Простой графический пакет ............................... 52 2.3. Вывод графиков . . .................................... 54 2.4. Окна и отсечение......................................... 58 2.5. Сегментация............................................ 61 2.6. Простой график........................................... 63 2.7. Поля вывода............................................ 64 2.8. Цепочки литер............................................ 67 2.9. Возможности ПГП при формировании изображений............. 69 2.10. Интерактивная графическая программа -размещения символов 69 2.11. Генерация изображения по структуре данных................ 70 2.12. Интерактивное программирование........................... 74 2.13. Программа, использующая кнопки для вызова функций .... 79 2.14. Меню для вызова функций.................................. 81 2.15. Задание заголовка........................................ 86 2.16. Добавление символа к структуре данных.................. 90 2.17. Стирание (удаление) символов............................. 99 2.18. Изменение вида путем увеличения части изображения .... 101 2.19. Добавление сплошных областей на растровых дисплеях .... 110 2.20. Альтернативная реализация............................... 111 2.21. Заключение............................................... 112 Упражнения...........................’......................... 113 Глава 3. Технические средства машинной графики .... И6 3.1. Графический вывод..................................... 118 3.2. Дисплеи . . .......................................... 126 3.3. Дисплейный процессор с произвольным сканированием .... 139
Изображение трехмерных объектов 367 3.4. Устройство ввода-для диалога с оператором................... 156 3.5. Дисплейный процессор с растровым сканированием.............. 159 Упражнения....................................................... 165 Глава 4. Реализация простого графического пакета .... 167 4.1. Общее описание простого графического пакета................. 167 4.2. Видовая операциц............................................ 174 4.3. Генерация программы дисплейного процессора.................. 186 4.4. Синхронизация центрального и дисплейного процессоров .... 201 4.5. Обработка прерываний........................................ 204 4.6. Сегментирование дисплейных программ для других устройств . . 206 4.7. Обработка ошибок............................................ 209 4.8. Независимость пакета от графических устройств............... 211 4.9. Заключение.................................................. 214 Упражнения....................................................... 216 Глава 5. Диалоговые устройства и интерактивные методы 219 5.1. Классы логических устройств................................. 219 5.2. Физические диалоговые устройства............................ 220 5.3. Методы моделирования логических устройств................... 235 5.4. Интерактивные методы........................................ 248 Упражнения....................................................... 255 Глава 6. Проектирование графического диалога......................... 256 6.1. Языковая аналогия........................................... 258 6.2. Языковая модель............................................. 260 6.3. Принципы проектирования..................................... 263 6.4. Процесс проектирования...................................... 282 Упражнения....................................................... 288 Глава 7. Геометрические преобразования .............................. 290 7.1. Двумерные преобразования.................................... 290 7.2. Однородные координаты и матричное представление двумерных преобразований............................................... 293 7.3. Композиция двумерных преобразований......................... 296 7.4. Вопросы эффективности....................................... 299 7.5. Матричное представление трехмерных преобразований........... 300 7.6. Композиция трехмерных преобразований . . ................... 304 7.7. Преобразование как изменение систем координат .............. 307 Упражнения....................................................... 311 Глава 8. Изображение трехмерных объектов............................. 313 8.1. Проекции.................................................... 314 8.2. Математическое описание плоских геометрических проекций . . . 321 8.3, Задание произвольных проекций трехмерных объектов........... 326 8.4. Вычисление плоских геометрических проекций.................. 330 8.5. Отсечение относительно канонического видимого объема .... 342 8.6. Преобразования образа....................................... 343 8.7. Вывод трехмерной графической информации в ПГП............... 350 8.8. Заключение.................................................. 363 Упражнения....................................................... 363
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА Около десяти лет назад, говоря о перспективах машинной гра- фики, известный американский ученый Ликлайдер заметил, что потенциальные возможности машинной графики грандиозны, огра- ничения зависят только от нашей фантазии — чем она богаче, тем полнее раскрываются возможности машинной графики. Конкрет- ным подтверждением этих слов служит книга, которую вы сейчас держите в руках. Достаточно хотя бы бегло сравнить ее с другими, казалось бы, совсем недавно вышедшими книгами (У. Ньюмен, Р Спрулл Основы интерактивной машинной графики. М.: Мир, 1976, В. Гилой. Интерактивная машинная графика. М.: Мир, 1981 и др ), чтобы убедиться, как далеко шагнула машинная гра- фика за последние 5—10 лет. Разумеется, в книге по-прежнему рассматриваются вопросы традиционной машинной графики, рассчитанной на применение век- торных, каллиграфических устройств, однако в несколько иной плоскости. Примерно с середины 70-х годов большое внимание уде- ляется стандартизации программного обеспечения машинной гра- фики Широкую известность получили два проекта стандарта — система Core и система GKS (последняя стала международным стандартом и в ряде стран принята в качестве национального стан- дарта) Поэтому материал первой части книги базируется в значи- тельной мере на простом графическом пакете (ПГП), в котором ре- ализованы многие идеи системы Core. Наибольший интерес представляет вторая часть монографии, посвященная современной растровой графике. По-видимому, впер- вые в одной книге удалось из различных журнальных источников собрать материал, столь полно характеризующий эту новую об- ласть Достаточно лишь взглянуть на цветные иллюстрации, чтобы понять, какими мощными и необычными возможностями пополни- лась машинная графика, какие новые сложные задачи встали перед разработчиками графической аппаратуры и программного обеспе- чения. Для фантазии открылись совершенно новые просторы, по- явились такие приложения машинной графики, о которых прежде не было и речи. Обилие и разнообразие материала явились причиной некоторой неровности изложения. Если одни вопросы (прежде всего относя- щиеся к традиционной графике) обсуждаются глубоко и, может
6 Предисловие редактора перевода быть, излишне подробно, то другие — лишь намечены. По той же причине в книге применяется обширный терминологический фонд. Многие термины используются как само собой разумеющиеся, хотя и относятся к неологизмам или носят узкоспециальный характер (например, коллаж, люциит и др.). Все это вызывало серьезные трудности при переводе и редактировании книги. При чтении от- дельных разделов от читателя потребуются определенная настой- чивость и усердие. Несомненно, выход книги Фоли и вэн Дэма на русском языке— заметное событие. Многие сведения, разбросанные по специальным журналам, теперь доступны широкому кругу читателей. Книга может использоваться как справочное пособие специали- стами, изучающими машинную графику и активно работающими в этой области, а также специалистами, занимающимися разработ- кой и применением систем автоматизации проектирования и авто- матизации научных исследований. Она может служить учебным посо- бием для студентов старших курсов соответствующих специаль- ностей. Книгу перевели: канд. физ.-мат. наук В. А. Галактионов (гл. 7, 8, 11, 13,15—17), канд. физ.-мат. наук Ю. М. Лазутин (гл. 3, 4, 5, 6, 10, 12) и О. Н. Родинко (предисловие, гл. 1, 2, 9, 14). Ю. Баяковский
Нашим семьям и нашим студентам ПРЕДИСЛОВИЕ АВТОРОВ До недавнего времени интерактивная машинная графика пред- ставляла собой весьма специфическое занятие, требующее дорого- стоящей дисплейной аппаратуры, значительных машинных ресур- сов и своеобразного программного обеспечения. В последние годы ситуация существенно изменилась благодаря быстрому (иногда сенсационному) сокращению отношения стоимости аппаратуры к ее эксплуатационным характеристикам (примером могут служить персональные ЭВМ для использования дома или на работе, снаб- женные стандартными графическими терминалами), а также бла- годаря разработке аппаратно-независимых программных графи- ческих пакетов высокого уровня, которые позволяют сделать гра- фическое программирование рациональным и ясным. Теперь ма- шинная графика в полной мере может оправдать возлагавшиеся на нее надежды: обеспечить нам общение с помощью изображений и, следовательно, самым существенным образом облегчить взаимо- действие человека и ЭВМ. Изображение как средство коммуника- ции, с одной стороны, более естественно и эффективно для людей и, с другой стороны, обеспечивает достаточную точность при работе на ЭВМ. Большинству людей гораздо больше нравится графиче- ская коммуникация, чем более традиционные способы общения с использованием алфавитно-цифровой информации, обладающие меньшими возможностями. Интерактивная графика может быть ис- пользована для изучения сложных явлений, для проектирования технических изделий и для досуга. Цель данной книги состоит в том, чтобы обеспечить учебным и справочным пособием читателей, которых интересуют различные аспекты современной машинной графики (аппаратные средства, программное обеспечение, структуры данных, математическая обра- ботка графических объектов, интерфейс пользователя и основные алгоритмы реализации). Для работы над книгой не требуется пред- варительного ознакомления с машинной графикой. Однако пред- полагается, что читатель знаком с основами программирования и структурами данных, а также имеет понятие об архитектуре ЭВМ. Книга построена таким образом, что читатель может продвигаться вперед по тщательно разработанной последовательности уровней,
8 Предисловие авторов начав с простых, повсеместно используемых основ и окончив более сложными и более специальными вопросами. Первый уровень: основы. Машинную графику, как, впрочем, и многие другие разделы информатики, изучать лучше всего на практике. Поэтому сразу же после общего введения (гл. 1) рассма- тривается прикладное графическое программирование (гл. 2). Это позволяет как можно раньше подготовить студентов к составлению собственных программ и, таким образом, углубить понимание изу- чаемого материала. Поскольку взаимодействие является основной частью интерактивной графики, важно иметь хорошую структуру программ для организации «дружеского» интерактивного диалога с пользователем; на ряде примеров показано, каким образом можно естественно объединить вычерчивание изображения и обработку вводимой информации. Для программирования использованы язык Паскаль и подмножество пакета графических программ системы Core, предложенного в качестве стандарта группой машинной гра- фики Американской ассоциации по вычислительной технике (АСМ SIGGRAPH) [2031. В гл. 3 и 4 рассмотрены основные принципы ап- паратного и программного обеспечения и показано, каким образом можно легко реализовать простой графический пакет, предложенный в гл. 2. Описаны процедуры кадрирования, отсечения, сегмента- ции и обработка логических интерактивных действий. Гл. 5 посвя- щена специфическим методам работы с устройствами ввода, а гл. 6 — принципам проектирования интерфейса «пользователь — ЭВМ». Второй уровень: математика, структуры данных и архитектура дисплеев. Углубление полученных знаний мы начинаем с изуче- ния математических основ плоских и пространственных геометриче- ских и видовых преобразований (гл. 7 и гл. 8). В гл. 9 подробно рас- смотрены геометрические преобразования и структуры данных, которые используются для моделирования изображаемых объектов (в особенности таких, которые могут быть представлены в иерар- хической форме) В гл. 10 отражено развитие архитектуры дисплей- ных процессоров. Третий уровень: современные растровые методы. В гл. 11 рас- ширяется представление об основных растровых методах, описанных в гл. 2. При этом рассматриваются аппаратно-независимые алго- ритмы, используемые в настоящее время, и дано представление о программном обеспечении растровой машинной графики. В гл. 12 дан обзор современных растровых графических устройств. Четвертый уровень: получение реалистических изображений. Этот уровень отражает самые новые данные и охватывает ту часть машинной графики, которая является более современной и инте- ресной для большинства специалистов. В гл 13 рассмотрены основ- ные методы представления трехмерных поверхностей, а в гл. 14 изложены основные принципы получения реалистических изобра-
Предисловие авторов ? жений трехмерных объектов. Классическая задача удаления по- верхностей сплошных тел, закрытых другими поверхностями, рас- сматривается в гл. 15. Алгоритмы закраски и формирования фак- туры, а также различные модели освещения обсуждаются в гл. 16. Гл 17 посвящена моделям представления и задания цвета. Мы надеемся, что такое разбиение на уровни сделает книгу полезной при различных вариантах ее использования. Во вводный односеместровый курс для студентов младших курсов можно вклю- чить значительную часть материала из трех первых уровней, до- бавив некоторые сведения из четвертого. Со студентами старших курсов можно достаточно быстро пройти первые три уровня и со- средоточить внимание на материале четвертого уровня. Приклад- ные программисты, а также студенты, уже получившие начальные сведения о машинной графике и знакомые с классической векторной графикой, могут воспользоваться начальными уровнями для пов- торения основных понятий и методов, прежде чем изучать более новый материал по растровой графике и по методам получения ре- алистических тоновых и цветных изображений. Мы благодарны многим людям, без помощи которых нам вряд ли бы удалось завершить эту книгу. В течение слишком многих лет мы видели, как все наши усилия написать такую книгу оказы- вались тщетными из-за быстрого прогресса в данной области. Наши коллеги из ACM SIGGRAPH Питер Боно, Дэн Берджерон, Ингрид Карлбом, Джим Мичнер и Илейн Сондереггер помогли нам увидеть перспективы развития многих идей в то время, когда мы совместно разрабатывали проект стандарта Core. В особенности мы благодарны Джиму Мичнеру, который чрезвычайно тщательно про- чел рукопись, что оказало значительное влияние на содержание, стиль и структуру книги. Мы благодарим Дэна Берджерона, Джека Брезенхэма, Дика Балтермана, Ингрид Карлбом, Джона Дила, Ci ива Фейнера, Алэна Фридена, Боба Хайлмэна, Дженет Инсерпи, Абида Камрана, Джефа Лейна, Ли Метрика, Норма Мейровица, Арагама Нагеша, Джо Пейто, Джин Швейцер, Джона Сиберта, Элви Рэя Смита, Джагана Сада, Джима Темплмэна, Берри Трен- та, Виктора Уоллеса, Джерри Уайла, Тернера Уитеда и Патрисию Уэннер за просмотр одной или нескольких глав. Барри Трент реа- лизовал ПГП и вместе с Джерри Уайлом проверил программы на Паскале; Адам Сайдмен реализовал программу LAYOUT (гл. 2) с целью ее проверки. Катрина Эвери, как обычно, прекрасно отре- дактировала рукопись, она же печатала и считывала ее вместе с Мери Эгрен, Кэрен Доул, Сенди Баллантайн, Мерилин Хенри и Вирджинией Эдвардс. Начальные варианты книги печатали Джек- лин Боумен, Бетти Киршбаум, Хильда Уогстафф и Патрисиа Сиснерос. Выражаем благодарность работникам издательства «Эдди- сон-Уэсли», в особенности Дику Мортону и Риме Золиной за их терпение и квалифицированную помощь. Мы признательны также многочисленным отдельным лицам и организациям, которые пред-
10 Предисловие авторов ставили нам фотографии и иллюстрации. В частности, Ли Метрик, Дейв Шуи и Рик Торн подготовили иллюстрации специально для этой книги. Как принято в таких случаях, студенты нашего курса машинной графики терпеливо знакомились с начальными вариан- тами отдельных глав, и мы благодарны им за комментарии и усер- дие. Наконец, мы признательны нашим бывшим студентам и кол- легам за то, что они постоянно заставляли нас работать. Особая благодарность — нашим семьям за их доверие, любовь и терпение. Август 1981 г. Дж. Фоли А. вэн Дэм
Глава I Что такое интерактивная графика? 1.1. ВВЕДЕНИЕ Рассмотрение предмета машинной графики мы начнем с приме- ров, которые знакомы большинству наших читателей. Скоростные печатающие устройства ударного действия, исполь- зуемые для получения портретов людей или персонажей из мульт- фильмов (рис. 1.1), часто с наложением литер при повторной печати в той же строке. Планшетные или барабанные графопостроители для получения рисунков, состоящих из линий: двумерных и трехмерных графиков (рис. 1.2), круговых диаграмм, гистограмм, блок-схем, архитек- турных чертежей и электрических схем. Кинокамеры и видеомагнитофоны для создания высококачест- венных цветных изображений существующих или воображаемых объектов в виде слайдов, кинофильмов или телевизионных фильмов, например статистических диаграмм (вклейка 1), заставок в теле- визионных передачах (вклейка 2), сцен из научно-фантастических фильмов (вклейка 13). Дисплейные терминалы на запоминающих ЭЛТ с клавиатурой и курсором, управляемым с помощью вращающихся ручек. Они ис- пользуются как алфавитно-цифровые терминалы в системах с разде- лением времени, а также как интерактивные устройства для работы с текстом и линейными рисунками (рис. 1.3). При необходимости вывода нового изображения экран очищается вспышкой и генериру- ется новая картинка — часто посимвольно или по одной линии. Генерация очень насыщенной картинки, содержащей тысячи отрез- ков и литер, на терминалах, подключенных к телефонным линиям с малой скоростью передачи, может занять несколько минут, одна- ко эта картинка будет такой же точной, как чертеж, изготовленный чертежником. Игровые (домашние) ЭВМ. с черно-белым или цветным телевизо- ром, позволяющие работать с текстами и графическими изобра- жениями (вклейка 3). Картинка обычно имеет низкое разрешение: легко различимы отдельные точки, из которых формируются литеры, линии и сплошные участки. Однако, несмотря на «зернистость» картинки, ее смысловое содержание легко воспринимается. Визуальные^игровые процессоры, в которых используются микро- процессоры. Простейшие из них представляют собой «черный ящик» (подключаемый к домашнему телевизору), который может генериро-
12 Глава 1 • вя- ’ m!»v •*’v н,. 5Н».. МРИВвЛ’ DJtlHHBltHI i r »« »_ • 4’ {• [ | • и» in ne «я» i и ,4 9jniii]iHninittrutHiriii>r»ieitniif ппизшегтЕЕПешнмг I *'tn9MiiitMif>in>rfKiitstitBr<initittefit.tessii»iiBiiiikiisfitfiii"ii: t" irritate и itHiiaiiniiiiff et! tifiii!iM,>< : ftBBiiiMiliBMitiiBiJiBBtaruBBiiliiBGefaMeFtiittaflBaiiBiliBMrtttrEBiiBatiBiRfti 1 tx ei a i }i в 11 в в BtEKrtaeintctBBrBBtueiaBEZBtt c ft if i r tin istr i e i ш t it t в в ш о a i и в i it ? .)/18inlOlfnf£0IPI3ttri8eS«t>8ftPPBBItIRt !Н1Ч&ШШ1ШШ! I 1B10I BPOOtlRpOOIllllINlM AifiBtiiijtitifixinnitBBpprerABtssrittrnoiti’tRniiiiiifzsiiinsifRxRBBinRooiiiHii. lj0BSiij|»atitiifitirBxieiifiiettiitBii8iBii>iiBia lonnrrttJnrfJtaJfxxOpaBixnBBnirxi t 2BitiitaiitiiFirBFiiraEnnintnMieei)itxiittiii.4Ociavij₽st)ii2iziriiBiiBiHi9iiiMxc 138001В181П111В1ВРВР1ПХ8П01ВГВВП01ВВ>ВВПП>Р11Л1ЯР0111П110МРв»рВВ9ППВПВеП1111'ГГ • • »9iiiioat irr it a tint t >ш t'ictzoiitenTBFittiititMBfBiwntiHi etui uni ft ibr bubo и инь k.tPDiBRRBitttitititmttnir vn i vyfiilrntt in Jtdcgirmncrjixnf rm t mr ifiaaiiefimtioaM l irtooDOBiitrtiieiBafOitznn ' in’ y iih«l>{itiMj/iiiiiiEEEivii;ia3BtiiiBiiisiii9iJi>iiiFBnj:RiiiRa<' ?''o'aiaRBioirttsiamnji<Hi‘'i 1И1 i• i 11 i 1 y у • > i»i a i i>- 4- ’ ^iBiniiifnBBRifRiBi'ooMBOiiRMZ >->ioiBBRBiH4etaiB8tBxB2i«i» iffy in ‘i'i т > y iv y 1111 iu« * ♦ a * * »l • t t i t injo iniait ni titiRHin>tii*ii viuiHBM iittnnrunm» "i-i in*y *iy> Ytt'.m i , a i ♦ , 1111 z taj j 11ja dx 11x f 11 >m у lP01tO31RBl1IIIBt8tJxn JtlbSi '(*' t ! Y Y ► I ♦ f I« Y < I ♦ * I *' ] ♦ f ¥ * * - - * > L I »l> I-A/A1»11/H>0RM1lHOtlBNX Xia 00111111 tit 1 Bl M И М1ДИ X1 ** s r“l I I'i HI Y1A1I YYllU » , - A . A » A ">». l •! 00 LM' 10 BOMB ;v yl IYJ У »Л «11 1 Y Y YJ » » . 1 , - A I I * 1 • J V [ b IY Y !♦ Y 1 A 1Y Y NO Я Я 010 0 ' Оввп ьеoiHOMiiBiitis/vT 1мтам га упупн i<»i«ii.»ia a « , l а а а а»пшншпн1 hi aomboibpoobom > l<.№tiHimiiiaii<i,iT7jmxjiMF rm? тш iyy«♦ I«♦ 11 • т e ,f - f i i >*ai nian yhh ааучаи ьммореэомяхмхеу f. Cl аЭЗМП I! S JI П Zip J и Я1Х2Х J 01 kk« ЯМ X ItPXXRAS'.Zi I ♦ Y У»Y V» I«‘ t » t A I ’ 11 Y Y FA V f H И I !* Hd H F Y еООМ'РОМВвВЯМХ *f 39 111111 Bit tltll Ш я Я ЯМ IX IPX'S 1ПЯШП 11 Of» T )П YY YI Г« 2 4 A • I Al НШГ1 rCFruyilYY 111 r ZPmPXJXfXfd- P Of 1113 IB ll IB J It 1 к ? »s Я kdk 2? 115S/P » Y f M YYPltlSfd “i. I IY В t; I » [ . *YY“ ? J i S’'Y I v 4 fl. SY H Г FPY I HY Y f* »? JO 30100021 ЮОППОЭЗ'1'1Г1 t1*Y -keJxrlIJRa- I» Y Y 4 ♦ Y Y P 7 0101 111 11 Y Y» • ‘ IM’ A f' - 6 J ? В » Г'H 7 \ с ; r ‘ Y УI И Y F 1 Y XfPВOtfMX В 00$ >111 В1M11111S 5 J Я ° к r1'» a J J IJ ' d f»030P HYIII’YHI 1 ItBPMifKMf «И/И4ММААС7 I I CYl HYrll ‘•49M60OR0MPO9f Q Ю0В0И1 Hat iinm reaRizt jhu сиааам ббямШг i H‘»i»iyy:jmjimp*a a • ♦♦♦ in«f ’«ci ffi huh trrttiettagiu 1>Ч1 K'ZOOMItlllin.bFfb 1 PfMXBPlBOJ3BOrlO0XX11J1f?"v( I’Yl I Y 1 i Я <JFM« I ♦ A A«A HAIY1 b>El(, H i I H F l ШРИ 8 0 Ol flBOO? t ? t(F«m MB о в Bl ИВ Bl iom t - IlVr rxontlf )11TI14>2c'227W*4c> lYfYY Fins'A J t A • | I • | V »[ Y I b > H I ri Y Y A Y Y C M2BP00 В I IB B« ( Л ЛШ JIXJ».; AYryYbnXfB3e”1»»l*f-»EnAiaaif',YY1 1‘1-b bJOmea'PFSNY AFFf^YH И H 1 IY«FYini(JOaM01OON 1x1 IBttllBfl? с I YF'-rrc ?4I| YI'EMMaXF ZZir IAFJFF MtMMZM If XCkBbbt к FPY! Y I Y Г У Y FYY FY Wlf rerlBBft пав uiBi«iiin»e?<' >, r*. i a« y ви»м«»‘н i yyy ьег - YzjmnBWjiJWi j a 11 itt pyyy > ♦♦ авоопоаиоа h»»MJ*MC77FaBJJdfBB111FB»F FT ZMTF FYti-1 F I 1 A X 1«)! Y • ] • ♦ (•« U F Ft! [[♦! I ♦ 11 b f 1 I , L I . 11 1 h F 7 F | Y • • Г 1 f M1 В f » О О Я U<faeJ/e*AtexMBIlMlllfflM«X»?-**?r •'•’rH- I y H>>n- ICY * Z"‘'/J|y*lJ»*1»««»jy ПИАН! МХ8Я'Я?0ИГ • 12МШАВМ0 > IMXM1 IBB I DOlf )V F »“fF f Г Y « г < • ’-« * IV ? H « t fllYlY b-IF F Я »t P f ’ I Y Y 11 Y I Y 1 I 1 Y Y • ♦ Y1 У A b Y ZflMinpffZYT , • IMBindBOBOJMMtrllfMMOxaff? > YY YJYY t YYll ‘ .WtHMffi 1' Y 1 I “Fb Y-’IYt.F 1Г II 11 Y Y II У I A! tlflllf IF “M 8 gg В О DI J MN 4Z Ь7Я* iu»yj N1M0O JBM JF TtJPMOOMXFF » Y‘»A I f YYYY’Y* A Y f И M J * PI I IY11T 7 t (, I ll Y J 0 Y I I Y Y I Y У I У у У Y Y H ’ F F F 1 F A 1 Г МО ОМ R (JIB Я M FHF NHQN -ЗР0П*7Р₽А<1Е11?81М00МХЗ»ЬР Yl I AYY»IY»1IF7 effJRFI , , .♦li'EBtlf t Г I f rfffl i F • ГК tlf Г I Г Г I I <, • t. 7 l Г ANORIftf bY7?(YAP<.AA »M8jFMX0O[INA7bNa0BVkMtN7 -1FYFY»..* YUY ♦» »МЛ1УГ| * , I I Y h (t -1H I »YYIYYHlYA I A 11 1 F <1F R . Я , tM « 10 > Г 7 (.« N»FPSU8I • 20ОМ»М2ЭОВ'»»<Н1О0»МХА*1». ‘ MH Y Г M FFJM7 12J. JF YIlYYIl I ТРГ Fl P J I IIA11YFYI YLA - 1, A Y A F Г Д - . NN0OM 7 h Я LMFflPQAfcflJ Л7MBdJl»laJN»M^BJMJ«^, IFF! ’ИЧ? A I ♦ *Ff F IJF 1R Jf ЭА7 r'lbbs ' M " PF II AF | 1 4Y Yy bFI F n Y A » I I ' Vf A F h » t F R<3e§? A A Of* ZZbFMNj •КЛВОааУМШмеМШЛЯ*. h ZANA Z MHCIY» •«M»tPPlPlM»H M vl РПВЕАААА* * Y Г V AA а м F IHI IY1 Y f wQZNWFcNP »• amt«e8F7IM pit ldfiF?a0MPPl*0dA»?rid-’XXXa*J1T Y Y РРЯХР 1111 1J2NF I I »M M r R P АЙ К J I ♦ I Y'l И is? F с п b F P Г ; Г C A? »« Fl Я A Y t МЯ Y h 1M MS I t 111 M ЯМРЛ«30М1О0МР0МеП1НВ IMMPXMMO •’С 4 ArYtinrw’N4RR1 *¥] ♦» IlYYYIY’YYltFYFaWAZZCCAAt AAtNNBMN^PY H7MhR?<JJ)Mir$Zl2» JXJZMl IWMM0nfmjJl2W»AA7r-F HFIfiAX II УЦУА» • J У A • * У > Y H У У У J У Y У H 1 F2 ЯП M W d A A0 II A A H>« » A M A F A 11 Y Qd В 0N Y A J12 ♦ 1R»JdЯРОВЫМ МММJ2JJM1M11P0MЙ1»Ah 'FI’I if YA1FI1YL AYYYIY I Y] >ТГ» ♦ YM2MXB2BldJAMP^NM*МЯР•я к psA7RM 0 ЯWVll« -/11 22MF J If MX 1» R RXXMJ n XMOf d АЧ Г t'. < 1YY1Y A . i T •* » lift 1 f«lY< Ai2 J 1JPR» INN * Nf7 2 fifrf k02K RMMMlXlll??jrR»AfaRxlH2 'AY YllM A RIYYiY»’* 1I1HYTY ТУ M Г bbll BP I JIN A*?NNf Я P WPP 3 0 *dd«d»2M» ♦ MPXXMFNAMdl Y»YI»¥MMBrl * I I I«I A All < « L l Г Ш Y f If Я AI A A F l Г f 1Л И ff M E N < N A A P 2 Cd gj 1J2 0Я ! «МР2И0Я»'Я"1 I Yl 'Р7ИММ»» ‘'At.’ ’ACH If **1» I A 1 • ‘ 1 Y I ' A A « к 1N Я t у A t J В N 7 Ad d А ЯРР1Я JBJMRR* --ХРРМО?1"И Y Yl У' C IM RJXJ 12/11} P<1! ![ *Dt ГС,'ПГГ* ’7 1 Г IZAppMl* 1Y .> IflAAAlJ’YAimf IM 1- ,72/Xd ►' A f ♦ fif ZOBJZt SAN I t 1 J/flfBWZPZ Jdklpjgl Я AY, Y ♦ Y Y Y P (, (•? e Я • I« к 7 Я ? И J Я X / ’Я7М111 A n < -t 7f7JMHYPbNS ^YtBtlarCdA I 0 N К Я f I 11 Y I I Y Y Y Y Y AlNNddlf у . A • ’ I «/221 trldSAPl A| PYASA-lMMIk МП» I IfBOeil l’« AbANHYl »Y 1 ч YYFI ""I Nfl»0Jll 1XdlllNd??Cr rppPA4M700ObkA Jff A AY SJ’RYYF»'» I Г Г P2 Nb M P Ail 1 Я- 1ZP2XJMM7 FrMPsTOJJfff I FSAAJk.PlMl I Yl A 1 Yl A Ab? *A8P Adtl I -|0ИРМАЧ--Ш(.?binFippaavi ярмлрррн irii.'inwatHH*M ИМОЗМРЯа Y"?**pbPY я 11M1MNJ izlzflf i • I Y I J Y k£ I’ЯМ Я712 1» NX IlNlBMMMRk “rfPlY I Y И ИЧ11Р • Ш I »il lir ~ FPtA“dk11fk f?lMW0«1/Xf0arfA к " f r»i‘L L A A rYlYffMP^ZPMPdMdJ/d- 4’'I PBMMBdd 1 7M 0m5 •'F, - A Y YI!YYY“A t A‘IH|, vSSNNdklMf- ’ .PPl2XfMdl01dXdM/Xkf *"ri t I • I I YI I ‘ Y1 Ьг27F VdNlMN- 1 2fOllBPJ10M0J>BJlO0PX IsZ »»11*»| fI YlM?*N»FO?P?P • Г f 9 S 11 X 2 X • X В Xf О X Я 1J я 1F P В P F 1 S t s" S t A ' f " l S2 ?’? ь 1 И P <. ? *"* t , 'MOlltlJ PJMMPff ЯРИМ IXFfBtP I Br IRbBMp» lb )7d? f f H "ц '* l‘C b , НямПВОШ AlkXZXXPBiPPf PfXOBX tlXFMMMXXBf 371NYI Yl 111 b, *'s" I У”; РЭ08Ш11 J XMPJipnMMlfPPil’JflIIRlIOBOllOnPt.ill r linH ЯИЬЕC.Y, airFPnORlIllRIHb p/7/2 80l8IZP80»'O0BalJ1PFNY:i!IYFbYi I F -1 II I A11C7 ’lapf 0111 Bl I 81 lx"’ , f 1 d Я В Ями 00 510 00 POxZ I" I hY Y 1 И I 1 1 ' ’ b . PF ( EC B0 OOP Bit I IB ИГ1 »F1 » , yifORP/tPXfPBPPMa*’‘*lYllYl,'Yl4l<>’rr,i чьшошн«шиrttrJi • f2tait»)i*)u3aerif*i t»ih i vx Лк. AMBRiiiiiiRiinitieta tr ' » -ироормяПрер a»«/»n ii f г ,К»ч»н ,? !:t803BB1lORIIRRttnttntn> Yl A • >28SVPPf OfXkkNhvFFf1 H A rPfFl't !?'.re0O)3iumninititrm?nv • i r a /012012x00x07*1 rn i ri'ri-i «м •1 ? c Fee fl oooo 1111 в в be 11111 я г в t bi t e 11 o r i .>1 - i ммаях? 1/3 a a? vk ,11»p i • — p • к г f 101091531011L fl 11ВЭВ Birr ll ИПП1.1 A 1.1 Y - f f Al t A N« N Я 7 • ( A 4'7 A 4’ I b - All Of f 11 111 III 8 11 ГВ11 tni ГШ! 18 Г В IB rtr IX I 1 A A , -1» В MOINA t4 • H1 ] 'bb >W0O3l>ifntiffjPBfaifftPtrBBttairttiRA* a u« a • ’Yar ?Kt.u"iHi ?, 101R ОI ID 8110 > 11 Hitt It IB I El ЕВ 1? В111811 Bl 1 Id Y L « *; NHV. f,lh"s» BDIlIl B1BBR ItetrieneBBPtlllBtlSIBttntllH 1 -•?•! A , -НТ и IY',7* ЮноRittBim11iriPriiiiitirmMiittrtit8*4 , * a a -''y iy i *• 1И|111ИШП(НПИ1(П(П1Н1!ИП1П(Hi *, » - « , • A.i' Ml • iiittiBBtitui*BBBiPePBetii8iiBtrRit8iiiii>i) y « 1 - ,’sy *81111В111111EBE88B111 BEIT I PPIPB111111ВI tttVt i « * ** I? HiiiiittiiiiiittieiBttimntiitiBPtitPiiiR’iix»' . 'Y Ctr 111 Elf IB I IBB I rite II fl 1РВЯ l BBfPR 9 Itt IB 111 II I If ♦ • * , t I • tiiiRi trit etn nep8(inBitBiiriiintt8ntHiHiiN ц > *....... 111 ri зг ч 1 ’ r » 0МП idf ri ЦЯИГ 1 inti’, I0ВО1РГ rtRBI'RSo iXBfR'IfAI l 7 33ll»n'AY Ik 11В 8RВ В ВAn11 «J 0 В 3111 f В В IM a A A A Y 1МВ09101П1ШМА Ih .i/iimisiitfiiins a 1РПВЯ11В111111ГШ'"Ь1Ч J/1009ntllRntf IBItlll A ininiiRi'tiniitsittrt'M'- | 3 tfl В J ll lit 11 tr II НП111 r 11 ’ "• rnBBIRillSnniPtltfllBBnrrPA kA A innsnfrrimefirrxeepmeiiix n. nisniititteiriiBininiiiiintiiih Рис. 1.1. Изображение, полученное иа печатающем устройстве, с имитацией тонов за счет наложения литер. (С разрешения С. Р. Хэрбисона и журнала Mad.)
Рис. 1.2. Трехмерная «разлинованная поверхность». (С разрешения фирмы Са1- сотр.) Рис. 1.3. Дисплейный терминал «Тектроникс 4015-1» с клавиатурой и ручками для управления курсором (внизу справа). (С разрешения фирмы Tektronix.)
14 глава i вать незатейливые тексты и рисунки, а его рычаги или ручки ис- пользуются как интерактивные устройства. Более сложные игры- аттракционы (например, «Астероиды», «Космические пришельцы», «Пэк-мен» и «Управление ракетой») позволяют проверить умение пилотировать и попадать в цель с помощью остроумной мульти- пликации, а также эффектов, обеспечиваемых за счет изменения цвета и формы (вклейка 4). Между этими формами машинной графики существуют большие различия с точки зрения типа и качества изображения, а также в какой степени пользователь 11 может динамически управлять изоб- ражением. Однако все эти формы имеют одно общее свойство: изображение объекта (или объектов) формируется и обрабатыва- ется с помощью цифрового процессора. Таким образом, можно говорить о том, что машинная графика — это создание, хранение и обработка моделей объектов и их изображений с помощью ЭВМ. Интерактивная машинная графика представляет собой ее важный раздел, когда пользователь имеет возможность динамически управ- лять содержанием изображения, его формой, размерами и цветом на поверхности дисплея с помощью интерактивных устройств взаимо- действия, например клавиатуры, рычага и т. д. В рассматриваемых выше примерах первые три относятся к так называемой «пассивной» машинной графике, а последние три — к интерактивной машинной графике (которую для краткости называют интерактивной графи- кой). При изучении интерактивной графики мы, естественно, не можем оставить в стороне и пассивную машинную графику. 1.2. ОБРАБОТКА ОБРАЗОВ КАК АНАЛИЗ ИЗОБРАЖЕНИЙ Если машинная графика занимается синтезом изображений ре- ально существующих или воображаемых объектов, то связанная с ней область обработки образов (или обработки изображений) имеет дело с обратным процессом: анализом сцен, т. е. восстановлением двумерных или трехмерных объектов по их изображениям. Ана- лиз изображений имеет важное значение при обработке аэрофото- снимков, фотографий поверхности Луны или Марса (передаваемых на Землю космическими аппаратами в виде медленно сканируемых телевизионных кадров), телевизионных изображений, поступаю- щих от «глаза» промышленного робота, электронных микрофото- графий хромосом и фотографий медицинских мазков, рентгенов- ских снимков и томограмм, а также отпечатков пальцев. Подоб- ласти обработки образов в зависимости от главной цели называются улучшением изображений, обнаружением и распознаванием обра- 1( Термин «пользователь» в данной книге является синонимом терминов «зритель» или «оператор (терминал^)».
Что такое интерактивная граф koi зов, анализом сцен и машинным видением. Целью же может быть улуч- шение изображения путем подавления «шумов», например «снега» на телевизионном экране, изменение контрастов, обнаружение й выделение стандартных образов, выявление отклонений от стан- дартных образов (т. е. искажений) или даже распознавание (ре- конструкция) трехмерных моделей объектов в сцене по нескольким двумерным изображениям. Пример такой реконструкции приведен на вклейке 5: трехмерная модель верхней части грудной клетки, полученная с помощью электронного томографа, которую можно в последующем рассматривать по произвольным сечениям. Другим примером является представление «увиденных» промышленным робо- том относительных размеров, формы, положения и окраски деталей на ленте конвейера. Несмотря на то что и машинная графика, и обработка изображе- ний включают машинную обработку графических образов, до недав- него времени они представляли собой совершенно независимые дис- циплины. Однако благодаря'растровым (телевизионным) дисплеям с высокой разрешающей способностью области пересечения этих дисциплин становятся все шире. Это особенно ощутимо при интер- активной обработке изображений, когда человек своими действия- ми помогает избирать те или иные виды обработки, а преобразован- ное тоновое изображение немедленно появляется на экране. 1.3. ДОСТОИНСТВА ИНТЕРАКТИВНОЙ ГРАФИКИ В данной книге основное внимание уделяется синтезу изобра- жений с использованием интерактивной графики, поскольку по- следняя является одним из наиболее естественных средств обще- ния с ЭВМ. Хорошо развитый двумерный и трехмерный механизм распознавания образов (глаз — мозг) позволяет очень быстро и эффективно воспринимать и обрабатывать различные виды данных, если они представлены как зрительные образы. В действительности во многих процессах проектирования, внедрения и изготовления графические изображения совершенно необходимы как средство ви- зуализации и взаимного общения. Однако создание и репродуцирование выразительного изобра- жения связано с проблемами, которые всегда стояли на пути ши- рокого использования изображений. Поэтому старинная китайская пословица «одна картина стоит тысячи слов» стала столь популяр- ной в нашей среде только благодаря созданию технических средств (сначала печатной машины, а затем и фотографии) для дешевого и бы- ' строго репродуцирования изображений. Именно после этого ока- залось возможным легко и быстро схватить суть идеи или ситуа- ции с помощью иллюстрации или фотографии, так как исчезла не- обходимость усердно рисовать, высекать или писать красками каж- дый отдельный экземпляр конкретной сцены.
16 Глава 1 Интерактивная машинная графика является самым важным тех- ническим средством для изготовления и воспроизведения изобра- жений со времени появления фотографии и телевидения; ее допол нительное преимущество состоит в том, что с помощью ЭВМ можно получать изображения абстрактных, синтезированных объектов Интерактивная графика — одна из форм взаимодействия человека с ЭВМ, в которой соединены лучшие черты интерактивности тек- стовой (алфавитно-цифровой) связи (с помощью клавиатуры под- ключенного к ЭВМ терминала) и графической взаимосвязи (с по- мощью двумерного рисунка). При использовании машинной гра- фики человек в значительной степени освобождается от скучной и трудоемкой работы, связанной с выявлением общих тенденций путем просмотра многих текстовых страниц и цифрового мате- риала (на листингах или на экране терминала). Хотя статические изображения во многих случаях являются хорошим средством для сообщения информации, большие преиму- щества обеспечивают динамически изменяющиеся изображения. В особенности это верно в тех случаях, когда требуется предста- вить в графическом виде изменяющиеся во времени явления — как реальные (например, изгиб крыла самолета при полете со сверх- звуковой скоростью или изменение лица человека на протяжении его жизни), так и абстрактные (например, тенденции развития, такие, как использование ядерной энергии в США или миграция населения из городов в предместья и обратно в города в зависимости от времени). Разумеется, при показе изменений фильм часто ока- зывается более выразительным, чем последовательность отдельных «слайдов». Динамическая последовательность кадров на дисплее часто может передать плавное движение или изменение формы луч- ше, чем последовательность медленно сменяющихся отдельных кад- ров, особенно в тех случаях, когда пользователь может управлять мультипликацией, изменяя скорость выдачи кадров, границы ча- сти сцены, попадающей на экран, и степень ее детализации, а также другие параметры. В связи с этим в машинной графике значительное место занимают аппаратные и программные методы реализации динамики движения и динамики изменения под контролем пользо- вателя. Динамика движения позволяет увидеть перемещение или вра- щение объектов по отношению к неподвижному наблюдателю. Мож- но также смотреть на неподвижные объекты глазами движущегося пользователя, производить панорамирование для выбора части объекта, приближаться к объекту или удаляться от него, увели- чивая или уменьшая тем самым степень детализации, как если бы пользователь видел мир через видоискатель быстро движущей- ся кинокамеры. Летные тренажеры (вклейки 30, 31) используются для тренировки летчиков и штурманов, которые могут маневриро- вать моделируемой машиной относительно моделируемого трех- мерноЛ^пандшафта (где могут присутствовать и другие машины),
$ I Рис. 1.4. Моделирование микропроцессорной системы с динамическим изменением изображения под контролем пользователя [208]. а — общий вид системы в целом; б — увеличенное изображение микросхем центрального процессора, устройства управления и устройства обработки приоритетных прерываний. Обес- печена достаточная детализация для показа внутренних регистров и вылеленияЛс помощью яркости) активных управлякуцик HWHiffr<i№npiiMepr йпинп GVMO^""1 " *1^Ч|
18 - Глава 1 отображаемого на одном или нескольких окнах кабины, фактически представляющих собой большие телевизионные экраны. Динамика движения позволяет пользователю «полетать» вокруг зданий, мо- лекул, двух-, трех- и четырехмерных математических функций или «облаков» (диаграмм рассеивания) точек в двумерном или трех- мерном пространстве. В другом варианте динамика движения пе- редает перемещение объектов рассматриваемой сцены относительно неподвижной камеры. Например, сложная механическая система (такая, как зубчатая передача) может быть оживлена на экране пу- тем вращения всех входящих в нее шестерен. Динамика изменения передает фактическую эволюцию формы, цвета или других свойств видимого объекта. Так, например, на экране можно увидеть деформацию металлической рамы от нагруз- ки, приложенной пользователем (вклейка 6), или же изображение изменения состояния блок-схемы ЭВМ под действием потока данных и управляющих сигналов (рис. 1.4). Чем плавнее происходят изме- нения, тем реалистичнее и убедительнее будет результат. Динами- ческая интерактивная графика предоставляет пользователю раз- нообразные возможности, с помощью которых можно кодировать и сообщать информацию: двумерные и трехмерные формы объекта в изображении, их тон (уровень интенсивности от черного до белого) или цвет, а также изменение этих свойств во времени. Если к этим возможностям добавить еще закодированный в цифровом виде звук, то объекты и обратную связь от программы или операционной сис- темы можно не только увидеть, но и услышать. В заключение отметим, что интерактивная машинная графика позволяет существенно расширить «полосу пропускания» при общении человека с ЭВМ за счет использования разумного сочета- ния текста, статических и динамических изображений, по срав- нению со случаями, когда работать можно только с текстом. Рас- ширение «полосы пропускания» существенно влияет на наши воз- можности понимания данных, выявления тенденций и визуализации существующих или воображаемых объектов. Повышая эффек- тивность общения, графика обеспечивает рост производительности труда, повышение качества и точности результатов или продукции и снижение затрат на расчет и проектирование. 1.4. ТИПИЧНЫЕ ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ МАШИННОЙ ГРАФИКИ Машинная графика в настоящее время используется в различ- ных отраслях промышленности, в экономике, в правительственных организациях, в учебных заведениях, а также дома. Перечень ее при- менений необычайно обширен и продолжает быстро расти по мере того, как становятся легкодоступными простые дисплейные устрой-
ства. Ниже приводится перечень типичных областей использова- ния; к некоторым из них мы вернемся ниже в данной книге. Черчение графиков. В настоящее время графика, по-видимому, используется чаще всего для вывода двумерных и трехмерных гра- фиков математических, физических или экономических зависимо- стей, гистограмм, линейных и круговых диаграмм, графиков пла- нируемого выполнения работ, графиков запасов и фактического вы- полнения и еще многих других видов рисунков. Все они использу- ются для представления тенденций или структур, существующих в рассматриваемых данных, в доступной и компактной форме, чтобы улучшить понимание сложных явлений и упростить процесс приня- тия решений. Картография. Машинная графика используется для точного представления на бумаге или пленке географических и других природных явлений. Примеры, приведенные в работе [214], содер- жат географические и рельефные карты, исследовательские карты для бурения и горных работ, океанографические карты, карты по- годы и изолиний, карты для разведки нефти и карты плотности на- селения (рис. 1.5). Автоматизация чертежных и конструкторских работ. В системах автоматизированного проектирования (САПР) машинная графика используется при проектировании компонент и систем механических, электрических, электромеханических и электронных устройств [381]. К таким системам относятся сложные структуры (например, здания, химические и энергетические установки, кузова автомо- билей, фюзеляжи самолетов и корпуса судов и их внутренние ча- сти), оптические схемы, телефонные сети и сети ЭВМ, Основное внимание иногда обращается только на выпуск точных чертежей деталей, узлов и сборок. Однако чаще внимание уделяется интерак- тивной работе с находящейся в ЭВМ моделью проектируемой ком- поненты или системы, чтобы проверить, например, ее механические, электрические или тепловые свойства. Часто модель интерпретиру- ется моделирующей программой, которая выдает информацию о по- ведении системы оператору за дисплейным пультом для выполнения следующих циклов проектирования и проверки. По окончании проектирования объекта вспомогательные программы могут про- извести постобработку проектной базы данных с целью подготовки перечней деталей и сводной ведомости необходимых материалов, сформировать ленты для обрабатывающих центров. Различия меж- ду чертежной и проектной постобработкой кратко рассмотрены в разд. 1.5. Моделирование и мультипликация. Все большую популярность /Приобретают изготовленные с помощью ЭВМ мультфильмы, демон- стрирующие поведение различных реальных или моделируемых объектов во времени. С их помощью можно изучать не только мате- матические фигуры (вклейки 7 а и б), но также математические модели для таких исследуемых наукой явлений, как поток жидко-
и ггАшжг КОЛИЧЕСТВО ТЕЛЕФОНОВ НА 100 ЧЕЛОВЕК а ЧИСТЫЙ ПРИРОСТ НАСЕЛЕНИЯ США ЗА 1970-1979 Белые пятна соответствуют уменьшению численности населения
Что такое интерактивная графика? 21 сти, ядерные и химические реакции, физиологические системы и деформация конструкций под нагрузкой, путем визуального пред- ставления эффектов видоизменения. Относительно новой, требую- щей очень совершенных технических средств областью является изготовление мультфильмов в интерактивном режиме (вклейка 8); такие мультфильмы имеют высокие визуальные качества, а простей- шие из них становятся экономически эффективными за счет использования развитых методов машинной графики, которые поз- воляют избежать рутинной работы [85]. Другим применением элект- ронной мультипликации являются летные тренажеры (разд. 1.3). Они позволяют генерировать не только неподвижный мир, в ко- тором движется самолет, но и такие специальные эффекты, как облака, туман, смог, ночные огни, а также другие летательные ап- параты различных форм и размеров, движущиеся каждый по своему курсу. При подготовке к посадке на Луну космонавты, которые, должны были управлять посадочным модулем и орбитальным кораб- лем, обучались на тренажере операциям стыковки. До первого по- лета на космическом корабле многоразового использования «Шаттл» его пилоты в течение нескольких лет проводили подготовку также па тренажере. Как уже говорилось в предыдущем разделе, функционирование аппаратной или программной части вычислительной системы мож- но с успехом моделировать с помощью ЭВМ, представляя в гра- фическом виде взаимодействие ее компонент и изменение их со- стояний (рис. 1.4 и 1.6). С другой стороны, простейшие игровые ав- томаты моделируют примитивный двумерный и трехмерный мир в реальном времени с ограниченными возможностями динамики изоб- ражения. Управление процессами. Если летный тренажер или игровой автомат дают возможность пользователю общаться с моделью дей- ствительного или воображаемого мира, то во многих других при- менениях пользователь может работать в интерактивном режиме непосредственно с некоторыми аспектами реального мира. Дисплеи состояния на нефтеперегонных заводах, электростанциях и в сетях ЭВМ позволяют представить визуально значения, которые поступа- ют от датчиков, размещенных в наиболее важных точках системы; при возникновении аварийных ситуаций в работу вступает опера- тор (рис. 1.7). Командиры войсковых соединений видят данные о состоянии поля боя (количество и положение боевых машин, све- / Рис. 1.5. Четыре способа изображения карт, полученные методами машинной графики. а структурная карта, полученная по программе SYMAP; б — карта, построенная програм- мой CALFORM с помощью системы MARK 3000 фирмы GEISCO; a — столбчатая карта, полученная по программе ODISSEY; г — карта, построенная программой ASPEX. (Вос- произведено с разрешения лаборатории машинной графики и пространственного анализа 1 арвардской высшей школы проектирования, г. Кембридж, шт. Массачусетс.)
Sub j ec t: »ufc Ш t. Рис. 1.6. Моделирование и графическое представление простой программы чения нового элемента в связный список. Отдельные области экрана сод текст программы, ее графическое представление, средства для управления микой и почту для пользователя. '«peed . ' replay щ ..... one step continue corfs to a пен record |П Л И irs? pointsr-chsse to find insert placai chase j« first; UHIlf (chase HULL § 00 last ;» chase; chase chasifкtucfent.next EMO; tnow ««itch pointers to insert new record! i-/. lastfstudent.next naw; fnate this dot# no? worK right if пен record thoyid be fir»t- how «howid the code ise ecd i f i ed?l дения о введенном в бой оружии, перемещения войск, потери) н командно-контрольных дисплеях и по мере надобности пересма тривают свою тактику (вклейка 9). Авиадиспетчеры в аэропорта: вместе с пятном на экране радиолокатора видят генерируемую ЭВМ информацию (идентификация самолета и его состояние), чт позволяет им быстрее и эффективнее управлять полетами, чем пр: использовании обычного радиолокатора без сопроводительны: надписей. Операторы в центрах управления космическими поле тами следят за телеметрической информацией и -по мере необхо димости дают команды на выполнение коррекции. Автоматизация канцелярских работ и электронная публикация Как описано выше в разд. 1.5, все более широкое распространени получает использование алфавитно-цифровых и графических тер миналов для формирования и распространения информации в ад министративных учреждениях и даже в быту. С их помощью можн* изготовлять как традиционные печатные документы (твердая ко пия), так и «электронные документы», содержащие не только текст
Рис. 1.7. Система FOX 1/А с управляющим дисплеем для химической установки. (С разрешения фирмы Foxboro.) по также таблицы, графики и другую двумерную информацию [ 151J. Искусство и реклама. Общей целью компьютерного искусства и рекламы являются выражение некоторого смысла и привлечение внимания публики с помощью эстетически приятных изображений (цветная вклейка 2). Создатель изображения располагает разви- тыми средствами для моделирования объекта и представления све- та и теней (см. гл. 14—16). Системы «Teletext» и «Videotex» (кратко рассмотренные в разд. 1.6) обеспечивают более простые, но достаточно информативные изображения. Наконец, одним из экономически эффективных применений машинной графики стало изготовление слайдов для представления коммерческой, научной и учебной информации: это связано с быстрым ростом стоимости ра- бочей силы при использовании традиционных способов подготовки таких материалов.
Глава 1 1.5. КЛАССИФИКАЦИЯ ПРИМЕНЕНИЙ Перечисленные выше применения машинной графики сущест- венно различаются между собой. Для классификации применений можно использовать ряд критериев. Первым критерием является тип объекта и тип выводимого изображения. Диапазон возможно- стей включает линейные рисунки двумерных объектов (рис. 1.4), линейные рисунки трехмерных объектов, часто называемые кар- касными (вклейка 29 и рис. 1.8, а), линейные рисунки трехмерных объектов с удалением скрытых линий (рис. 1.8, б и в), двумерные черно-белые тоновые изображения (рис. 1.6), двумерные цветные изображения (вклейка 1) и трехмерные тоновые изображения тел с удалением скрытых поверхностей (вклейка 14). Некоторые из перечисленных объектов являются полностью абстрактными, дру- гие — реальными; их изображения могут быть как чисто символи- ческими (например, простой двумерный график), так и весьма реалистическими (например, натюрморт). Один и тот же объект, ко- нечно, может быть представлен различными способами. Например, печатную плату можно изобразить как совокупность многочислен- ных двумерных графических символов или как трехмерную син- тезированную фотографию реально существующей печатной платы с удалением скрытых поверхностей. Вторым критерием служит тип интерактивности и уровень воз- можностей при управлении изображением, доступный пользова- телю. В этом случае в рассматриваемый диапазон включаются: автономное вычерчивание на графопостроителе по готовой базе данных, полученной с помощью прикладной программы или сфор- мированной путем съема координат с физической модели; интерактивное вычерчивание (циклами вида «подать параметры, вычертить, изменить параметры, вычертить повторно»); задание объекта и «полет» вокруг него в реальном времени под управлением пользователя (типичная задача в летных тренажерах); интерактивное проектирование, при котором пользователь, на- чав с пустого экрана, задает объект (чаще всего из готовых сос- тавных частей), а затем видоизменяет его, по мере необходимости приближаясь или отдаляясь от него. Третьим критерием является роль изображения, т. е. в какой степени само изображение является средством для достижения цели или же самой целью. В таких применениях, как картография, из- готовление рабочих чертежей и «растровая живопись», само изоб- ражение является результатом, тогда как во многих видах машин- ного проектирования полученное изображение служит лишь для визуализации геометрических свойств рассматриваемого объекта (электронной схемы, моста, системы трубопроводов, крыла самоле- та или автомобильного крыла и т. д.). В этих применениях фаза по- лучения изображения— важная, но относительно небольшая часть
Что такое интерактивная графика? Рис. 1.8. Последовательность изображений, которая иллюстрирует модель ма- шиностроительной детали, сгенерированную программным обеспечением ROMULUS для геометрического моделирования тел. Программный комплекс ROMULUS разработан фирмой Shape Data (Великобритания). (С разрешения фирмы Evans and Sutherland.) а — объект вычерчивается н виде каркасной модели без удаления скрытых линий; б — изо- бражение детали с удалением скрытых линий; в — рассечение детали с удалением скрытых линий; г — две проекции детали (вид сверху и спереди) гораздо более обширного процесса, целью которого являются фор- мирование и последующая обработка общей базы данных с помощью комплекса прикладных программ. База данных содержит также зна- чительный объем другой, характерной для каждого применения ин- формации о компонентах; эти данные используются в различных прикладных программах, в том числе и в тех, которые предназна- чены для управления гибким производством. Например, при про- ектировании печатных плат такой комплекс программ может обе- спечивать логическое моделирование, размещение компонент, трас- сировку проводников (при участии пользователя), проверку (на короткое замыкание, наличие разрывов и предельные зазоры), генерацию изображения для получения фотомасок и изготовление Документации (сборочных чертежей, ведомостей и таблиц для свер- ления). Наконец, четвертым критерием служат логические и временные соотношения между объектами и их изображениями. Например,
2б Глава 1 пользователь может в данный момент времени иметь дело только с одним изображением (обычная ситуация при работе графопост- роителя), с изменяющейся во времени последовательностью взаи- мосвязанных изображений (передается динамика движения или ди- намика изменения) или же, наконец, со структурной совокупностью объектов (как во многих применениях машинного проектирования, где существует иерархия общих сборочных чертежей, чертежей уз- лов и т. д.). 1.6. ИНТЕРАКТИВНАЯ ГРАФИКА В БУДУЩЕМ — ОБЫЧНЫЙ ВИД ВЗАИМОДЕЙСТВИЯ Интерактивную графику слишком часто рассматривали как осо- бую форму коммуникации, требующую специальных программных и аппаратных средств ввода-вывода; поэтому считали, что ее мож- но использовать лишь там, где это особенно необходимо. Многие из перечисленных выше применений большинству читателей мо- гут показаться экзотическими. Многие из них требуют весьма зна- чительных аппаратных ресурсов (как для обработки информации, так и для ее хранения) и высококачественных устройств вывода. Например, для летных тренажеров требуется специализированное оборудование стоимостью в несколько миллионов долларов, вклю- чающее ЭВМ и специальные дисплеи. К счастью, благодаря быстрому снижению стоимости аппара- туры (главным образом памяти и микропроцессоров) использова- ние интерактивной графики становится оправданным и целесооб- разным для большинства приложений, в которых требуются отно- сительно небольшие процессорные и дисплейные ресурсы. Неко- торые из этих приложений перечислены ниже для иллюстрации то- го, что машинная графика в своем развитии достигла достаточно высокого уровня и становится обычным средством общения пользо- вателя с ЭВМ (и даже пользователя с пользователем). Так, во многих вводных курсах не только информатики, но и других естественных и общественных наук в настоящее время применяется интерактивная графика, а также моделирование и имитация на дешевых графических терминалах (на основе теле- визоров), подключенных к системам с разделением времени или к персональным ЭВМ. Одновременно с этим подрастает поколение будущих студентов колледжей, которые пользуются домашними ЭВМ стоимостью менее 1000 долл. Такие ЭВМ теперь принято да- рить вместо традиционной энциклопедии. В домашних ЭВМ обычно используются графические терминалы со средней разрешающей; способностью (чаще с использованием цвета), и их пользователи; начинают рассматривать машинную графику как естественный, привычный способ коммуникации, а не как нечто уникальное/ требующее труднодоступного дисплейного устройства. Благопрпят-
Что такое интерактивная графика? 27 ным обстоятельством является отсутствие на большинстве домаш- них ЭВМ печатающих устройств (из-за высокой стоимости): это делает невозможной привычную выдачу толстых пачек листингов и заставляет пользователя обходиться простым и более компакт- ным графическим представлением, которое обычно умещается на экране. Другое важное применение, которое в настоящее время нахо- дит широкое распространение в США, также позволит существенно расширить знакомство с машинной графикой. Оцо касается исполь- зования широковещательных телевизионных систем и телефонных сетей в сочетании с обычной алфавитно-цифровой клавиатурой, которая дает возможность телезрителям выбирать отдельные статьи из специально подготовленных «электронных газет», оперативно просматривать энциклопедии и телефонные указатели, получать сведения о биржевых курсах, перечни развлечений и т. д. [2301 1). Большая часть информации передается в графическом виде. Эти диаграммы выглядят пока примитивно, тем не менее они довольно эффективно привлекают внимание пользователя и сообщают не- обходимую и^фэрмацию (вклейка 10) [62]. Когда это средство станет достаточно надежным и дешевым, применение подключенного к ЭВМ телевизора в качестве графического и текстового ресурса ста- нет таким же естественным и привычным, как пользование телефо- ном. В настоящее время начинают довольно широко применяться лингвистические процессоры, а также наблюдается автоматизация канцелярского mpt/да. Это приводит к тому, что канцелярские ра- бшники и другие специалисты, производящие документы и рабо- тающие с ними, используют терминалы подключенных к ЭВМ ра- бочих станций для подготовки документов и для электронной пере- сылки сообщений и почты. На таких рабочих станциях все чаще будут использоваться высококачественные дисплейные экраны, пригодные для интерактивной графики. Хотя до сих пор основное внимание уделялось сугубо текстовой интерактивной работе, спрос на таблицы, графики, бланки и рисунки достаточно велик. Поэтому ожидается, что большинство таких систем будет передавать на эк- ран наряду с текстом высококачественную графическую информа- цию в том же виде, как на устройствах для получения твердой копии. Если экран весьма точно отображает печатную страницу, становятся ненужными неестественные коды для управления фор- матом текста. Дело в том, что, если есть возможность видеть стра- В системе Videotex, называемой также Viewdata, изображение и текст передаются по телефонному каналу на телевизионный приемник абонента обычно со скоростью 1200 бод (а запросы абонента со скоростью 75 бод). Система Tele- text гораздо менее интерактивна: она посылает повторяющуюся последователь- ность изображений всем абонентам в течение неиспользуемых промежутков стан- дартного телевизионного сигнала, когда ие передается визуальная информация. Абонент может выбрать для локального запоминания и выдачи один кадр при одном обращении к системе.
28 Глава 1 ницу в том виде, как она выглядела бы напечатанной, в значитель- ной мере отпадает потребность в печатании, в особенности для до- кументов, имеющих лишь временное значение. Поэтому большинство временных документов будут формировать и рассылать (а также от- вечать на них) с помощью электронной почты и электронной пуб- ликации. Одним из наиболее перспективных направлений информатики становится разработка принципиально новых систем, которые должны помогать в повседневном труде специалистов, деятельность которых в значительной степени состоит в создании и переработке письменной и устной информации [129]. Еще в середине 60-х годов Ингелбарт и его сотр. в Стэнфордском научно-исследовательском институте [139] создали систему с разделением времени, которая обеспечивает широкие возможности при работе с иерархически ор- ганизованным текстовым графическим материалом, для чего были использованы подключенные к ЭВМ телевизионные дисплеи. При использовании такой системы любые документы, предназначенные для публикации (программы, памятные записки, рукописи и т. д.), с успехом можно обрабатывать с помощью одного и того же средства. Новая система с использованием такого подхода была разра- ботана и применяется в исследовательском центре фирмы Xerox в г. Пало-Альто [276]. Система основана на нескольких принципах. Один из них состоит в том, что основная часть повседневной работы (программирование, передача сообщений, составление и хранение1 документов) может быть выполнена на мощной персональной ЭВМ, которой в большинстве случаев вполне достаточно для одного человека. Персональные рабочие станции ALTO, широко доступ- ные уже в 1981 г., с помощью кабельной сети [317] соединены между собой и подключены к специализированным процессорам, которые ведают коммунальной системой файлов и специальными внешними устройствами (большие магнитные диски, устройства для электронного набора текста, графопостроители и устройства для за- поминания изображения). Другой принцип состоит в том, что ин- терактивная графика должна стать стандартным средством при интерактивном взаимодействии пользователя с любыми подсистема- ми и процессами, используемыми на персональной ЭВМ. Черно-бе- лый телевизионный экран с растром 808x608 точек позволяет вы- давать высококачественный текст и графический материал так, как если бы их выводили на печатающем устройстве с высокой разрешающей способностью (рис. 1.9). К моменту выхода в свет; данной книги многие коммерческие предложения фирмы Xerox и ее конкурентов основывались на использовании PARC-модели вычислений. Многие системные и пользовательские программы для станции ALTO используют программный диспетчер окон для управления * многочисленными, обычно взаимно перекрывающимися окнами,- т. е. областями экрана, в каждой из которых могут быть представ-]
Что такое интерактивная графика? 29 Рис. 1.9. Растровый дисплей ALTO фирмы Xerox, обслуживаемый программой Smalltalk. Видны два окна, одно из которых содержит графическое изображение, а второе — текст. (С разрешения исследовательского центра фирмы Xerox.) лены страница или часть страницы. Фактически каждое окно пред- ставляет собой виртуальный экран переменных размеров, на котором отображается ход какой-либо работы. При этом создается такое же впечатление, как при взгляде на небольшой письменный стол с лежащими одна на другой и взаимно перекрывающимися бумага- ми различного размера. Если одновременно выполняется несколь- ко работ, то их результаты демонстрируются в соответствующих окнах на экране. Например, можно редактировать текущую про- грамму, одновременно просматривать вторую для получения спе- цификации модулей и выполнять третью, которая может порождать кадры мультфильма; на заднем плане пользователь может видеть поступающую электронную почту и сообщения, а также часы реаль- ного времени [318]. Таким образом, содержание страниц, лежащих , на столе, которые соответствуют многочисленным файлам и про- цессам, изменяются динамически и независимо, что обеспечивает ' новый режим работы при интерактивном взаимодействии человека и ЭВМ [257, 258, 458]. Следует отметить, что мощные средства, обеспечиваемые этим режимом, а также простота работы пользователя с параллельно выполняемыми процессами и с их окнами обеспечивают существен- ное повышение производительности труда пользователя по срав-
30 Глава 1 нению'с более традиционным способом — разделением времени. Действительно, исследователи, достаточно долго использовавшие эту систему, считают, что последняя обеспечивает такое же количе- ственное и качественное улучшение по сравнению с традиционным разделением времени (например, для алфавитно-цифровых терми- налов с перемещаемым курсором и скоростью передачи 9600 бод), какое дало бы использование этого вида «широкополосного» разде- ления времени по сравнению с работой в режиме пакетной обработки на перфокартах. По-видимому, такие благоприятные отзывы вызваны двумя об- стоятельствами, которые намного важнее высокой скорости работы системы и простоты ее использования. Наиболее важным явля- ется тот факт, что присущие данному режиму двумерность и ори- ентация на многопроцессность освобождают пользователя от ли- нейной, последовательной текстовой связи с машиной, унаследо- ванной от работы в пакетном режиме и от языков и средств этого режима. Это позволяет существенно расширить «полосу передачи» информации. Кроме того, окружающая среда для используемых средств совместно с интерфейсами пользователя представляется как единое целое, как нечто, построенное по принципу сверху вниз, чтобы соответствовать некоторым единым и связным концептуаль- ным принципам. Вся повседневная работа, от расчетов до автома- тизации канцелярской деятельности (например, электронная почта), выполняется с помощью одних и тех же средств и на основе неко- торых разумных соглашений. (В противоположность этому в боль- шинстве традиционных систем с разделением времени пользова- телю предоставляется совокупность необъединенных, часто очень специфичных средств, собранных вместе по принципу снизу вверх, при недостаточно продуманных соглашениях по их использованию и приводящем в отчаяние отсутствии унификации стиля.) В качестве последнего примера, иллюстрирующего будущие воз- можности использования развитой машинной графики при ин- терактивном взаимодействии человека с ЭВМ, можно отметить другой исследовательский проект, выполненный в Массачусетском технологическом институте (МТИ) [48]. В этой системе пользовате- ли просматривают двумерный мир «Даталандии» в реальном вре- мени, т. е. с удобной для них скоростью и практически с мгновен- ным ответом. База данных содержит текст, фотоснимки, звуковые сигналы и телевизионные кадры (последние поступают с оптиче- ского видеодиска, который сканируется лазером). Материал можно читать и можно вносить в него текстовые заметки и рисунки. Пользователь сидит в комнате средств информации, где находятся: два персональных дисплея с сенсорными экранами, телевизионный экран во всю стену, специально оборудованное кресло, у которого на подлокотниках находятся органы управления для выполнения панорамирования, приближения и удаления, октофоническое зву- ковоспроизводящее оборудование. Система обеспечивает возмож-
Что такое интерактивная графика?31 ность панорамирования, приближения и удаления по отношению к двумерной базе данных, демонстрируемой на персональном мони- торе; детали, невидимые до этого, проявляются на большом экране по мере приближения к рассматриваемому объекту (вклейка 11), Звуковые сигналы указывают направления, по которым происхо- дит приближение, и расстояние до объекта. (Опытно-промышленный образец этой системы для работы с пространственной информацией, разработанный в МТИ, описан в [218].) В другой системе, исполь- зуемой для иллюстрации простых операций по техническому обслу- живанию и ремонту, может быть «на лету» собрана последователь- ность кадров с видеодиска, образующая «фильм» для конкретного заказчика. Проводятся дополнительные исследования по «персо- нализации» (с учетом опытности пользователя, соотношения между изображением и текстом и т. д.). Такое представление информации с использованием разнообразных информационных средств поз- воляет судить о блестящих перспективах высокодинамичного, учитывающего особенности личности, «широкополосного» общения человека с машиной в интерактивном режиме. 1.7. КРАТКАЯ ИСТОРИЯ МАШИННОЙ ГРАФИКИ Будущее машинной графики как стандартного средства интер- активного общения человека с ЭВМ представляется, таким обра- зом, весьма многообещающим. И все-таки целесообразно осмыс- лить общее состояние в этой области знаний в настоящее время и понять, каким путем пришли к этому состоянию. В данной кни- ге рассматриваются основные принципы и методы, которые раз- работаны в прошлом и используются в настоящее время и кото- рые в основном останутся в силе и в будущем. Обычно гораздо лег- че отразить историю развития аппаратной, чем программной ча- сти, поскольку аппаратура оказывает большее влияние на раз- витие отрасли. Поэтому мы начнем с аппаратуры. Вывод незатейливых рисунков на устройства для получения твердых копий (телетайп, АЦПУ) относится еще к первым дням использования ЭВМ. Построенная в МТИ в 1950 г. ЭВМ Whirlwind была оборудована выходными дисплеями на ЭЛТ (как для операто- ра, так и для кинокамеры — с целью получения твердой копии). В системе противовоздушной обороны SAGE в середине 50-х годов впервые были применены дисплейные пульты управления и контроля б использованием ЭЛТ, на которых оператор мог идентифицировать цели, указывая на них световым пером 1). Началом современной ин- терактивной графики можно считать основополагающую диссер- тационную работу Сазерленда, посвященную графической системе 1( ЭЛТ (электронно-лучевая трубка) является устройством для визуализа- ции информации, которое также служит основой бытовых телевизионных прием, ников. ЭЛТ и указывающие устройства типа светового пера рассмотрены в гл. 3.
32 Глава 1 Sketchpad [446]. Он предложил использовать структуры данных’ для хранения иерархии графических символов; такие иерархии строятся путем простого копирования стандартных компонент (подобно использованию пластмассовых трафаретов для рисования блок-схем или радиосхем). Им разработаны также интерактивные методы использования клавиатуры и светового пера для выбора, указания и рисования, а также сформулированы многие другие основные идеи и методы, которые применяются до сих пор.’Тогда же и возникло понимание, сколь велики возможности машинной графики для частичной автоматизации чертежных и других работ с большим объемом графического материала при машинном проек- тировании и при автоматизации производства в таких отраслях промышленности, как изготовление ЭВМ, автомобилестроение, ави- ационная и космическая техника. В середине 60-х годов возник ряд исследовательских проектов, появились разработки, пригод- ные для коммерческого распространения. Наиболее значительными среди них были проект фирмы General Motors по использованию многопультовой графической системы с разделением времени для многих фаз проектирования автомобиля, система Digigraphic (сна- чала созданная фирмой Itek для проектирования линз, а затем приобретенная и распространявшаяся фирмой CDC) и, наконец, дисплейная система IBM 2250, основанная на прототипе фирмы General Motors. Вокруг достижений в области интерактивного взаимодействия человека с ЭВМ возник рекламный ажиотаж; говорилось о том, что «окно в ЭВМ» станет неотъемлемой составной частью сущест- венно ускоряющихся интерактивных циклов проектирования. Од- нако практические результаты оказались гораздо более скромными, поскольку лишь наиболее передовые в техническом отношении организации могли позволить себе пользоваться машинной графи- кой. Основные причины такого положения состояли в следующем: Высокая стоимость графического оборудования (создаваемого без учета экономической целесообразности). Значительные потребности в вычислительной мощности для об- служивания больших баз данных, для работы с изображениями в ин- терактивном режиме, а также для крупных комплексов прикладных программ постобработки, исходные данные к которым поступали после стадии графического проектирования. Трудности при разработке больших интерактивных программ для работы в среде с разделением времени в то время, когда ма- шинная графика и интерактивный режим работы все еще были новинками для программистов, привыкших к пакетному режиму и к Фортрану. Индивидуальность программного обеспечения (невозможность переноса на другую вычислительную установку), обычно пригод- ного только для дисплея конкретного изготовителя и разрабаты-.» ваемого без учета преимуществ, обеспечиваемых современными!
Что такое интерактивная графика? 33 принципами построения модульных структурированных систем. Если программное обеспечение переносить нельзя, переход к но- вым дисплейным устройствам требует весьма дорогостоящей и дли- тельной переделки работающих программ. 1.7.1. Методы вывода Дисплейные устройства, разработанные в середине 60-х годов и используемые в настоящее время, называются векторными, штри- ховыми или каллиграфическими. Они состоят из дисплейного про- цессора, дисплейной буферной памяти и ЭЛТ с относящейся к ней Электронной частью. Буфер служит для запоминания подготовлен- ного на ЭВМ дисплейного списка (или дисплейной программы)', последняя включает команды вывода точек и отрезков (по коорди- натам конечных точек), а также команды вывода литер (рис. 1.10). Команды рисования точек, отрезков и литер интерпретируются ди- сплейным процессором, который преобразует цифровые значения в аналоговые напряжения, управляющие электронным лучом, послед- ний вычерчивает линии на люминофорном покрытии ЭЛТ (эта про- цедура подробно описана в гл. 3). Поскольку светоотдача люми- нофора падает до нуля за десятки (максимум за сотни) микросе- кунд, дисплейный процессор должен осуществлять цикл по задан- ной программе с целью регенерации изображения на люминофоре с частотой не менее 30 раз в 1 с для устранения мерцания; в связи с этим буфер, в котором хранится дисплейная программа, обычно называется буфером регенерации. Отметим, что на рис. 1.10 команда перехода (JMP) обеспечивает возврат на начало дисплейной про- граммы с целью обеспечения циклической регенерации. В 60-х годах буферная память достаточно большого объема для типичных линейных рисунков (емкостью 8—32 кбайт) и до- статочно быстрые процессоры для регенерации с частотой не менее 30 Гц были очень дороги. В связи с этим создание в конце 60-х го- дов запоминающих ЭЛТ с видимым изображением (ЗЭЛТ), которые позволяли отказаться от буфера и регенерации, было важным эта- пом па пути обеспечения доступности машинной графики (рис. 1.3 и 1.11), В ЗЭЛТ изображение запоминается (до момента стирания) путем его однократной записи относительно медленно движущимся электронным лучом на запоминающую сетку, заполненную люми- нофором. Это небольшое автономное терминальное устройство очень удобно для подключения через недорогой, медленный (ЗОСМ—1200 бод) телефонный интерфейс к системе с разделением вре- мени. Оно представляло собой наиболее экономичную альтерна- тиву громоздкой, сложной системе регенерации, подключаемой через дорогие скоростные интерфейсы к каналам ввода-вывода или к контроллерам внешних устройств. ЗЭЛТ обеспечивали возможность интерактивного графического вывода для многих простых приме-
34 Глава 1 Планшет для ввода Рис. 1.10. Типичный дисплей с регенерацией. Дисплейная программа в памяти символически представляет команды рисования, за которыми указываются значе- ния (например, координаты х, у или литеры). нений, причем затраты часто были на порядок ниже, чем для дис- плеев с регенерацией. Благодаря этому к машинной графике «при- общились» многие пользователи и программисты, не имеющие от- ношения к машинному проектированию. Запоминающие трубки до сих пор применяются в тех случаях, когда требуется вывести большое количество (десятки тысяч) отрезков и литер и когда нет необходимости в динамических операциях с изображением. Следующим важным шагом в разработке аппаратуры было осво- бождение центральной ЭВМ от нагрузки, создаваемой дисплеем с регенерацией (в особенности при работе пользователя в интерак- тивном режиме и при редактировании изображений), путем под- ключения к мини-ЭВМ Обычно мини-ЭВМ используется как спе- циализированная автономная машина для выполнения прикладных программ, а также для обслуживания дисплея и интерактивных уст- ройств пользователя. Часто ее можно использовать как интеллек- туальный сателлит основной ЭВМ с целью обработки интерактив- ных действий пользователя, возлагая при этом на основную ЭВМ значительный объем вычислений и работу с большими базами дан- ных. В то же время аппаратная часть самого дисплейного процессо- ра становится все сложнее и берет на себя многие рутинные, но требующие больших затрат времени работы, выполнявшиеся ранее графическим программным обеспечением.
Что такое интерактивная графика? 35 Рис. 1.11. Типичный дисплей на запоминающей ЭЛТ. В середине 70-х годов была изобретена дешевая растровая гра- фика, основанная на телевизионной технике, которая оказала силь- ное влияние на развитие машинной графики. В растровых дисплеях дисплейные примитивы (отрезки, литеры и закрашенные участки — обычно многоугольники) хранятся в памяти для регенерации в виде совокупности образующих их точек, называемых пикселами (pixels) или пэлами (pels) от словосочетания picture element. Изображение формируется на растре, представляющем собой совокупность го- ризонтальных растровых строк, каждая из которых состоит из отдельных пэлов; таким образом, растр — это матрица из пэлов, покрывающая всю площадь экрана. Все изображение последователь- но сканируется 30 раз в 1 с по отдельным строкам растра в направ- лении сверху вниз, при этом изменяется лишь интенсивность элек- тронного луча для каждого пэла в строке (рис. 1.12). Благодаря этому резко возрастает потребность в памяти, поскольку полное изображение, состоящее, например, из 512 строк по 512 пэлов, долж- но храниться непосредственно как битовая карта, содержащая только точки, которые находятся в однозначном соответствии с точ- ками на экране 11. С другой стороны, для вывода простых изобра- жений можно применять очень дешевую и выпускаемую серийно телевизионную аппаратуру. ' Для использования растровой графики была разработана не- дорогая полупроводниковая память, благодаря чему емкость бу- феров регенерации стала существенно больше, чем 10 лет назад, а их стоимость снизилась во много раз. Разрешающая способность 11 В гл. 10 и 11 рассматриваются другие способы организации изображения на дисплее, не требующие явного хранения всех пэлов; однако в этом случае нужны более мощные логические устройства и процессоры.
36 Глава 1 Интерфейс Зля связи с основной ЭВМ Рис. 1.12. Типичный растровый графический дисплей с изображением дерева и дома на экране. стандартных растровых графических систем пока еще ниже, чем разрешающая способность векторных (1280X1024 против 4096Х Х4096 точек), а их аппаратная часть не обеспечивает достаточной скорости для динамических эффектов, обычных на дисплеях с вы- сокой разрешающей способностью. Это связано с тем, что для всех пэлов таких примитивов, как отрезок прямой или прямоугольник, требуется преобразование координат, тогда как в векторном дисп- лее достаточно преобразовать лишь координаты конечных точек или вершин. Для плавного динамического преобразования всех 1280Х X 1024 точек экрана необходимо изменить состояние более чем мил- лиона пэлов менее чем за десятую долю секунды: в большинстве систем использование такой вычислительной мощности оказывается слишком дорогим 11. Однако растровая графика (в отличие от век- торной) позволяет закрашивать отдельные участки изображения (обычно разными цветами), что существенно повышает возможности передачи информации. Кроме того, процесс регенерации в этом слу- чае не зависит от сложности изображения (число линий и т. д.), так как аппаратура обладает достаточным быстродействием, чтобы считать все пэлы из буферной памяти в течение цикла регенерации 1( В современных персональных ЭВМ с растровыми дисплеями все чаще обес- печиваются динамические эффекты. Кроме того, дисплей модели 7255 фирмы Megatek, стоивший в 1981 г. около 60 тыс. долл. [31 4], позволяет осуществлять динамическое изменение изображения в реальном времени на растре 1024Х 1024 точек (см. гл. 10).
Что такое интерактивная графика} независимо от того, содержат они информацию или же служат лишь фоном. Благодаря этому устраняется мерцание. Векторные же дисплеи часто начинают мерцать, когда число примитивов в буфере становится таким большим, что его нельзя считать и обработать за 1/30 с, в результате чего изображение регенерируется недостаточ- но часто. 1.7.2. Методы ввода Параллельно с совершенствованием методов вывода существен- но улучшались методы ввода. Громоздкое и хрупкое световое перо вытесняется тонкой указкой, которую перемещают по планшету, или же смонтированной на экране прозрачной сенсорной панелью, реагирующей на прикосновение. Кроме того, большие надежды воз- лагают на речевую связь, которая позволяет вводить без помощи рук и выводить в естественном виде простые инструкции, получать обратную связь от системы и т. д. (В гл. 5 содержится более под- робная информация об устройствах ввода.) С помощью таких ин- терактивных устройств пользователь может вводить новую тек- стовую или графическую информацию, а также указывать сущест- вующую информацию на экране для задания операций или тех компонент изображения, над которыми должны быть выполнены действия. Для такого взаимодействия не надо уметь программиро- вать: пользователь только осуществляет выбор, отвечает на во- просы, размещает готовые символы, рисует на экране (последова- тельно указывая точки, которые соединяются отрезками), раскра- шивает отдельные участки, указывая многоугольники и задавая интенсивность или цвет каждого многоугольника. 1.7.3. Мобильность программного обеспечения Существенный прогресс в производстве аппаратуры позволил резко изменить отношение к графическому дисплею. В недалеком прошлом уникальное специальное устройство вывода — графи- ческий дисплей — теперь заменяет повсеместно распространенный алфавитно-цифровой терминал в роли стандартного интерфейса для связи человека с ЭВМ. Можно задать вопрос: удалось ли доби- ться такого же прогресса при разработке программного обеспе- чения? Например, каким образом были решены проблемы, возни- кавшие в начальный период использования графических систем и .прикладных графических программ? Многие из этих трудностей были связаны с примитивностью графического программного обес- печения, предоставлявшегося прикладным программистам. Про- цесс совершенствования программного обеспечения был длитель- ным и медленным. Был пройден путь от аппаратно-зависимых па- кетов подпрограмм низкого уровня, поставляемых изготовителя- ми вместе с конкретными дисплеями, к аппаратно-независимым
38 Глава 1 пакетам высокого уровня. Такие пакеты, обычно поставляемые разработчиками, могут быть использованы для управления самы- ми разнообразными графическими устройствами — от графопострои- телей до высококачественных векторных и растровых, дисплеев. Основная цель аппаратно-независимого пакета, используемого в сочетании с языком высокого уровня, состоит в том, чтобы обеспе- чить мобильность прикладной программы при переходе с одной ЭВМ на другую. В данном случае мобильность достигается при- мерно так же, как это с успехом делается при использовании ма- шинно-независимого языка «высокого уровня» (например, Фор- трана): программист «изолируется» от особенностей конкретной машины, а конструкции языка выбираются так, чтобы их легко можно было реализовать для большинства процессоров. Существенный шаг вперед в середине 70-х годов был связан с осознанием необходимости стандартизации аппаратно-независи- мых графических пакетов. В результате появились широко изве- стные технические требования к «Графической системе Core» (крат- ко называемой Core), разработанные группой ACM SIGGRAPH в 1977 г. [202] и переработанные в 1979 г. [203]. Предложенный стан- дарт основывался на результатах работы в течение 6—8 лет с не- сколькими аппаратно-независимыми графическими пакетами и в основном включал общие требования и практические приемы гра- фического программирования (разд. 1.8). Хотя этот стандарт по машинной графике все еще подвергается серьезному обсуждению как внутри страны (в Американском национальном институте стан- дартизации (ANSI)), так и на международном уровне (в Международ- ной организации по стандартизации (ISO)), уже стало ясно, Что система, принятая в 1979 г., послужит серьезной основой для раз- работки и совершенствования серий новых стандартов и сыграет та- кую же роль, какую в свое время сыграл Фортран в области раз- работки языков программирования х). Очевидно, что наши поня- тия в области графического программирования должны измениться, возможно, самым коренным образом, поскольку мы вступаем в пе- риод интерактивной графики на мощных персональных ЭВМ. Тем не менее терминология Core и предусмотренные в ней возможности фактически превращаются в стандарт (хотя он и считается времен- ным). Поэтому в гл. 2 мы опишем графическое прикладное про- граммирование с использованием некоторого подмножества Core. 1> Одиако мы считаем, что Фортран в значительной мере изжил себя и имеет слишком жесткие ограничения для управляющих конструкций и типов данных. Поэтому в качестве языка программирования для данной книги нами использован более современный структурированный язык Паскаль.
Что такое интерактивная графика? 39 Рис. 1.13. Программистская модель интерактивной графики. 1.8. ПРОГРАММИСТСКАЯ МОДЕЛЬ ИНТЕРАКТИВНОЙ ГРАФИКИ На рис. 1.13 схематически показаны основные концепции, на которых базируется Core. Ниже дается их краткое описание; в по- следующих главах мы вернемся к ним и рассмотрим более подробно. Аппаратными компонентами являются основная ЭВМ и управляе- мое ею дисплейное устройство, называемое дисплеем или графическим терминалом (рис. 1.10—1.12). В свою очередь дисплей состоит из компоненты для вывода (дисплейный экран или видовая поверхность, на которую выводится изображение) и компоненты для ввода, или интерактивной компоненты (рис. 1.14). Интерактивная компонен- та обычно представляет собой набор логических устройств, кото- рые содержат устройства типа клавиатуры (например, алфавитно- цифровую клавиатуру для ввода текста); кнопочное устройство для вызова заданных функций или осуществления определенных операций; устройства для указания (типа светового пера или план- шета с указкой), используемые при указании составных частей изоб- ражения на экране; валюаторы, т. е. устройства типа вращающих- ся ручек или рычагов для ввода скалярных величин; указатели по- ложения по осям х и у, или локаторы, например устройства для перемещения перекрестия по экрану типа рычага или поворотных ручек и дисков (подробно эти устройства описаны в гл. 3—5). , Следует иметь в виду, что одно физическое устройство может быть использовано для выполнения как одной, так и нескольких 'логических функций. Программное обеспечение состоит из трех компонент. Первой компонентой является прикладная программа. Она засылает ин- формацию и извлекает ее из второй компоненты — прикладной структуры данных (базы данных) — и направляет графические команды в третью компоненту — графическую систему.
4 U Глава 1 Рис. 1.14. Дисплейный пульт с обычными устройствами ввода.
Что такое интерактивная графика?4'1 Структура данных содержит описание реальных или абстракт- ных объектов, изображения которых должны появляться на экра- не. Поэтому в структуре данных может храниться вся необходимая информация для таких разнообразных объектов, как электриче- ские схемы, здания, математические и статистические функции, фюзеляжи самолетов, молекулы, модели ядерных реакторов или же пространственные ландшафты и летательные аппараты для лет- ных тренажеров. В описание объектов обычно включаются геометрические дан- ные о координатах (определяющие форму компонент объекта), атрибуты объекта (например, тип линии, цвет или даже фактуру поверхности), а также данные о связности и положении (т. е. дан- ные о том, каким образом компоненты соединены между собой). Часто имеется также негеометрическая или текстовая информация о «свойствах», которая полезна для программ постобработки и (или) для интерактивного пользователя. Примерами таких данных для применений в области машинного проектирования могут слу- жить сведения о цене и поставщике, тепловые, механические или электрические свойства и допуски. Следует отметить, что для рабо- ты со структурами данных все шире используют системы управ- ления базами данных (СУБД) общего назначения. Прикладная программа описывает двумерную или трехмерную геометрию объекта, подлежащего выводу на видовую поверхность, для графической системы, которая обычно снабжена комплексом графических подпрограмм вывода, совместимых с такими языками высокого уровня, как Фортран или Паскаль. Этот пакет подпро- грамм управляет конкретным устройством и обеспечивает вывод изображения этим устройством (обычно на основе представления в виде дисплейного списка, хранящегося в буфере регенерации и только что сформированного пакетом). Прикладная программа пользуется графической системой в значительной мере так же, как она пользуется подсистемой ввода- вывода операционной системы для работы с записями, хранящимися в файлах (для их чтения и записи). Подсистема ввода-вывода ведет каталог файлов, организует размещение записей па дисках и лен- тах и освобождает прикладного программиста от необходимости знать многочисленные аппаратно-зависимые параметры и условия. Аналогичным образом графическая система «защищает» приклад- ного программиста от ознакомления со спецификой архитектуры нижнего уровня дисплейного процессора и с координатной х-, у-системой физического экрана. ,Если вывод изображения обеспечивается программами вывода, входящими в состав графической системы, то ввод выполняется под контролем ее программ ввода, передающих поставляемые поль- зователем данные прикладной программе в процессе последователь- ных интерактивных действий. При этом прикладная программа может требовать от графической системы считывания значений с
42 Глава 1 устройств ввода типа локатора или валюатора (т. е. их опроса). И наоборот, прикладная программа может «заснуть» (Перейти в сос- тояние ожидания), предварительно попросив программу ввода «раз- будить» ее, когда будет активировано пользователем устройство ввода, генерирующее прерывание. На основании этих введенных значений прикладная программа может изменить свой режим работы или свое состояние. Например, она может ввести в действие процедуру, соответствующую одной из ряда возможных команд, перечисленных на экране, в ответ на выбор пользователем той или иной команды меню. Кроме такого изменения режима работы программа может просто поменять ка- кое-либо значение в данных, что затем приводит к модификации внешнего вида объекта или связанных с ним свойств. Преобразования вывода (от объекта к изображениям) и преобра- зования ввода (от действий пользователя к объекту) более подробно рассмотрены в гл. 2 (с точки зрения прикладного программиста) и в гл. 4 (с точки зрения разработчика пакета). Однако даже на ос- новании приведенной выше информации мы можем показать, в чем состоит отличие графических прикладных программ от «тра- ‘ диционных» программ. Во-первых, двумерная и трехмерная геометрия графических объектов — это совершенно иной вид данных, для которых очень ? быстро развиваются собственные математические методы и алго- , ритмы. В особенности это относится к формированию реалистиче- ; ских изображений трехмерных объектов (гл. 14—17). Во-вторых, ’{ интерактивные графические программы отличаются от программ, | используемых в режиме пакетной обработки, тем, что они управ- j ляются событиями. Это означает, что эти программы ожидают ка- ких-либо действий пользователя, затем соответствующим образом < реагируют на них и вновь переходят в состояние ожидания. В ос- : новном такой диалог может иметь вид следующего цикла: ] repeat ' обеспечить возможность выбора или запроса; wait пока пользователь не ответит одним из возможных значений; case—по ответу передать управление процедуре, соответствующей этому' ответу; until стоп {пользователь отвечает командой STOP) В-третьих, использование аппаратно-независимого графического пакета высокого уровня существенно упрощает интерактивное ри- сование и подготовку простых графиков, диаграмм и чертежей] (гл. 2). Однако в более сложных приложениях обнаруживаются! особенности графического программирования. Часто прикладной! программист не владеет необходимыми методами и навыками. Он,| в частности, должен знать: I I. Как строятся диалоговые и интерактивные языки, в которых! большое внимание уделяется средствам обеспечения выразитель-в
Что такое интерактивная графика? 43 ности, логичности, эргономике интерфейса для человека (это должно упростить и ускорить интерактивное взаимодействие), а также удоб- ной и информативной обработке ошибок (гл. 6). 2. Как в трехмерной графике правильно использовать мате- матические методы для геометрических преобразований (гл. 7) и для описания формы тел и поверхностей (гл. 13). 3. Как получить реалистические изображения, удаляя скрытые поверхности, а также используя модели передачи цвета, освеще- ния и теней (гл. 14—17). 4. Как работать с иерархическими структурами объектов, сос- тавленных из подобъектов, и строить изображения таких объектов (гл. 9). 5. Какие технологические принципы программирования позво- ляют создавать надежные, допускающие расширение и простые в обслуживании программы. В общем случае трудно «привить» интерактивный графический интерфейс к существующей программе для работы в режиме па- кетной обработки, поскольку стиль и структура интерактивной графической программы обычно существенно отличаются от стиля и структуры программы для пакетной обработки. Поэтому, чтобы обеспечить правильную разработку программы, требуется выпол- нить предварительный анализ (сверху вниз) всех возможных после- довательностей действий с целью разработки правильной структуры и ее хорошей реализации. Исходя из этого, в следующей главе мы опускаем подробности реализации графической аппаратуры и пред- назначенных для нее обслуживающих программ и начинаем изло- жение сразу с графического программирования, чтобы изучить на примерах методы и хороший стиль (интерактивного) программиро- вания. УПРАЖНЕНИЯ 1.1. Подготовьте перечень приложений машинной графики в вашей органи- зации и попытайтесь классифицировать их в соответствии с категориями, указан- ными в разд. 1.5. Можете ли вы сгруппировать эти приложения по классам экви- валентности, в которых приложения в основном аналогичны по структуре? 1.2. Составьте пользовательскую модель высокого уровня для типичной ин- терактивной прикладной программы, с которой вы достаточно знакомы. Укажите основные подсистемы или модули. Насколько существенна графическая часть, т. е. можно ли использовать эту прикладную программу также и при текстовом интерактивном взаимодействии? Каково здесь значение интерактивности, и нель- зя ли обеспечить почти такой же результат с помощью пакетного режима? 1-3. Рассмотрите хорошо знакомую вам неинтерактивную графическую прикладную программу и обсудите вопрос о том, как улучшить ее полезность, простоту использования или стоимость эксплуатации путем переработки в интер- активную графическую прикладную программу. Чго будет легко изменить, что трудно, и почему? „ 1.4. Рассмотрите приложения, которые не требуют графического взаимо- Денствия или не улучшатся в результате его использования. Попытайтесь выявить
44 Глава 1 основные характеристики приложения, которые делают его «вероятным кандида- том» для использования в интерактивной графике. 1.5. Возьмите прикладную область, которой вы предпочитаете заниматься, и попытайтесь определить, насколько успешно в ней использовалась до сих пор интерактивная графика. Обратитесь к таким источникам по данному вопросу, как последние публикации в специальных изданиях, труды конференций SIGGRAPH н т. Д-, побеседуйте со специалистами по данной проблеме. 1.6. Предположим, что на дисплей с регенерацией требуется вывести изобра- жение, представляющее собой последовательность нз 500 соединенных между со- бой векторов длиной 254 мм. Сколько байтов памяти потребуется для запоминания этого изображения при выводе на векторный дисплей с экраном 254 X 254 мм, который чертит непрерывные линии между двумя конечными точками на квад- ратной сетке, содержащей 1024X1024 точки. Предполагается, что код операции «чертить вектор» занимает 12 бит, а каждая из координат х и у — по 10 бит, т. е. на каждый отрезок требуется 4 байта на код операции и на пару координат (х, у). Сколько байтов потребуется для хранения того же изображения в виде битовой карты для такого же дисплея н при той же разрешающей способности? Какое изображение выглядит лучше и почему? Какое изображение можно быстрее из- менять? 1.7. Каков разумный уровень разрешающей способности для черно-белого растрового дисплея с битовой картой, который регенерируется от памяти домаш- ней микро-ЭВМ с оперативной памятью объемом 64 К?
Глава 2 Основы интерактивного графического программирования 2.1. МОДЕЛИ, ОПИСАНИЕ ИЗОБРАЖЕНИЯ И ИНТЕРАКТИВНОСТЬ Важнейшей целью разработчика интерактивной графической программы является выделение классов элементарных или состав- ных объектов, которые должны формироваться и представляться графически, а также определение способа общения пользователя с графической программой при формировании и изменении объектов и их изображений. В разд. 1.8 введена программистская модель интерактивной графики; в ее основе лежат преобразования, поз- воляющие перейти от представления объекта к его образу. В данной главе мы рассмотрим в более явном виде отдельные шаги этих пре- образований, используя программные структуры, общепринятые для прикладных интерактивных графических программ. В качестве концептуальной основы программистская модель (рис. 2.1) полезна для понимания того, каким образом следует разделить всю работу, связанную с преобразованием абстрактного описания двумерного и трехмерного «мира», состоящего из одного и более объектов, в вид или образ этого мира. Отдельные шаги та- кого преобразования должны быть понятны и просты для реализа- ции. Аналогично в интерактивной системе процесс преобразований при вводе также подразделяется на отдельные шаги, в которых можно различать логическую обработку информации, вводимой пользователем, и воздействие этой информации на объекты и(или) их образы. Эта программистская модель справедлива для большинства при- ложений, в которых требуется какая-либо (пусть примитивная) структура данных для описания изображения. Однако для неко- торых приложений модель необходимо модифицировать. Во-первых, большинство современных дисплеев с развитой архитектурой (такие дисплеи рассмотрены в гл. 10) может непосредственно ин- терпретировать прикладную структуру данных, показанную на рис. 2.1. Во-вторых, в некоторых приложениях с использованием растровой графики пользователь воздействует непосредственно на цифровое представление изображения самого нижнего уровня, хранящееся в дисплейной системе, как если бы он работал непосред- ственно с изображением («раскраска»). В такой системе объект и изображение идентичны («вы получите то, что видите»). Эти при- менения можно смоделировать с помощью «усеченной» версии более общей программистской модели, в которой компонента структуры
46 Глава 2 I Канал выеоЗа Пользователь (оператор) Рис. 2.1. Программистская концептуальная модель интерактивной графики. ЭВМ данных либо вовсе отсутствует, либо совпадает с битовой картой (см. гл. 3 и 12). Опишем теперь программистскую модель с точки зрения трех основных действий, выполняемых в интерактивной графике. Эти действия, более подробно описанные в разд. 2.1.1—2.1.3, пере- числены ниже. Построение прикладной модели. Прежде всего прикладной про- граммист строит прикладную модель объектов, с которыми пользо- ватель будет работать и которые он будет рассматривать. Термин «прикладная модель» не следует смешивать с концептуальной про- граммистской моделью машинной графики: первая из этих моделей есть часть второй. Прикладная модель (ниже для краткости назы- ваемая просто моделью) есть совокупность данных, представляющих объекты, и отношений этих данных, обычно хранящаяся в виде прикладной структуры данных. Таким образом, модель отображает важные свойства объектов, существенные для данного приложения или для ряда приложений. Эти объекты могут быть конкретными или абстрактными и при визуализации могут быть представлены в двумерном или трехмерном мире. Примерами могут служить мате- матическая функция, интегральная схема, план помещения, зуб- чатая передача, молекула. Описание объектов для графической системы. Построив приклад- ную модель мира как совокупность из одного и более объектов в прикладной структуре данных, прикладной программист описывает эту модель для графической системы таким образом, чтобы система могла рассчитать, а затем и вывести конкретный требуемый вид. Слово вид используется здесь как в смысле визуальной передачи некоторых геометрических свойств, так и в смысле, относящемся
Основы интерактивного графического программирования Рис. 2.2. Административное здание как трехуровневый1* объект.___ ’) Если не считать корневого узла, так как с ним этот объект является четырехуровне- вым — Прим, перед. к базе данных и обозначающем генерирование двумерного представ- ления некоторых свойств объектов. Эти свойства по характеру не обязательно являются чисто геометрическими, хотя и могут быть представлены визуально. Интерактивная работа. Прикладной программист обеспечивает возможность диалога пользователя с ЭВМ через устройства ввода (чтобы пользователь мог указать, как строить и видоизменять объек- ты и какие их виды нужно выводить). 2.1.1. Построение прикладной модели В качестве примера построения прикладной модели рассмотрим простую интерактивную прикладную программу для размещения мебели в комнате. Эту программу может использовать специалист по интерьеру (дизайнер) для подготовки прикладной модели ин- терьера типичного административного здания, в которой определено, какая мебель должна быть установлена в каждой комнате и на каж- дом этаже. Возможная прикладная модель этого схематического двумерного мира состоит из объекта «административное здание», который состоит из подобъектов («этаж 1» — «этаж 10») (рис. 2.2). Каждый этаж состоит из ряда подобъектов — обычно комнат. В свою очередь каждая из комнат включает в качестве подобъектов предметы мебели — письменные столы, стулья, книжные шкафы, барьеры- перегородки, перегородки на полную высоту этажа, а также ком- натные растения. Такое разбиение является совершенно произволь- ным, и возможно множество вариантов. Конкретным видом объекта (подобъекта) «комната» в этом иерар- хическом двумерном мире является обычный план помещения, на котором используются двумерные символы предметов мебели, на- зываемые также условными обозначениями (рис. 2.3). Для наших целей мы будем считать, что внешний контур каждой комнаты,
Г лава 2 О О Стол Стул Першробла ’Ух^ барьер | ~| Шкаф О Растение 5 Рис, 2.3. Вид комнаты (план помещения). а — план; б — условные обозначения. включая окна и двери, содержится в структуре данных, ранее за- данной архитектором. Декоратор начинает работу с этой структурой данных и добавляет к ней подобъекты мебели. Другой, еще более простой вид модели (или мира) может представлять собой целый этаж комнат, где каждая из них показана в масштабе, а мебель только перечислена в текстовом виде, а не представлена графиче- скими символами. Отметим, однако, что ни один из этих двух типов символических изображений не похож на подробные и реалистиче- ские трехмерные виды здания, которые архитекторы и подрядчики будут использовать в дополнение к планам этажей. Что же конкретно будет храниться в структуре данных для этого приложения? В распоряжении декоратора должна быть геометрия, т. е. точные размеры каждой комнаты и каждого предмета мебели, а также точное расположение двумерных символов на планах поме- щений. Следует иметь в виду, что в данном конкретном приложе- нии не требуется подробного трехмерного описания реальной мебе- ли. Кроме того, модель должна содержать данные об изготовителях каждого предмета мебели, соответствующие каталожные данные (артикул, цену и другие финансовые сведения, материалы и цвет, сроки поставки и т. д.). Дело в том, что структура данных содержит многие негеометрические свойства объектов, которые непосредст- венно не влияют на их визуальное представление. Эти негеометриче- ские данные используются прикладными программами постобработ- ки для выполнения таких работ, как определение затрат, подготов- ка бланков и перечней, выписка счетов. Декоратор может также пользоваться ими для принятия решений о расстановке мебели с учетом таких вполне вероятных ограничений, как цветовая гармо- ния, цена и сроки поставки. Часть этого текстового материала (на- пример, коды цветов или цена) может быть помещена на символах, изображающих мебель, чтобы обеспечить возможность быстрой ви- зуальной оценки возможных решений. Таким образом, графическая визуализация, которая позволяет получить планы помещений,— это лишь один из многочисленных процессов, которые могут быть выполнены с использованием общей структуры данных.
Основы интерактивного графического программирования чг Необходимость хранения таких различных типов данных, при- вязанных к конкретному приложению, часто требует создания достаточно сложных баз данных с многочисленными связями. Эти данные могут быть закодированы, например, в виде массивов Фортрана, или древовидной структуры записей Паскаля, или же как реляционная база данных. Мы не рассматриваем здесь мето- ды хранения, поиска и обработки для таких структур данных, поскольку эти вопросы, строго говоря, не относятся к машинной графике. Однако следует отметить, что СУБД общего назначения все шире используются для хранения и поиска прикладных гра- фических данных. Прикладной программист может строить модели тремя спосо- бами: 1) в пакетном режиме; 2) как результат предшествующих вы- числений (для рисования графиков — разд. 2.6); 3) (наиболее ин- тересный для нас случай) как результат пошагового процесса по- строения при участии пользователя, который работает в интерак- тивном режиме с прикладной программой и определяет выбор ком- понент и геометрических или негеометрических данных (разд. 2.16). В последнем из перечисленных способов прикладная программа мо- жет особенно успешно использовать специальную моделирующую систему для построения модели и работы с ней, прежде чем описать ее для графической системы. Такие моделирующие системы описа- ны в гл. 9, где моделирование рассмотрено более подробно, в том числе и важный случай — моделирование иерархии объектов и под- объектов (подобно рассмотренному выше примеру для администра- тивного здания). 2.1.2. Описание объектов для графической системы Независимо от того, строится ли модель в интерактивном ре- жиме или же получается как результат из другой программы (в пакетном режиме), пользователь обычно желает иметь визуальное представление или изображение одного или нескольких аспектов модели. Прикладная программа должна описать для графической системы в геометрических понятиях ту часть мира, изображение которой необходимо пользователю. Термин изображение использу- ется ниже достаточно свободно и на одинаковых правах с терминами вид и образ и обозначает как традиционные двумерные и трехмерные геометрические представления, с одной стороны, так и текстовые представления — с другой. Независимо от того, является ли содер- жание структуры данных чисто геометрическим, оно должно быть описано для графической системы в виде выходных графических примитивов (таких, как точки, линии, ломаные или цепочки литер), геометрически ориентированных в двумерном или трехмерном про- странстве. Прикладная программа должна также указать графи- ческой системе, какую часть объекта следует показать и с какой точки зрения, а также на какой части видовой поверхности (т. е.
50 Глава 2 носителя изображения — например, бумаги графопостроителя или экрана ЭЛТ) должно появиться изображение. Почему объекты для графической системы должны быть описаны на уровне графических примитивов нижнего уровня? Потому что в этом случае, вместо того чтобы заставлять пользоваться «стан- дартной» структурой данных, которая может оказаться неэффек- тивной или имеющей слишком много ограничений для данного приложения, мы даем возможность строить модели объектов так, чтобы учитывались особенности данного приложения. Поэтому нашу графическую систему общего назначения нельзя основывать на ка- кой-либо «стандартной» организации структуры данных и мы должны описать для нее зависящую от приложения модель в виде независимых от конкретного приложения универсальных графи- ческих примитивов. Эти примитивы нижнего уровня обычно извле- каются (или образуются) прикладной программой из зависимой от приложения прикладной модели более высокого уровня (кото- рая может быть иерархической). Обычный способ (особенно естественный для трехмерных гра- фических представлений) состоит в том, чтобы рассматривать гра- фическую систему как «воображаемую фотокамеру». Прикладная программа предоставляет воображаемой фотокамере описание сце- ны, состоящей из одного и более объектов в некотором искусствен- ном мире (двумерном или трехмерном). Затем воображаемая каме- ра создает вид объекта (или объектов) в этом мире. Точный вид объекта зависит, безусловно, от того, как была настроена фотока- мера и где она располагалась по отношению к миру и объекту (или объектам). Как при использовании фотоаппарата «Поляроид», сде- ланный снимок сразу же «проявляется» и почти мгновенно готов для показа на видовой поверхности. Видовую поверхность можно рассматривать как «доску сообщений», и, как показано ниже, сни- мок (образ, т. е. конкретный вид одного и более объектов) может иметь разную величину и покрывать либо всю доску сообщений, либо же только некоторую ее часть. Существенное преимущество вообра- жаемой камеры перед обычной состоит в том, что опа не требует фо- кусировки (глубина резкости беспредельна) и ее можно настроить таким образом, чтобы получилась не только перспективная, но и аксонометрическая или другие проекции одного и того же объек- та (гл. 8). Отсутствие модельной и структурной информации в графическом пакете означает, что воображаемая камера действует как реальная камера: она может составить снимок сцены только из визуальны-х Элементов самого нижнего уровня и ничего не знает об их организа- ции или структуре. Высокопроизводительные дисплеи, рассмотрен- ные в гл. 10, уже располагают средствами для доступа к определен- ной форме иерархии объектов непосредственно в ходе цикла реге- нерации. В этом частном случае воображаемая камера (или гра- фический пакет) работает с иерархиями объектов как с примитивами.
Основы интерактивного графического программирования 51 2.1.3. Интерактивная работа В процессе изменения или расширения одного и более частично завершенных объектов на экране1’ и модификации их визуальных характеристик интерактивный пользователь обычно имеет дело с видом этих объектов. В простейшем случае пользователь может просто указать, как переместить воображаемую фотокамеру для получения другого вида того же объекта или как изменить некоторые непредставимые визуально атрибуты объекта. Незави- симо от намерений пользователя для сообщения этих намерений прикладной программе должны быть использованы устройства вво- да. Прикладная программа расшифровывает эту информацию, вве- денную пользователем, и применяет ее либо для управления гра- фической системой с целью изменения параметров видовой операции («изменение настройки фотокамеры»), либо для изменения модели в структуре данных. После модификации структуры данных прикладная программа дает команду графической системе вывести отредактированное изображение объекта на экран (если изменялись не только атрибу- ты, которые нельзя увидеть). Пользователь может задать также пере- мещение изображения на экране (аналогично перемещению сним- ка па доске сообщений)2’. И опять-таки сделать это можно только после обработки прикладной программой запроса на ввод и подачи сигнала графической системе на выполнение соответствующего дей- ствия. Интерактивный диалог вида «вывод-»- ввод-* вывод...» между пользователем и прикладной программой составляет суть интерак- тивной графики. Такая последовательная («пинг-понговая») модель взаимодействия между пользователем и ЭВМ в принципе не пред- ставляет затруднений для реализации. Кроме того, некоторые сов- ременные графические системы позволяют параллельно использо- вать несколько устройств ввода (иногда даже речевой ввод-вывод), осуществлять ввод и вывод одновременно, применять разнообразные формы коммуникации, характерные для общения между людьми. Формализация таких «диалогов в свободной форме» (не говоря уже о языках программирования) все еще является предметом исследо- ваний, и в данной книге мы не будем заниматься этим вопросом. В заключение можно сказать, что работа прикладной программы состоит в моделировании и интерпретации данных, вводимых поль- зователем. Графическая система не строит и не изменяет модель ни в самом начале работы, ни в ответ на интерактивные действия пользователя: она, как фотокамера, только делает снимки. Ниже мы рассмотрим возможности программного обеспечения графической системы, которыми реализуется воображаемая фотокамера. 1) Мы пользуемся для краткости термином экран вместо более общего термина видовая поверхность, включающего дисплейные экраны, бумагу графопостроителя или печатающего устройства, микрофильм и т. д. 2’ В гл. 8 показано, что снимок можно поворачивать, увеличивать и уменьшать.
Глава 2 2.2. ПРОСТОЙ ГРАФИЧЕСКИЙ ПАКЕТ » Ознакомимся с основными концепциями интерактивного графиче- ского программирования на примерах, используя для этого простой графический программный пакет общего назначения Мы опишем графическое программирование на языке высокого уровня, неза- висимом от ЭВМ и дисплейного устройства, а не на уровне системы команд конкретного дисплея. Это дает нам возможность говорить об общепринятых концепциях, не вникая в особенности конкрет- ных дисплейных процессоров. Описываемый нами простой графи- ческий пакет (ПГП) во многом аналогичен существующим программ- ным пакетам (например, описанным в работе [203]). Он обеспе- чивает прикладной программе возможность работы с основными графическими устройствами (графопостроителями, интерактивными дисплеями) и управляет аппаратной частью этих устройств. По- скольку ПГП обеспечивает независимость прикладной программы от конкретно имеющихся аппаратных средств, его можно с мини- мальными изменениями использовать при различных конфигура- циях графического оборудования. Следовательно, такой независи- мый от устройства программный пакет повышает мобильность программы и обеспечивает ей удобный интерфейс высокого уровня с любым конкретным дисплейным устройством. Одна и та же при- чина побуждает нас пользоваться графическими пакетами и (вме- сто языков ассемблера) языками высокого уровня: в настоящее время в большинстве случаев эффективность программиста важнее, чем эффективность программы. Аппаратно-зависимый пакет, ис- пользующий преимущества всей мощности специализированного дисплейного процессора, рационально применять только в таких приложениях (например, при имитации полета самолета), которые требуют максимально быстрых изменений изображения в реальном масштабе времени. В связи с этим мы используем в данной книге ПГП, так как он дает хорошее представление о пакетах, обслуживаю- щих дисплеи средней производительности, которые, по нашему мнению, будут преобладать в ближайшем будущем. ПГП представляет собой небольшой, но функционально полный набор независимых от конкретного применения средств для форми- рования произвольных видов двумерных объектов и для обеспе- чения взаимодействия между прикладной программой и пользова- телем Для конкретных областей применения (например, рисова- ние графиков, автоматизация проектирования, картография) легко можно разработать прикладные графические программные пакеты более высокого уровня с использованием средств ПГП. В данной главе мы будем постепенно двигаться от простого к сложному, показывая особенности ПГП и методы графического Начиная с этого раздела, гл. 2 написана на основе работы [31].
Основы интерактивного графического программировала,. программирования путем их использования на ряде специально подобранных примеров. Каждый новый раздел начинается с крат- кого описания задачи, которая затем решается с помощью одной или нескольких программ, рассматриваемых в качестве примеров в данном разделе. Сопровождающие описание рисунки иллюстри- руют графические результаты решения этих задач. Последовательное изложение начинается с разд. 2.3, где объяс- няются основные функции, требуемые для задания двумерных гра- фиков из точек и линий. Разд. 2.4—2.7 посвящены методам полу- чения графических изображений. Разд. 2.8 касается текстовых строк, а разд. 2.9 является кратким изложением методов графического вывода. Разд. 2.10 знакомит с основными приемами и средствами интерактивной работы (подробнее этот вопрос рассматривается в последующих разделах) в контексте простой, но достаточно полной прикладной программы. В данной главе мы ограничиваемся только двумерными линейными рисунками и интерактивными действиями, поскольку большинство проблем и методов интерактивной графики можно проиллюстрировать, не затрагивая таких сложных вопросов, как вывод трехмерных изображений, стирание невидимых поверх- ностей, манипуляции с битовыми картами и т. д. На практике для очень многих графических приложений вполне достаточно набора средств, имеющихся в ПГП. Назначение программных примеров на языке Паскаль состоит в том, чтобы научить хорошему стилю программирования, а также показать программные структуры, которые являются типичными для интерактивной графики. В качестве основного языка програм- мирования был принят Паскаль, поскольку имеющийся в нем широ- кий набор управляющих структур обеспечивает возможность удоб- ного и ясного представления программных примеров [242]. Перевод этих управляющих структур в соответствующие эквиваленты на та- ких языках, как Фортран или Бейсик, не представляет трудностей. Зарезервированные слова языка выделены полужирным шрифтом, названия процедур даны прописным курсивом, а прочие идентифи- каторы, задаваемые программистом,— строчным курсивом. Чтобы максимально упростить примеры, допущены некоторые незначи- тельные отклонения от стандартного Паскаля: не описываются гло- бальные переменные, символические константы и вспомогательные процедуры, массивы передаются как параметры, а не как типы; кроме того, частично используется псевдокод1’. 4 Псевдокодом здесь и в дальнейшем изложении в книге называется замена формализованного текста на Паскале словесным описанием— Прим, перев.
54 Глава 2 2.3. ВЫВОД ГРАФИКОВ Рис. 2.4. Характерные точки гра- фика, обозначенные кре.стиками, со- единены отрезками прямых. 2.3.1. Мировые координаты Машинная графика часто используется для того, чтобы показать простые соотношения между переменными в виде двумерного гра- фика. Такой график обычно состоит из двух осей и различных маркеров (например, точек или крестиков), соединенных отрезками прямых. Маркеры размещаются в точках, располагаемых относи- тельно начала координат, графика в соответствии со значениями данных, которые они представляют. На рис. 2.4 приведен такой график с описательным текстом, включенным в состав изобра- жения1’. Пользуясь принятой выше терминологией, можно ска- зать, что рассмотрению подлежат две независимо существующие ре- альности: объект и его изображе- ние. Объектом в данном случае является график, т. е. абстрактное отношение между двумя перемен- ными; изображение есть геометри- ческое представление этого отноше- ния, подготавливаемое с помощью ПГП как конкретный вид этого объекта. (Несколько видов, полу- ченных по одним и тем же данным для объекта, показаны как раз- личные графики на рис. 2.10.) Мы описываем объекты для ПГП, а он чертит их виды в соответствии с заданными нами параметрами ви- довой операции. Чтобы получить график, изоб- раженный на рис. 2.4, приклад- ная программа должна описать для ПГП различные выходные при- митивы (точки, линии и цепочки литер), указав их положение и размеры в прямоугольной системе координат. Эти координаты по своей природе являются безразмерными, поэтому прикладная про- грамма может задавать объекты в единицах, которые являются есте- ственными для данного приложения и для пользователя. Так, на- пример, инженеру-акустику может потребовался вычертить график уровня звука в децибелах при времени в секундах, тогда как пред- принимателю может быть интересен график прибыли в долларах по отношению к количеству произведенных изделий в тысячах. Эти 1’ Квадратная рамка на рис. 2.4 представляет границу видовой поверхности, на которую выводится изображение; она не является частью самого изображения. Эта граница изображается только на тех рисунках, где визуальный вывод показан так, как он должен выглядеть на экране.
Основы интерактивного графического программирования 55 прикладные (или ориентированные на пользователя) координаты называются координатами пользователя. Поскольку они позволяют задавать объекты в двумерном или трехмерном мире пользователя, их называют также мировыми координатами. Таким образом, объек- ты могут быть заданы в мировой системе координат (или в миро- вом координатном пространстве) как для их хранения в приклад- ной модели, так и с целью их описания для ПГП. Для удобства мы будем использовать представление мировых координат с плавающей точкой. После того как объекты описаны для ПГП в виде совокупности выходных примитивов, ПГП формирует изображение объектов на экране, отображая независимые от устройства мировые координаты на координаты, зависящие от устройства и используемые аппарат- ной частью дисплейного процессора. В следующих подразделах разд. 2.3 показано, как можно описать объекты для ПГП в виде выходных примитивов в мировых координатах, которые ПГП затем отображает на экран с помощью задания окна (WINDOW), о чем рассказано в разд. 2.4. 2.3.2. Линии и точки Многие графические устройства строят видимое изображение, перемещая пишущий узел или чертежный орган (например, элек- тронный луч ЭЛТ или перо графопостроителя) по поверхности вывода (экрану). После вычерчивания каждого графического эле- мента корректируется так называемое текущее положение пера — оно соответствует текущему месту пишущего узла на видовой по- верхности в координатном пространстве устройства. ПГП имеет аналогичную конструкцию, называемую текущим положением (ТП): ТП принимает значения, соответствующие текущему месту воображаемого пишущего органа в мировом координатном про- странстве. Каждый выходной примитив влияет определенным обра- зом на значение ТП. Иначе говоря, прикладная программа берет геометрическую информацию из структуры данных и вычерчивает соответствующий объект, задавая положение каждой точки или ли- теры и начало и конец каждой линии (отрезка прямой) как ТП в мировых координатах. Аналогом такого процесса задания может служить определение координат точек воображаемого каркасного объекта, расположен- ного в мировом координатном пространстве, с помощью кодирую- щего устройства путем перемещения его курсора по каждой линии и нажатия кнопки съема координат в конечной точке каждого отрез- ка (поскольку ТП переходит от одной конечной точки к другой). Основная цель при задании примитивов в неявном виде с помощью ТП состоит в том, чтобы уменьшить количество аргументов, необ- ходимых при обращении к каждой из процедур вывода примитивов; не требуется в явном виде задавать начальную точку при каждом
□о Глава 2 обращении для черчения таких примитивов, как отрезок или цепочка литер, поскольку эта точка определена результатом предыдущего обращения. Для установки ТП в мировом координатном пространстве без задания выходного примитива можно использовать обращение к процедуре: MOVE_ABS_2(10.0, 10.0) Модификатор ABS обозначает абсолютное перемещение ТП в отличие от относительного (REL) перемещения, рассматриваемого ниже. Модификатор 2 обозначает, что данный примитив является двумерным. Для задания линии от ТП, т. е. от точки, из которой начинается линия, до точки, в которой она заканчивается, с пря- моугольными координатами (12.0, 3.5), прикладная программа долж- на использовать следующее обращение к процедуре: LINE-ABS_2(12.0, 3.5) В этом обращении к процедуре LINE 1) после предшествующего обращения к процедуре MOVE задается отрезок от точки (10.0, 10.0) к точке (12.0, 3.5). Соответственно выполненная после процедуры MOVE серия обращений к процедуре LINE позволяет получить последовательность соединенных между собой отрезков. Последова- тельность несоединенных отрезков получается, если чередовать обращения к процедуре MOVE с последующими обращениями к процедуре LINE. Оси, показанные на рис. 2.5, могут быть заданы следующими командами на рисование примитивов: M0VE-ABS-2(—15.0, 0.0); LINE _ДВ5_2(15.0, 0.0); {задание оси х} М01/£_ЛВ5_2(0.0, —6.0); LINE -ABS_2(0.0, 6.0); {задание оси г/} Оси, показанные здесь, для простоты не имеют обычных мар- керов, например « »или «х», хотя на практике такими средствами обычно пользуются; рисование литер рассматривается в разд. 2.8. Следует также иметь в виду, что значения (х, у) мировых координат по концам отрезков показаны на рисунке только для пояснения и обращения к ПГП, приведенные выше, не задают текста или оциф- ровки линий осей. Наконец, рис. 2.5 является лишь символическим представлением простого абстрактного объекта в двумерной миро- вой системе координат, а не чертежом, который был бы конкретным видом этого объекта, сформированным ПГП. Для перемещения ТП и последующего задания отдельной точки (обозначенной, например, заранее определенным маркером «») J) Ниже показано, что для формирования отрезков прямых используются четыре различные процедуры. Говоря о классе процедур рисования линий вообще, мы пишем просто LINE, а не LINE-ABS-2 и т. д. Такое же соглашение приня- то для процедур MOVE и POINT.
Основы интерактивного графического программирования (0.0,6.0) (-15.0,0.0) (15.0,0.0)' (0.0, -6.0) Рис. 2.5. Оси, вычерченные с помощью обращений к процедурам MOVE и LINE. в новом ТП можно воспользоваться вызовом: POINT_ABS_2(12.0, 3.5) До сих пор мы пользовались так называемыми абсолютными координатами: они задают абсолютную позицию в мировой систе- ме координат. Точка или две конечные точки отрезка могут быть также заданы в виде перемещений в мировых координатах от те- кущего положения. Эти значения перемещений называются отно- сительными координатами и могут быть заданы путем вызова та- ких процедур ПГП, как M0VE_REL_2, LINE_REL_2 и POI NT_REL_2. Относительные координаты удобны, например, для таких объектов, как столбчатые диафрагмы или гистограммы, в которых одна или обе координаты изменяются на постоянную ве- личину. Приведенная ниже процедура использует относительные координаты для задания осей определенной длины, проведенных через точку (хО, z/0): procedure AXES(x0, у0, delta_x, delta_у)\ {задать линии от (хО— delta_x) до (xO-pdelta_x) и от (уО — delta_y) до (г/ОД- delta „у). Результирующим объектом является пара осей, проходящих в мировых координатах через точку (хО, у0).} begin MOVE-ABS_2(xO — delta_x, у0)-, {левый конец оси х) LINE_REL_2(2 * delta_x, 0.0); {задать ось х} MOVE _REL_2(— delta _х, —delta—у)-, {нижний конец оси у} LINE _REL_2(0.0, 2 * delta^y); {задать ось у} end Таким образом, рис. 2.5 можно было бы задать приведенным ниже вызовом процедуры, в котором начало координат в мировой системе есть (0.0, 0.0): AXES (0.0, 0.0, 15.0, 6.0) Вызов процедуры AXES (5.0, 10.0, 15.0, 6.0) соответствует размещению начала в точке (5.0, 10.0).
58 Глава 2 2.4. ОКНА И ОТСЕЧЕНИЕ Черчение графиков является примером того, каким образом процедуры ПГП можно использовать для задания объектов, иллю- стрирующих математические или абстрактные отношения между переменными. Объекты, т. е. графики, задаются в мировой системе координат программиста, а ПГП должен затем преобразовывать мировые координаты в соответствующие координаты физического дисплейного устройства. Для выполнения этого преобразования ПГП должен знать, какая именно часть в принципе неограниченно- го (координаты с плавающей точкой) мирового координатного про- странства содержит информацию, которую пользователь хочет вы- вести в данный момент. Эта прямоугольная область в мировой коор- динатной системе называется окном п. Прикладная программа зада- ет окно, вызывая процедуру WINDOW, аргументы которой указы- вают границы окна по каждой из координатных осей. Общий формат задания окна имеет вид WINDOW (min_x, tnax_x, min_y, max_y) ПГП использует это задание окна для построения отображения, в котором изображение границ окна должно совпадать с рамкой экрана1 2’. Кроме того, прикладной программист может дать ПГП задание на вывод лишь той части объекта, которая «видна», т. е. укладывается в соответствующее окно. Любую часть изображения, не попадающую в окно, ПГП делает невидимой с помощью про- цесса, называемого отсечением: любой примитив, располагающий- ся полностью вне границ окна, не отображается на экран, а при- митив, частично попадающий на экран, отсекается по краю окна перед отображением. Если бы координаты точек, расположенных вне заданного окна, не отсекались, то результат был бы неопреде- ленным. Дело в том, что выводимое изображение было бы различ- ным на разных дисплеях, поскольку разные физические устройства ведут себя неодинаково при получении координат, выходящих за их нормальный диапазон. В большинстве систем результатом явля- ется изображение с неверно вычерченными примитивами в связи с переполнением внутренних координатных регистров. Этот эффект известен как свертывание-, пример показан на рис. 2.6. 1) Это стандартное в машинной графике определение окна, к сожалению, противоречит другому использованию того же термина, встречающемуся в доку- ментации к некоторым экранно-ориентированным текстовым редакторам и растро- вым графическим системам, где оно обозначает область на экране. Мы будем ис- пользовать для экранных областей стандартный термин машинной графики поле вывода (разд. 2.7). 2) Как показано в разд. 2.7, окно не обязательно должно отображаться на весь экран; вместо этого оно может быть отображено на поле вывода, занимающее только часть экрана. Поскольку по умолчанию полем вывода для квадратного экрана является вся видовая поверхность, в последующих описании и примерах подразумевается это общепринятое умолчание.
Основы интерактивного графического программирования 59 а Рис. 2.6. Эффект свертывания при использовании аналогового генератора векторов. а) Треугольник в центре экрана. Стрелки показывают порядок проведения линий: последова- тельность перехода по точкам имеет вид б) Другая последовательность действий в случае, когда указаны координаты, выходящие за пределы экрана по х, а затем по у, что приводит к эффекту свертывания: 1->-2 (приводит к переходу в 2'), 2->3 (приводит к переходу в 3 Каждый выходной примитив, задаваемый прикладной програм- мой, подвергается проверке на три возможных случая: полное раз- мещение внутри окна (такой примитив должен быть полностью вы- веден), пересечение с окном (примитив подвергается отсечению, чтобы выводились только видимые части) или же расположение полностью вне окна (примитив не подлежит выводу). Как показано на рис. 2.7, изменение величины окна относительно размера вы- водимых объектов позволяет осуществлять произвольное масшта- бирование. Прикладная программа может сгенерировать самое крупное изображение всей сцены, задав окно, в которое плотно укладывает- ся множество объектов, образующих сцену (рис. 2.7, а). Окно, размеры которого больше сцены, также позволяет получить ее полное изображение, но это изображение мельче и по бокам у него больше свободного места на экране (рис. 2.7, б). Если задано окно с размерами меньше сцены, происходит отсечение, что позволяет с помощью прикладной программы выдавать часть всей сцены в большем масштабе, чем в предшествующих случаях (рис. 2.7, в). Таким образом, перемещая окно и выбирая большие или меньшие его размеры, мы можем создавать такие кинематографические эф- фекты, как панорамирование, крупный или мелкий план. В прин- ципе можно увеличивать отдельный примитив, пока он не коснется границ, или же уменьшать до тех пор, пока вся сцена не сольется в одну точку. Отметим, что на рис. 2.7, как и в примере с черчением графика, нами использована обычная двумерная иллюстрация, чтобы дать хорошее визуальное представление как об объекте, так и- об окне в системе координат моделируемого мира. Фактически же описание объекта как структурированной совокупности координатных данных хранится в структуре данных модели в некотором пока не описан- ном нами виде, и эти данные не могут быть представлены визуально до тех пор, пока прикладная программа не опишет их для ПГП таким
60 Глава 2 Результирующее изображение Окно и объекты 8 мировой на вибовой поверхности коорЭинатной системе а V 9 Z3IZZL Рис. 2.7. Отображение содержания окна на видовую поверхность. Если необ- ходимо, производится отсечение. Штриховыми стрелками показано соответствие углов окна и видовой поверхности. образом, чтобы он мог изобразить вид этого мира. Оставшаяся часть главы посвящена вопросам доступа к структуре данных и ее изме- нения. Кроме того, нужно учесть, что на рис. 2.7 был использован произвольный масштаб как для мировой, так и для экранной систем координат, и, следовательно, на данный момент мы можем делать только качественные оценки относительно влияния размеров окна на величину получаемого изображения. Очевидно, что увеличение
Основы интерактивного графического программирования 6f ~ обратно пропорционально размерам окна. Простые отношения для определения степени увеличения даны в разд. 4.2.2. Итак, чтобы получить картинку с изображением лишь тех ча- стей объектов, которые располагаются в некоторой прямоугольной области мирового координатного пространства данного приложения, прикладная программа сначала задает окно для ПГП, т. е. область отсечения и отображения на видовой поверхности. Затем приклад- ная программа описывает для ПГП объекты в мировой системе координат путем вызова функций графических примитивов, таких, как MOVE, POINT и LINE. Даже если не предполагается выпол- нять отсечение, программист должен использовать функцию WINDOW для задания размеров мировой координатной системы, чтобы ПГП мог произвести соответствующее преобразование миро- вых координат в экранные. В противном случае по умолчанию пред- полагается, что окно имеет по осям х и у граничные координаты 0.0 и 1.0. 2.5. СЕГМЕНТАЦИЯ После того как изображение объекта появилось на экране, поль- зователь может выполнять с объектом интерактивные действия для изменения структуры данных (разд. 2.10). Выполнив такие изме- нения, оператор обычно не преминет посмотреть модифицированный вид полученного объекта (или объектов). Например, оператор, стерев одну из точек на графике функции или один из стульев на плане комнаты, возможно, пожелает увидеть соответствующим обра- зом измененные график или план. Один из возможных методов полу- чения нового вида состоит в том, что прикладная программа вновь полностью описывает для ПГП измененный объект, хотя измени- лась лишь его часть. Однако такой примитивный подход весьма расточителен в связи с большими затратами времени на вычисления при отсечении и преобразовании мировых координат в систему коор- динат устройства (гл. 4). Очевидно, предпочтительнее дать пользова- телю возможность произвести избирательное изменение структуры данных, что приведет лишь к соответствующим избирательным изменениям картинки. Принцип избирательного изменения используется, конечно, в неграфических программах и структурах данных. Например, стандартный способ предотвращения перетрансляции всей про- граммы, когда изменена лишь ее часть, состоит в разбиении програм- мы на независимо транслируемые модули. Их можно транслировать отдельно и включать в готовую программу (или исключать из нее) при загрузке (и даже при выполнении), что позволяет легко и бы- стро корректировать программу. Тот же принцип можно использовать для решения нашей зада- чи избирательного редактирования структуры. Для этого описание
62 Глава 2 объекта разбивается на сегменты, которые выводятся независимо. Эти выходные сегменты представляют собой логически связанные совокупности выходных примитивов, заменяемые как единое целое. Можно дать приказ ПГП на избирательное стирание всего сегмента или на добавление сегмента, содержащего новую часть объекта, к текущему изображению на дисплее, причем при выполнении таких операций ПГП не производит повторную обработку той части сце- ны, которая не подвергалась изменениям. Сегменты особенно по- лезны и эффективны для динамической графики на векторных дис- плеях с регенерацией (гл. 4). Какие правила используются при сегментации? Прикладной программист должен разрабатывать программу так, чтобы форми-, руемые ею сегменты были естественными для пользователя. Напри- мер, сегменты могут содержать отдельные точки для точечного гра- фика, если требуется, заменять точки, или йодобъекты нижнего уровня (например, предметы мебели в модели административного здания), если нужно обеспечить возможность их перемещения. Обычно «объект-атом» нижнего уровня в иерархии объектов зада- ется как отдельный сегмент. Таким образом, программа описывает объект для ПГП, форми- руя один или несколько сегментов с индивидуальными именами. Для каждого последующего сегмента ПГП генерирует описанные выходные примитивы, а затем закрывает сегмент, когда приклад- ной программист задает CLOSE-SEGMENT, т. е. для каждого сегмента прикладная программа выполняет следующую последова- тельность действий: CREATE SEGMENT\uMn_ сегмен та); <обращения к AfOVf, L/NE и т. д.> CLOSE-SEGMENT Используемую здесь логику можно сравнить с логикой при от- крытии, записи и закрытии дисковых файлов. После выполнения обращения CREATESEGMENT (создать сегмент) текущий сег- мент считается открытым, и он должен быть закрыт до повторного вызова CREATESEGMENT. (В отличие от дисковых файлов в любой момент времени может существовать лишь один открытый сегмент.) Первое обращение к CREATESEGMENT после ини- циализации устанавливает ТП в начало мировой координатной системы. Поскольку ТП есть глобальная переменная для ПГП, на нее воздействует последовательно каждый примитив в каждом сегменте. Удаление сегментов и использование нескольких сегментов опи- сываются в следующих разделах. Например (опять-таки в отличие от дисковых файлов), сформированные ранее сегменты для ПГП нельзя вновь открыть и модифицировать. Как показано ниже в
Основы интерактивного графического программирования 63 данной главе, вместо этого программист должен удалить и повторно сформировать сегмент. (Причиной недопустимости редактирования сегмента является сложность и высокая стоимость создания аппарат- но-независимых средств для редактирования сегмента. Этот вопрос кратко рассмотрен в гл. 9.) В связи с этим соответствующее обра- щение к процедуре названо CREATE.SEGMENT («создать сег- мент»), а не OPEN .SEGMENT («открыть сегмент»). На данной стадии изложения достаточно сказать, что все выходные примити- вы помещаются в текущий открытый сегмент. В качестве имен сегментов для ПГП используются целые числа. Это сделано по нескольким соображениям. Во-первых, обычно этими именами пользуется только прикладная программа, а сам пользо- ватель их не присваивает и не работает с ними. Поэтому нет необ- ходимости в том, чтобы они имели более общую форму (внешних) цепочек литер, использование которых неэффективно как по вре- мени, так и по памяти, посколь- ку их необходимо переводить во внутреннее представление. Во-вто- рых, как показано в разд. 2.11, целочисленные имена часто удобны тем, что они обеспечивают соот- ветствие между адресами объектов и подобъектов структуры данных и соответствующими сегментами. 2.6. ПРОСТОЙ ГРАФИК Рис. 2.8. Простой график внешне- торгового баланса по месяцам. Предположим, что мы имеем данные о платежном балансе США (в миллиардах долларов) за каж- дый месяц с октября 1980 г. по сентябрь 1981 г. (т. е. за 1980 финансовый год) и хотим вычертить график платежного баланса по времени (в месяцах). Определим процедуру PLOT.DATA (пример 2.1), которая будет получать три параметра — два массива (х и у) и их размер (п). Мы будем пересы- лать координаты х в массив месяцы (1..12), начинающийся с октября 1980 г.1’ Таким образом, октябрь представлен как месяцы [1] : = 1.0, ноябрь — как месяцы [2]:=2.0 и т. д. Допустим, что мы будем хра- нить значение положительного или отрицательного баланса плате- 11 Хотя такое явное хранение значений месяца кажется ненужным, оно поз- воляет нам использовать процедуру PLOT-DATA как некоторую рисующую подпрограмму общего назначения, получающую два массива данных (в данном случае размером 100) в качестве входных параметров. В процедуре на стандартном Паскале передаваемые типы массивов также должны иметь размер 100, что требует копирования существующих массивов. Параметр п используется для ограничения просмотра массива той его частью, где фактически имеются данные.
64 Глава 2 жей за каждый месяц финансового года в массиве балплат_198(. {1..12I. Известно, что значения в массиве являются числами с плава' ющей точкой в диапазоне, например, от —5.0 до +5.0. Простое гра4 фическое представление (например, такое, какое показано над рис. 2.8) этих (чисто фиктивных!) данных можно получить с помощью] следующего фрагмента программы: ] . • ’ begin i WINDOW^—5.0, 15.0, —10.0, 10.0); {окно 20X20} ) CRE А ТЕ _ SE GMEN 7(1); PLOT-DAT А(месяцы, балплат-1980, 12); {генерация графика} CLOSE-SEGMENT end где PLOT-DATA есть процедура следующего вида: Пример 2.1. procedure PLOT-DATA(x, у. array[l.. 100] of real, {максимальный массив} п: integer); {фактическое число зна- чений} {эта процедура рисует график через п заданных точек, координаты которых содержатся в массивах х и у} var й integer; begin {сначала задать оси процедурой AXES из разд. 2.3.2, затем линии} XX£S(0.0, 0.0, 15.0, 6.0); MOVE-ABS-2(x[l], z/[l]); for i: = 2 to n do LINE-ABS-2(x[i], y[i]) end; {процедура PLOT-DATA} Следует отметить, что при заданном окне отсечению была подверг- нута только ось х, но не данные для графика. 2.7. ПОЛЯ ВЫВОДА Поле вывода (viewport) представляет собой прямоугольную часть экрана, на которую отображается окно и, следовательно, все, что в нем содержится. В приведенных выше примерах поле вы- вода имеет по умолчанию вид квадрата, равного экрану. Однако часто желательно отобразить окно на некоторую часть экрана, не соответствующую полю вывода, принятому по умолчанию. На рис. 2.9 показан общий случай отображения окна на поле вывода, включая отсечение. Процессы отсечения и отображения окна на по- ле вывода называются видовой операцией-, их реализация рассмат- ривается в гл. 4. Прикладная программа может задать поле вывода с помощью имеющейся в ПГП процедуры VIEWPORT _2. Как и при задании WINDOW, в данный момент может существовать только одно поле вывода. Обращение к процедуре VIEWPORT_2 имеет вид VIEWPORT _2 (min_x, тах-х, min_y, тах_у)
Основы интерактивного графического программирования 65 Рис. 2.9. Отображение окна (в мировых координатах) на поле вывода (в нормиро- ванных координатах) с выполнением отсечения. Поскольку задание окна должно выполняться независимо от конкретного устройства, используемого для вывода изображения, необходимо определить логическую систему координат, которая представляет экран способом, не зависящим от устройства. Условим- ся, что такая система координат описывает видовую поверхность логического устройства вывода, нормированные координаты (НК) которого являются действительными числами от 0 до 1 как по х, так и по у, причем начало расположено в левом нижнем углу видо- вой поверхности. Следовательно, для ПГП все устройства содержат квадратную видовую поверхность размером 1X1 — обычно макси- мальную квадратную область, которая может на них уместиться. Для отличных от квадрата физических видовых областей это озна- чает, что не вся видовая поверхность доступна программисту — раз- работчику ПГП; недоступные участки могут использоваться в ПГП для системных сообщений и диагностики ошибок, для имитации уст- ройств ввода и т. д.п (гл. 4). Поскольку углы окна отображаются на соответствующие углы области вывода, начало мировых коорди- нат пространства обычно не отображается на экранное начало ко- ординат в левом нижнем углу нормированного координатного прост- ранства. Процедура VIEWPORT _2 используется для задания поля вы- вода как части двумерного НК-пространства, заданного значениями х и у для углов. (В гл. 8 показана также целесообразность трехмер- ного НК-пространства и описана процедура VIEWPORT-3.) Предположим, что мы хотим разделить экран на четыре квадранта и вычертить в каждом из них собственный график. Это можно сде- лать путем задания четырех последовательных пар «окно — поле вывода», за каждой из которых следуют соответствующие графиче- Это ограничение можно ослабить путем привязки к конкретному устройст- ву, чтобы для устройств с отличной от квадрата областью использовать неквадрат- ное нормированное коордииатиое пространство.
66 Глава 2 Рис. 2.10а. Поле вывода в левом верх- Рис. 2.-106. Четыре сегмента в четы- нем "квадранте видовой поверхности. рех полях вывода. ские данные. Так, поле вывода в левом верхнем квадранте экрана задается вызовом процедуры VIEWPORT _2(Q.Q, 0.5, 0.5, 1.0) Если поместить это обращение непосредственно за обращением к WINDOW в разд. 2.6, то будет выведен подвергнутый отсечению 10 а. Изображение, показанное на рис. 2.10 6, может быть получено затем путем изменения задания поля вывода (так, чтобы оно по- следовательно соответствовало каж- дому из трех остальных квадран- тов), получения данных для каждо- го из трех новых графиков и гене- рирования по ним отдельных сег- ментов с помощью процедуры PLOT _DATA. Отметим, что окна и поля вы- вода, использованные для генера- ции графиков на рис. 2.9, 2.10 а и 2.10 6, являются квадратами. Если отношения сторон (отноше- ние ширины к высоте) окна и поля вывода различны, то отображение Рис. 2.11. Окно и поле вывода с ра- зличными отношениями сторон. мировых координат на нормиро- ванные координаты приводит к получению разномасштабного изоб- ражения, которое по одной из осей сжато. Например, отметим, что графики на рис. 2.11 (платежный баланс за два последовательных года) сжаты по оси у и растянуты по оси х по сравнению с приведен- ными на рис. 2.10 б. Различие масштабов, получаемое в результате
Основы интерактивного графического программирования 67 отображения окна на поле вывода, может быть использовано для сглаживания несущественных различий путем сжатия имеющих- ся данных по одной оси или для усиления подробностей путем уве- личения длины оси. Отметим, что в приведенной ниже программе (по которой по- лучен рис. 2.11) для обоих сегментов 1 и 2 задано одно окно; оно будет оставаться в силе до тех пор, пока не будет задано новое ок- но. При этом изменяется только задание поля вывода. Для пра- вильного использования механизма «окно — поле вывода» важно понимать, что изменение того или иного задания не приводит авто- матически к генерации нового вида (подобно тому, как новая наст- ройка фотокамеры не позволяет получить новый снимок). Для полу- чения каждого нового изображения прикладная программа должна пройти по соответствующей модели (или ее части).и описать ее (впер- вые или повторно) для ПГП; и тогда ПГП подготовит «снимок» в со- ответствии с последним заданным видовым преобразованием «окно — поле вывода». Так, для каждого графика на рис. 2.11 потребовал- ся отдельный проход по модели с помощью процедуры PLOT. DATA: begin W1NDOW(—5.0. 15.0, —10.0, 10.0); {квадратное окно} W1EWP0RT-2(0.0, 1.0, 0.5, 1.0); {верхняя прямоугольная половина} CR ЕА ТЕ_ SEGMEN Т( 1); РЕОТ_1)АТА(месяцы, балплат_1980, 12); CLOSE-SEGMENT-, WlEWPORT-2(0.0, 1.0, 0.0, 0.5); {нижняя прямоугольная половина) CREA ТЕ-SEGMENT®; PLOT-DAT А(месяцы, балплат-1981, 12); CLOSE-SEGMENT end 2.8. ЦЕПОЧКИ ЛИТЕР В большинстве применений требуется выводить не только линии, но и текст, т. е. цепочки литер. Текст может быть необходим для пояснений к графикам и для общения с пользователем. Прикладная программа задает текст, вызывая имеющуюся в ПГП процедуру TEXT. Поскольку левый нижний угол первой литеры из цепочки помещается в ТП, перед вызовом TEXT обычно производится вызов M0VE1}. Например, приведенные ниже операторы означа- ют, что строка ‘ВВОД ДАННЫХ’ должна начинаться в точке с мировыми координатами (0.0, 0.7): MOV£_ABS_2(0.0, 0.7); ТЯХТСВВОД ДАННЫХ’) 11 В Core обращение к TEXT содержит начало (х, у) цепочки литер в явном виде.
68 Глава 2 Программист — разработчик ПГП не может управлять разме- рами литер и их шагом. Это ограничение обусловлено тем, что ПГП с целью повышения эффективности должен, если есть такая возмож- ность, обращаться к аппаратному генератору литер для выдачи це- почек из таких литер, которые допустимы в данном дисплее (гл. 3). Многие широко используемые программные пакеты предусматри- вают не только возможности, обеспечиваемые генератором литер, но также задание размеров литер, их шага и других параметров текс- та. Так, например, в Core [203] предполагается генерация отдельных литер из образующих их штрихов (т. е. программное формирование литер) или же точная настройка аппаратного генератора литер. Если программисту требуется управлять в ПГП размерами и шагом литер, необходимо специальное программное обеспечение для фор- мирования литер из отдельных штрихов. В растровых системах каж- дая литера может быть задана в виде массива пикселов (гл. 11), которые можно копировать по месту в битовую карту с учетом за- данного шага между литерами и расстояния между словами. Чтобы показать, как используется текст для нанесения над- писей на график, добавим надпись в примере 2.1 (рис. 2.8) для полу- чения изображения, подобного приведенному на рис. 2.4. Главная программа при этом изменится следующим образом: begin WINDOW(—5.0, 15.0, —10.0. 10.0); CREATE-SEGMENT^)-, PLOT-DATА(месяцы, балплат-1980, 12, ’x1); MOVE-ABS_2(5.5, 8.5); ТЕХГ('Ва1апсе’); MOVE-ABS_2(8.0, 7.0); TEXT(‘ot'); MOVE-ABS-2(5.0, 5.5); TEXT (‘Payments’); 4,0); TEXT(‘ (FY80)’); CLOSE-SEGMENT end Отметим, что в процедуру PLOT _DAT А также потребовалось добавить четвертый параметр — литеру маркера, вычерчиваемую в каждой точке, для которой существуют данные: procedure PLOT-DATA(x, у: arrayfl... 100] of real; n: integer; литера: char); var i: integer; begin {задание осей и линий как и ранее, но с добавлением маркера} AXES(0,0, 0.0, 15.0, 6.0); ЛЮГ4Е,_Я55_2(х[1], у[1]); {первая точка данных} ТЕХТ(литера)\
Основы интерактивного гра ического п г аммиррвопия -- for i: = 2 to п do {остальные точки данных} begin LlNE-ABS_2(x[i], TEXT (литера) end end; {PLOT-DATA} 2.9. ВОЗМОЖНОСТИ ПГП ПРИ ФОРМИРОВАНИИ ИЗОБРАЖЕНИЙ Мы видели, каким образом программист может формировать изоб- ражения (т. е. совокупность образов на экране) из двумерных объек- тов, составленных из точек, отрезков прямых и цепочек литер. Эти выходные примитивы объединяются в сегменты, представляющие собой элементарную единицу при изменении объекта и изображения. Программист может указывать, какие части объекта в мировом ко- ординатном пространстве должны быть выведены (с помощью окон) и где в нормированном координатном пространстве экрана должны появляться образы (с помощью полей вывода). В совокупности зада- ние окна и поля вывода представляет собой задание видовой операции и соответствует заданию параметров для настройки воображаемой фотокамеры в ПГП и указанию о том, где именно на «доске сообще- ний» должен быть помещен снимок и каков должен быть его размер. Этих средств вполне достаточно для многих приложений, где требуется только вывод изображения, однако они не исчерпывают всех возможностей машинной графики. В следующих разделах опи- сываются имеющиеся в ПГП средства ввода; показано, каким обра- зом ПГП можно использовать в интерактивной среде, а также бо- лее подробно рассматривается и иллюстрируется роль сегментов. 2.10. ИНТЕРАКТИВНАЯ ГРАФИЧЕСКАЯ ПРОГРАММА РАЗМЕЩЕНИЯ СИМВОЛОВ Ниже описаны возможности ПГП при вводе информации на при- мере приложения, требующего взаимодействия с моделью. Взятая в качестве примера программа дает возможность пользователю сфор- мировать модель и ее изображение, составленное из готовых сим- волов. Такая программа может быть полезна для рассмотренного выше примера с размещением мебели в кабинете или же при разра- ботке печатной платы, наконец, в любом применении, где двумерную схему можно скомпоновать в интерактивном режиме из готовых сос- тавных частей. Символы, используемые в примере вывода,— те же, что и на рис. 2.3, где показано размещение мебели, однако они выб- раны произвольно, и в других приложениях их легко заменить;
лава £ таким образом, программу можно легко приспособить к новому при-1 ложению, не изменяя ее структуры1’. Чтобы взятая в качестве примера программа размещения сим-; волов была как можно проще, мы опустили (или не показали) мно-! гие детали, которые необходимы на практике. Например, в данном приложении каждый символ может размещаться отдельно на плане ’ комнаты и поворачиваться относительно собственного центра (это позволяет не хранить многочисленные копии символов для каждой возможной ориентации). Однако программа, например, не проверяет случаев, когда два символа «пересекаются» на изображении (т. е. занимают одно и то же место) или же когда пересекаются символ и границы помещения. Поэтому пользователь должен сам произво- дить проверку на пересечение, следя за экраном при перемещении и повороте символов. Программа размещения (LAYOUT) символов поддерживает структуру данных, где хранится текущее состояние размещения символов. При практической реализации эта структура должна хра- ниться во внешней памяти, однако здесь мы не будем рассматривать соответствующие функции для засылки и поиска данных. Програм- ма размещения символов обеспечивает пользователю следующие возможности: генерацию изображения модели, описанной текущей структурой данных; задание надписи на изображении; добавление символов к структуре данных и, следовательно, к изображению; удаление символов из структуры данных и, следовательно, из изображения; указание (путем задания нового окна в мировых координатах) того, какая именно часть комнаты должна быть показана на экране. 2.11. ГЕНЕРАЦИЯ ИЗОБРАЖЕНИЯ ПО СТРУКТУРЕ ДАННЫХ Прежде чем описывать интерактивные характеристики ПГП (разд. 2.12—2.14), мы приведем ту часть программного примера, которая осуществляет вывод. Структура данных для программы очень проста: она представляет собой массив записей, каждая из которых соответствует одному символу, находящемуся в структуре данных. Каждая запись состоит из четырех элементов: кода, указы- вающего тип символа; положения этого символа в мировых коор- динатах (х, г/); поворота символа в этом положении (х, у), заданного 11 Описываются только основные подпрограммы. Инициализация, задание меню и прочие служебные подробности для краткости опущены. Полный текст программы можно получить у авторов, обратившись к иим письменно.
Основы интерактивного графического программирования 71 углом. Отметим, что в случае использования с той же целью таких языков, как Фортран или Бейсик, для четырех различных видов элементов данных потребовались бы четыре параллельных массива. Если же программирование ведется на Паскале, то для задания ос- новных необходимых элементов структуры данных можно исполь- зовать следующие декларации: символы: array[ 1. .макссимвол} of record код: integer; (идентификатор символа; О свободно} х, у: real; {положение символа} theta: real {ориентация символа} end; заголовок: packed array [1..80] of char; {цепочка литер для заголовка, заданного пользователем} Процедура для генерации изображения по структуре данных может быть реализована так, как показано ниже. Следует обратить внимание на естественность разбиения программы на модули: глав- ный цикл программы выполняет только обращение к подпрограмме «вывести п-й символ», которая в свою очередь проверяет правиль- ность символа, а затем обращается к соответствующей подпрограм- ме генерации символа. Чтобы не усложнять приведенную ниже программу подробностя- ми, связанными с управлением неиспользуемыми (или же использо- ванными, но затем освобожденными) элементами структуры данных, мы допустим, что процедура DISPLAY-SYMBOL, вызываемая из DISPLAY_D_STR п (пример 2.2), просматривает последова- тельно символы в массиве при генерации изображения. Правильный код записи (в диапазоне 1—6) показывает, что элемент структуры содержит символ, подлежащий выводу. Значение 0 в поле кода пред- ставляет собой флаг «мусора», обозначающий, что данный элемент структуры свободен и может быть использован вновь. Оператор with, использованный в примере 2.2 (процедура DISPLAY_SYMBOL), позволяет использовать поля массива за- писей символы Ii], не выписывая их «полных» имен. Другими словами, он обеспечивает контекст идентификаторов, и, таким образом, до- пускается короткая ссылка на код, заменяющая полное имя сим- волы [Дкод; то же относится к ссылкам на х, у и theta. Мы используем имеющуюся в ПГП процедуру SEGMENT- EXISTS («сегмент существует») внутри ОISPLAY _D _STR, чтобы проверить, существует ли сегмент, т. е. был ли он ранее сге- нерирован ПГП (он не существует, конечно, при первой генера- ции), и уничтожить его до регенерации, если он уже существует. Мы должны выполнять эту проверку всякий раз при регенерации сим- вола, поскольку удаление несуществующего сегмента есть ошибка для ПГП (что произошло бы при первой генерации сегмента). Каж- Х) Display data structure — вывод структуры данных.— Прим, перев.
72 Глава 2 Абсолютной координаты । преобразованные в относительные стул _ к стул _ у 4 0 4 0 80 00 00 40 20 3 5 40 00 20 3 5 00 4 0 Рис. 2.12. Стул, описанный в относительных координатах (а), повернутый на 45° (б) и затем перемещенный в позицию хс, ус (в). дый символ генерируется как отдельный сегмент, и для этой цели зарезервированы имена символов от 1 до макссимвол — символьной константы, определенной в другом месте. Таким образом, имя сег- мента есть адрес символа в структуре данных (такое отображение оказывается полезным впоследствии). Имеются шесть отдельных процедур, генерирующих физические примитивы для представления символов. Здесь приведена только одна из них (CHAIR). Седьмая процедура описывает границы ком- наты (включая двери и окна, которые в данном применении не яв- ляются перемещаемыми символами). Подпрограмма XFORM 11 * 10 1) Для обеспечения общности XFORM работает с массивами, содержащими 10 вещественных чисел, хотя некоторые процедуры для символов, например, CHAIR, требуют меньшего числа координат. Параметр п указывает фактическое число значений, подвергаемых преобразованию.
Основы интерактивного графического программирования 73 применяет геометрические преобразования ко всем заданным миро- вым координатам шести символов, чтобы получить правильно по- вернутые и перемещенные копии исходных символов. Следовательно, каждое преобразование представляет собой поворот на угол 0° относительно начала системы координат, за которым следует перенос в новое положение (хс, ус) (рис. 2.12). В гл. 7 подробно рассматри- ваются такие геометрические преобразования. Здесь же мы лишь отметим, что все конечные точки отрезков и текстовых цепочек могут быть повернуты на 0° относительно начала с помощью матрицы 2X2: [х1 х/1] = Гхх/] Г c?s«Sin»’l- l » J l sin 9 cos 9 J Отметим, что мы описываем массивы, выдаваемые процедурой XFORM, как выходные параметры var. Пример 2.2. procedure DISPLAY _D_STR-, var i: integer; {индекс массива) {регенерация изображения всей модели путем просмотра всех символов в структуре данных) begin DISPLAY-ROOM: {формирование сегмента границ комнаты) {далее цикл по последовательным элементам в структуре данных) for i: = 1 to макссимвол do begin if SEGMENT _EXISTS(i) then DELETE-SEGMENT^): DISPLAY-SYMBOL(i) end end; {DI SPLAY-D STR} procedure DISPLAY-SYMBOL(id: integer); (регенерация сегмента для символа с именем сегмента, равным адресу id структуры данных) begin with символы [id] do if ((код> = 1) and (код<=6)) then {при допустимом коде формируется сегмент, в противном случае сим- вол игнорируется) begin CREATE-SEGMENT(id); {вызов символа с параметрами х, у, theta из задания символы в структуре данных) case код of 1: CHAIRtx, у, theta): {стул} 2: DESK\x, у, theta)-, {стол} 3: BOORCASE(x, у, theta)-, {шкаф} 4: LOWD/VI DER(x, у, theta)-, {барьер} 5: PARTITION^, у, theta): {перегородка} 6; FLOORPLANT{x, у, theta) {растение} end; {case)
74 Глава 2 CLOSE-SEGMENT end {if} end; {DISPLAY-SYMBOL} procedure CHAlR(xc, ус, уг-повор-. real); {начертить символ стула в позиции (хс, ус) с поворотом на угол уг_повор} var стул-Х-нов, стул-у-нов: array [1...10] of real; begin {предполагается, что точки контура стула заданы в глобальных массивах стул-х, стул_у\ исходные координаты преобразуются в новые, повернутые и перемещенные координаты} XFORM(xc, ус, уг-повор, стул_х, стул-у, стул-Х-нов, стул-у-нов, 7); Йалее описание преобразованных примитивов для ПГП} OVE-АВЗ-2(стул_х_нов((], стул-у-нов)!])-, for i: = 2 to 7 do LI N E-REL -2(стул-Х-Hoe(i\, стул-у-нов[1]) end procedure XFORM(x, y, theta', real; X-cmap, у-стар-. array [1...10] of real; var х-нов, у-нов: array [1...10] of real; n\ integer); {преобразовать X-cmap, у-стар поворотом на theta градусов и переносом в (х, у)} var cos-theta, sin-theta-, real; i: integer; begin cos-theta: — COS(theta)-, sin - theta-. — SI N( theta); for i: = 1 to n do begin x_woe[i]: = x-{-(cos-theta * x-cmap[i] —sin_theta * y-cmap[i]); p-Hoe[i]: = y-j- (sin-theta * у-cmap[i]-{-cos-theta * y-cmap[i]) end end; 2.12. ИНТЕРАКТИВНОЕ ПРОГРАММИРОВАНИЕ 2.12.1. Эргономические факторы Рассмотрев вопросы вывода, мы переходим теперь к интерактив- ному режиму. Разработчик интерактивной программы должен учи- тывать многие обстоятельства, которые не принимаются во внимание при работе над традиционной, неинтерактивной программой. Он должен обращать внимание не только на вопросы ее реализации, нс в основном на качество, точнее на так называемые эргономические (человеческие) факторы при интерактивном взаимодействии челове- ка и программы. Успех или неудача интерактивной программы изме- ряются в одинаковой степени как простотой ее использования, так и ее функциональными возможностями. Вопросы разработки с правильным учетом эргономических факторов рассматриваются более подробно в гл. 6.
Основы интерактивного графического программирования 75 Мы приведем здесь лишь некоторые из основных правил, которые должны соблюдаться при разработке интерактивной программы: 1. Обеспечивать простые и логичные последовательности ин- терактивных действий. 2. Не перегружать пользователя слишком большим количеством возможностей и стилей общения с программой. 3. Обеспечивать подсказку неопытному пользователю на каждой стадии интерактивных действий (но в то же время позволять более опытному пользователю обходиться без подсказки). 4. Соответствующим образом реагировать на действия пользо- вателя, обеспечивая тем самым необходимую обратную связь. 5. Давать возможность пользователю эффективно исправлять ошибки. Во фрагменте программы (пример 2.3) в разд. 2.13 мы пытаемся следовать этим правилам и показать правильный подход к проблеме эргономических факторов. Так, последовательности интерактивных действий в этом примере просты и обычно выполняются с помощью одного интерактивного устройства в данный момент времени (пра- вила 1 и 2). На каждой стадии интерактивной работы прикладная программа выдает сообщения-подсказки для пользователя, указы- вая ему, какие действия могут быть выполнены в данной точке (правило 3). Эти сообщения здесь составлены скорее как напоми- нания опытному пользователю, а не как полные описания для но- вичка. Одним из эффективных способов оказания помощи новичку, для которого данная подсказка оказалась слишком лаконичной, является включение функции HELP («помоги»), которая генери- рует подробные инструкции для пользователя, содержащие сведе- ния о возможных реакциях и допустимых в данный момент дейст- виях. Если подсказка говорит пользователю о вариантах действий, обратная связь имеет место каждый раз после выбора конкретного варианта, но до выдачи следующей подсказки. Надежная обратная связь особенно важна в интерактивной графике, поэтому в нашем примере обратная связь выдается после каждого действия пользо- вателя, чтобы показать, как система интерпретировала действия пользователя (правило 4). Как и в любой графической системе, используются два вида обратной связи. ПГП выдает для каждого интерактивного устройства независимое от применения эхо (первый вид обратной связи), которое является непосредственной реакцией на использование устройства. Так, например, нажатие на одну из литер алфавитно-цифровой клавиатуры приводит к выводу этой литеры, и пользователь может убедиться в ее правильности. ПГП вы- дает по умолчанию эхо для любых устройств ввода. Приведенный ниже пример 2.3 полностью основан на использовании эха, выда- ваемого по умолчанию, поэтому выдача соответствующего эха про- изводится, хотя в программе нет явных операторов такой выдачи. Второй вид обратной связи более высокого уровня, чем эхо, изави-
76 Глава 2 сящий от конкретного применения, характеризует реакцию приклад- ной программы на запрос пользователя. Так например, если пользо- ватель требует, чтобы был удален элемент из модели, представленной структурой данных, то вполне можно ожидать, что изображение этого элемента также будет удалено с экрана. Такая обратная связь находится в ведении прикладного программиста, который исполь- зует ПГП для создания желательного эффекта на экране. Для минимизации эффекта ошибки пользователя (правило 5) в программе предусмотрена команда CANCEL («отменить»), которая дает возможность пользователю прекратить выполнение незавер- шенной функции, а также (во всех тех случаях, когда это имеет смысл) «ликвидировать» результаты последней по времени выполне- ния и полностью завершенной функции. Для простоты пользователь оканчивает все функции одинаково — с помощью команды DONE («выполнено»). Реализация команд HELP, CANCEL и DONE рас- смотрена ниже. Прежде чем подробно изучать интерактивные аспекты нашей программы, мы опишем основные интерактивные средства ПГП, ко- торые в ней используются. 2.12.2. Логические интерактивные устройства Основная цель при разработке средств ввода, входящих в ПГП, как и при разработке программных средств вывода, состоит в том, чтобы обеспечить независимость от конкретных устройств. В связи с этим в ПГП определены логические устройства ввода [482] для связи пользователя с его прикладной программой. В запросах программы на функции ввода задается имя логического устройства, которое ПГП отображает на имеющееся физическое устройство с наиболее близкими характеристиками. Такое отображение логиче- ского устройства на физическое устройство аналогично тому, как операционная система отображает номера логических каналов или имена логических файлов на соответствующие физические уст- ройства для хранения файлов. В качестве устройства ввода исполь- зуются световые перья, планшеты, вращающиеся ручки для переме- щения курсора, диски со шкалой для ввода скалярных величин (по- тенциометры), рычаги и алфавитно-цифровая клавиатура. Более подробно они рассмотрены в гл. 3 и 5. В гл. 1 упомянуты следующие логические устройства ввода, соответствующие одному и более из указанных выше физических устройств: кнопка (устройство для задания выбора); селектор (устройство для указания информации, выведенной на экран); клавиатура (устройство для ввода цепочек литер); валюатор (устройство для генерации величин с плавающей точ- кой); локатор (устройство для задания экранных координат).
Основы интерактивного графического программирования 77 2.12.3 Обработка событий Любая система графического программирования должна пре- доставить прикладной программе возможности для синхронизации действий пользователя с реакциями программы. Интерактивное взаимодействие между программой и пользователем удобно рассмат- ривать как процесс, управляемый событиями, в котором событием является действие, выполненное пользователем с помощью уст- ройств 1). Программа соответствующим образом реагирует на со- бытие, а затем ожидает следующего. Работа с интерактивной про- граммой {диалог пользователя с ЭВМ) состоит, таким образом, из действий пользователя, которые чередуются с «импульсами» счета (обычно очень короткими), возникающими по запросу или действию пользователя. Обычно в диалоге преобладает «время размышления» пользователя, в течение которого программа находится в состоянии ожидания. Следующий фрагмент программы на псевдокоде представляет собой схему типичной интерактивной прикладной программы. Псев- докод используется здесь и ниже вместо принятого в данной книге диалекта Паскаля для простоты, он печатается светлыми строчными литерами без скобок, тогда как комментарии печатаются тем же шрифтом, но в фигурных скобках. Отметим, что производится про- верка допустимости, т. е. полезности действия пользователя в дан- ной точке: инициализация, включая генерацию начальной картинки: repeat WAIT генерируемое пользователем событие; if событийное_устройство = сазе 1 or case 2 or ... then {допуст. действие} case событийное_устройство of case 1: действие 1; case 2; действие 2; end {case} else else-действие until событийным устройством задан выход Обычно действие представляет собой генерацию подсказки для выдачи пользователем следующего параметра как части диалога при заданий команд. Когда команда задана полностью, действие изменяет структуру данных, а следовательно, скорее всего и кар- тинку. Эта общая схема позволяет прикладной программе ожидать од- новременно более чем одно устройство, генерирующее событие; х> Термин событие используется здесь в смысле сгенерированного пользова- телем прерывания, вызывающего изменение состояния системы, т. е. переход из состояния ожидания к действию (а затем обратно к ожиданию). Таким образом, генерация прикладной программой нового изображения, обратной связи или под- сказки не является событием.
78 Глава 2 например, во время набора входной строки программа может также] ожидать кнопок CANCEL и HELP. Такой общий подход требует] достаточно сложной логики декодирования событий и сохранения» состояния (упражнение 2.12). Поэтому в ПГП используется более; простая схема, при которой прикладная программа одновременно может ожидать только одно устройство, генерирующее событие. Когда прикладная программа получает управление после того, как имело место событие, она выполняет оператор case над данными о событии, которые даны этим устройством, генерирующим событие, причем по данным можно определить, какое именно устройство было выбрано пользователем. Эта более простая схема внешне очень сход- на с предыдущей, но оператор case выполняется не для событийного устройства, а для данных о событии: инициализация; repeat; WAIT генерируемое пользователем событие; if данные_о_событии = сазе 1 or case 2 or ... then {допуст. действие} case данные_о_событии of {выполнить соответствующее действие} end {case} until выход Даже в сложных ситуациях оператор case фактически выполня- ется с данными о событии, которые выданы устройством, создающим событие, а не с самим устройством. ПГП может обслуживать следующие устройства, генерирующие событие: логическую Кнопку (обычно реализуемую в виде програм- мируемой функциональной клавиатуры), алфавитно-цифровую кла- виатуру и селектор (обычно реализуемый световым пером или план- шетом для ввода с компаратором). Каждое из этих устройств мо- жет быть активировано программистом путем выполнения через ПГП специальной процедуры WAIT для соответствующего устрой- ства; поступающее от ПГП эхо является для пользователя под- тверждением того, что ввод принят и обрабатывается. Если пользо- ватель активирует генерирующее событие устройство, которое не ожидается (т. е. для которого не выполнена процедура WAIT), то отсутствие соответствующего эха указывает, что ввод с этого уст- ройства игнорируется. Процедура WAIT-BUTTON («жду кнопку») обычно исполь- зуется для выбора фрагмента в программе в ответ на подсказку или для задания общего изменения режима работы прикладной прог- раммы. Вызов процедуры WAIT-BUTTON (время, имя_кнопки) активирует кнопочное устройство, а прикладная программа пере- ходит в ожидание и ждет, что либо окончится заданное время ожи- дания (если пользователь не нажмет на кнопку за интервал в се-
Основы интерактивного графического программирования 79 кундах, равный параметру время), либо же пользователь нажмет на кнопку1*. ПГП получает от аппаратуры информацию о том, какая кнопка была нажата (т. е. соответствующие данные о со- бытии), возвращает идентифицирующий номер кнопки в параметр имя_кнопки и дает возможность прикладной программе возобновить работу, начиная с оператора, следующего за WAIT-BUTTON. При просрочке времени возвращается недопустимый номер кнопки 0. В качестве удобного эха при выборе кнопки можно использовать постоянную или мигающую подсветку выбранной кнопки. Аналогичным образом обращение к процедуре «жду селектор» WAIT .PICK (время, имя_сегмента) вызывает либо просрочку времени, либо же возврат (в качестве данных о событии) имени сегмента, примитив которого был иден- тифицирован пользователем на экране. Удобным эхом в этом случае может быть, например, мерцание указанного примитива или всего сегмента. Процедура WAIT-PICK используется, например, для указания сегмента, подлежащего стиранию; как показано ниже, эту процедуру можно использовать также для идентификации выбора взамен кнопок. Механизмы, используемые в ПГП для соотнесения (корреляции) примитива, указанного пользователем, с именем сег- мента, содержащего примитив, рассмотрены в двух следующих гла- вах. Процедура «жду клавиатуру» WAIT-KEYBOARD (время, текст, длина) позволяет пользователю вводить с клавиатуры литеры до тех пор, пока не произойдет событие — нажатие на клавишу «возврат ка- ретки» (или эквивалентную ей), после чего она возвращает в качест- ве данных о событии цепочку литер (без литеры «возврат каретки») в параметр текст, а ее длину в параметр длина. Удобное эхо в дан- ном случае — выдача вводимых с клавиатуры литер последователь- но в позициях мерцающего курсора в стандартной области ввода текста на экране. 2.13. ПРОГРАММА, ИСПОЛЬЗУЮЩАЯ КНОПКИ ДЛЯ ВЫЗОВА ФУНКЦИЙ Начиная рассказывать об интерактивном программировании, мы сначала приведем предварительную версию (частично на псев- докоде) программы размещения символов для описанного выше применения (пример 2.3). В этой версии главной программы с по- 11 Это описание предполагает существование физической кнопочной клавиа- туры, однако логика будет такой же и в том случае, когда логическое кнопочное устройство имитируется другим физическим устройством (гл. 5).
80 Глава 2 мощью логического кнопочного устройства пользователь указывав® вызываемую функцию. Я Пользователь программы размещения символов может выбратД одну из следующих функций: а задать новый заголовок изображения; ; добавить символ в структуру данных и в изображение; ; удалить символ из структуры данных и из изображения; ; изменить окно для изображения; закончить работу. В данной версии программы каждой из этих функций присвоена! собственная кнопка на кнопочном устройстве. При событии «кнопка»! программа выполняет функцию, относящуюся к соответствующей! нажатой кнопке. j В прикладной программе процедура SETUP («настройка»),! вызываемая главной программой, выполняет все необходимые дейст-1 вия по инициализации. В частности, она читает из внешней памяти * информацию о структуре данных, определяющую комнату, в которой должна быть размещена мебель. Кроме считывания значений в мас- сив символы и в переменную заголовок, определенные в разд. 2.11, процедура SETUP считывает информацию о размерах и форме ком- наты и о размещении окон и дверей. Эта информация используется процедурой DISPLAY _Р00М («вывести комнату» — подробно она здесь не рассматривается) для формирования и вывода сегмента, определяющего границы комнаты (рис. 2.3). Наконец, SETUPS инициализирует четыре глобальные переменные (комн_тт_х, . комн_тах_х, комн_т1п_у, комн_тах_у), определяющие такое окно в мировых координатах, которое описано в точности по гра- ницам комнаты; это самое большое окно, которое можно использо- вать для вывода изображения комнаты. Процедура CLEANUP («очистка») функционально противоположна SETUP. Она выполня- ет все необходимые завершающие действия, включая запись скор- ректированной базы данных во внешнюю память. Интерактивная часть главной программы ожидает (WAIT) на- жатия кнопки, а затем вызывает процедуру нижнего уровня, соот- ветствующую кнопке. Когда пользователь закончил работу, функция возвращается из оператора case в процедуру WAIT. Поэтому в глав- ной программе видна только та часть диалога пользователя, которая относится к верхнему уровню (к так называемой диспетчерской таб- лице), но не видны представляющие больший интерес интерактивные действия, осуществляемые каждой функцией. Если в течение време- ни, заданного символической константой лимит_времени (напри- мер, 5 мин), не происходит событие, работа WAIT завершается по времени, и внимание пользователя привлекается с помощью новой подсказки или путем интенсификации прежней подсказки (напри- мер, с помощью звукового сигнала или другого устройства для при- влечения внимания). Процедура SCREEN-FEEDBACK («эк-
Основы интерактивного графического программирования 81 ранная обратная связь») должна стереть свое сообщение с экрана после краткого ожидания, а затем вернуться на выход из оператора case (см. упражнение 2.15). Пример 2.3 {Программа размещения символов: версия 1 с использованием кнопок для интерактивных действий) program LAYOUT (ввод, вывод)-, описание переменных; begin {инициализация} SETUP-, WINDOW(KOMH-tnin-x, комн - max _х, комн_min-у, комн_тах-у); VIEWPORT-2(0.0, 0.8, 0.0, 0.8); {оставлено место для подсказки) {генерация начального изображения) DI SPLAY-D.STR-, SCREEN-FEEDBACK('Haxarb кнопку для выбора функции’); {главный цикл, управляемый событиями) main-done: = f alse; repeat {ожидание события, генерируемого пользователем) WAIT-BUTTON(лимит-времени, номер_кнопки); И(номер-кнопки)> =0) and (номер-кнопки< =5) then {«легальная» кнопка) case номер-кнопки of 0: SCREEN-FEEDBACK (‘жду вашего выбора функции’); 1: NEW-TITLE-, {новый заголовок) 2: ADD-SYMBOL; {добавить символ) 3: DELETE-SYMBOL-, {стереть символ) 4: CHANGE- VIEW-, {изменить вид) 5: та in-done ~ true {кнопка EXIT) end {case} else SCREEN-FEEDBACK (‘неверный выбор, попробуйте снова’) until main-done-, CLEANUP {прикладная процедура окончена) end. 2.14. МЕНЮ ДЛЯ ВЫЗОВА ФУНКЦИЙ 2.14.1. Световые кнопки Задание функций с помощью кнопок имеет некоторые недостатки. Когда пользователь переносит взгляд с экрана на пульт, где обыч- но расположены кнопки, его внимание отвлекается. Кроме того, обычно функциональные клавиатуры не имеют средств для обозна- чения кнопок, находящихся под контролем программы. Хотя на части экрана можно описать использование каждой кнопки, вни- мание пользователя в этом случае также будет дробиться. Многие пользователи предпочитают выдавать на экран функ- циональное меню, состоящее из световых кнопок, среди которых с помощью селектора можно указать нужную функцию. Обычно меню состоит из последовательности текстовых строк и (или) графиче- ских символов, представляющих имеющиеся функции. На рис. 2.13
82 Глава 2 NEW TITLE ADD SYMBOL DELETE SYMBOL CHANGE VIEW EXIT Рис. 2.13. Меню из текстовых строк, сгенерированное процедурой CREATE-FUNC-MENU- показано типичное меню из текстовых строк. Неудобства использо- вания световых кнопок (они обычно занимают некоторую часть драгоценного экранного пространства) обычно с избытком компен- сируются возможностью выдавать пояснительные надписи к функ- циям, среди которых производится выбор, и быстро заменять одно ме- ню на другое. Для работы с селектором каж- дая строка — световая кнопка за- дается не приводимой здесь про- цедурой CREATE_FU NC.MENU («формирование функционального меню») в собственном сегменте с уникальным именем и выводится в собственное поле вывода. Каждый сегмент содержит абсолютное пе- ремещение MOVE (за которым сле- дует примитив TEXT) и формиру- ется на стадии инициализации в процедуре SETUP. Управляемый событиями цикл также несколько изменяется: вместо WAIT_BUTTON (лимит_времени, номер _кнопки); case номер-кнопки of мы имеем аналогичные операторы вида WAIT_Р1СК (лимит-времени, имя-сегмента) \ case имя _сег мента of Обратите внимание на использование символических констант для обозначения целочисленных имен сегментов в ПГП, соответст- вующих именам функций световых кнопок; они были описаны в про- цедуре CREATE_FUNC-MENU. Теперь цикл repeat until имеет вид repeat {ожидание события, генерируемого пользователем) WAIT-PIСК(лимит_времени, имя-сегмента); if ((имя-сегмента>—new-t) and (имя_сегмента< = exit)) or (имя-сегмента = 0) then case имя-сегмента of 0: SCREEN _F ЕЕОВАСК(‘жлу вашего выбора функции’); new_t: NEW-TITLE', addsim: ADD-SYMBOL; delsym: DELETE-SYMBOL-, chngvw: CHANGE-VIEW-, exit-. main _done- = true {световая кнопка EXIT) end {case} else SCREEN-/’ЕЕИВДСД(‘неверный выбор, попробуйте снова’) until main-done;
Основы интерактивного графического программирования 83 2.14.2. Видимость и невидимость сегментов. Смена меню Изображение, заданное тем или иным сегментом, прикладная программа может сделать видимым или невидимым в любой момент, пока сегмент не уничтожен. Это очень важно для тех частей изобра- жения на экране, которые в течение сеанса работы нужно то вклю- чать, то выключать (например, подсказки и функциональные меню). В качестве примера использования избирательной видимости сегментов обратимся вновь к нашей прикладной программе разме- щения графических символов. Большинство функций этой програм- мы дает возможность пользователю выполнять любое число последо- вательных операций (например, стереть подряд пять символов) до возвращения в главную программу. Поэтому пользователь должен иметь возможность выйти из одной функции для выполнения другой. Аналогичным образом при выполнении большинства функций поль- зователь может отменить или «ликвидировать» частично выполнен- ную операцию, или же потребовать от процедуры HELP более под- робной информации о том, как действовать дальше. Для обеспечения простоты использования эти три команды реализуются единообраз- но с помощью доступного всем функциям глобального меню, содер- жащего DONE, CANCEL и HELP. Поскольку составные части ме- ню должны высвечиваться только в том случае, когда указание на них является допустимым, необходимо обеспечить им избира- тельную видимость. Обычно все необходимые составные части меню, подсказки и сообщения для обратной связи формируются в начале работы программы в виде отдельных сегментов, а затем по мере не- обходимости избирательно высвечиваются. Иногда включение сег- ментов называют «вывешиванием» (posting) по аналогии с вывеши- ванием снимков на доске сообщений, а их выключение — «снятием» (unposting). Обращение к процедуре ПГП для управления видимостью сег- мента имеет вид SET-VISIBILITY (имя_сегмента, on! off) Поскольку предполагается, что большинство вновь сформиро- ванных сегментов сразу же выводится, начальная (неявная) уста- новка видимости, принятая в ПГП, предусматривает их включение (on). Сегменты, содержащие объекты, которые не предполагается сразу же высвечивать (например, подсказки или сообщения, кото- рые могут потребоваться позднее), нужно явно выключить (off). В гл. 4 описано, как реализуется видимость в ПГП. Предположим теперь, что глобальное меню генерируется про- цедурой SETUP и имена сегментов для каждой из трех постоянных команд хранятся в глобальных переменных done, cancel и help. Как и в случае с процедурой CREATE_FUNC_MENU (при фор- мировании меню команд), мы сделаем эти сегменты невидимыми и
84 Глава 2 при необходимости будем их включать. Единственным исключением является команда HELP, имеющая смысл и в главной программе; она высвечивается сразу же, тогда как остальные сегменты остаются невидимыми до выбора соответствующей функции. 2.14.3. Усовершенствованный вариант программы Перечисленные выше средства учтены в усовершенствованной версии главной программы, приведенной в примере 2.4. Кроме того, усовершенствованная программа содержит фрагменты для ге- нерации сообщений-подсказок и для вызова процедуры HELP_ USER, выдающей более подробную подсказку. Процедура HELP_ USER может быть привязана к конкретной программе и ее функ- циям с помощью соответствующего параметра. Более подробно эта процедура не рассматривается; обычно она дает возможность поль- зователю запросить инструкции на нескольких уровнях детализа- ции и по окончании вернуться к предшествующему состоянию. После того как процедура HELP-USER что-то напишет на экране, она должна произвести «прозрачный» возврат, стерев свою информацию и восстановив нужное изображение на экране по структуре данных (упражнение 2.15). Условимся, что процедура SETUP формирует также некоторое число невидимых сегментов, содержащих сообщения-подсказки для главной программы и для пяти пользовательских функций, напри- мер главную подсказку: «Пожалуйста, выберите функцию». Только в том случае, когда в какой-либо из процедур возникает необходи- мость в подсказке, соответствующий сегмент должен стать видимым на экране. Наконец, мы предполагаем, что процедура SETUP вызывает процедуру CREATE_FU NC.MENU с целью формиро- вания функционального меню для программы LAYOUT и формиру- ет глобальное меню, используемое при выборе любой функции, кроме NEW-TITLE и EXIT. Глобальные переменные min_x, тах_х, tnin_y, тах_у пред- ставляют текущее окно в мировых координатах и инициализируют- ся значениями комн_тт_х и т. д., которые задают окно, описанное точно по границе комнаты. Поле вывода для черчения комнаты опре- деляется таким образом, чтобы на экране вокруг него было место, предназначенное для других целей: место над полем вывода исполь- зуется для заголовка изображения, а также для подсказок, а место справа — для меню. Пример 2.4 {Программа размещения символов, усовершенствованная для использования селектора при интерактивной работе} program LAYOUT(ввод, вывод); описание переменных; begin {инициализация}
Основы интерактивного графического программирования 85 min_x: — комн-пип_х; тах-х: — комн-tnax-x; min_y, = комн_тлп-у; max-у: ~комн-тах-у; SETUP; {формирование сегмента функционального меню, подсказок и гло- бального меню DONE, CANCEL, HELP} W!NDOW(min-X, max_x, min_y, max_y); WIEWPORT_2(0.0, 0.8, 0.0, 0.8); DI SPLAY-D-STR; {генерация начального изображения} SET-VISIBILITY(help, on); {надпись HELP стала видима} {главный цикл, управляемый событиями} main-done: — false; repeat {высветить подсказку и функциональное меню и ждать события от поль- зователя} SET _VI SI BI LITY (главна я-подсказка, on); for i: = new-t to exit do SET_VISIBILITY(i, on); WAIT-PICK(лимит-времени, имя_сегмента); {пользователь сделал выбор, поэтому погасить меню н подсказку} SET-VI SI BI LI TY (главная-подсказка, off); for i; = new-t to exit do SET-VISI BI LITY(i, off); it ((имя-сегмента> — new_t) and (имя-сегмента< =help)) or (имя-сегмента = 0) then case имя-сегмента of 0: SCREEN-FEEDBACK('xay выбора функции’)! new-t: NEW-TITLE; addsym: ADD-SYMBOL; delsym; DELETE-SYMBOL; chngvw: CH AN GE-VIEW; exit: main-done: = true; {световая кнопка EXIT} help: HELP-USER (главпрогр); end {case} else SCREEN-FEEDBACKSневерный вывод, попробуйте снова’) until main-done; CLEANUP end. Каждая из процедур для выполнения функции имеет такую жё структуру, как главная программа: begin инициализация; установка видимости (включение) локальных подсказок и элементов меню; восстановление местного флага done; repeat WAIT событие, генерируемое пользователем; if данные о событии в case then {„легальное" действие} case данные о событии of время_вышло: напоминание пользователю; местное_действие_1: местное, действие- i: ...; fte/p: HELP-USER (локальная процедура); done: установить локальный флаг done; cancel; отменить локальное действие (действия); end {case}
86 Глава 2 else подсказка пользователю для новой попытки until done; установка невидимости (выключение) локальных подсказок и элементов меню end; На рис. 2.14 показана полная иерархия модулей (процедур) прикладной программы. До сих пор мы имели дело не более чем с пятью уровнями. Такая декомпозиция модулей полезна для понима- ния структуры прикладной программы. Однако она не позволяет проследить за протоколом интерактивного взаимодействия пользо- вателя с ЭВМ. Обычным способом для показа последовательности такого диалога является диаграмма переходов (рис. 2.15). Ее на- зывают также графом конечных состояний, так как она представля- ет поведение конечного автомата (называемого также регулярной или последовательностной машиной). Диаграмма переходов показы- вает состояния программы, которые являются видимыми для поль- зователя, и переходы из одного состояния в другое под влиянием действий пользователя. Из такой диаграммы не видно, какие дейст- вия выполняет программа в ответ на ввод информации пользовате- лем, но она является удобной сводкой допустимых возможностей выбора в каждом из состояний, и из нее видно, к каким состояниям приводят различные кнопки (показанные как пометки на стрелках переходов). Программа находится в состоянии ожидания (WAIT), пока пользователь не выполнит действия для перехода в другое состояние. Отметим, что такие внутренние процедуры, как SETUP и CLEANUP (используемые программой LAYOUT для инициализа- ции, вывода сообщений обратной связи и подсказок, а также для очистки при завершении), не изображены на диаграмме переходов, поскольку они не требуют взаимодействия с пользователем. Однако на диаграмме указана просрочка времени (хотя, строго говоря, она и не является событием, вызванным действием пользователя). Это связано с тем, что бездействие пользователя приводит к собы- тию, вызываемому таймером, и к возврату в то же состояние. Пока- заны также локатор и валюатор, хотя они и не являются устройства- ми, генерирующими события, которые вызывают переход в другое состояние. Точная последовательность действий при диалоге станет ясной из рассмотрения отдельных функций в последующих разделах. 2.15. ЗАДАНИЕ ЗАГОЛОВКА Самая простая из функций программы размещения символов дает возможность пользователю задать заголовок для текущего изображения. Приведенный ниже фрагмент программы (пример 2.5) демонстрирует использование логического устройства клавиату- ры для реализации функции NEW_TITLE («новый заголовок»).
Рис. 214. Иерархия модулей для программы LAYOUT. Основы интерактивного графического программирования
88 Глава 2 В процедуре NEW-TITLE предполагается, что существует гло-1 бальная переменная сегмент_заг, содержащая номер того сегмен-1 та, где содержится текущий выводимый заголовок; аналогичным ’ образом, заг_х и заг_у—константы, в которых задается начало! строки заголовка. В процедуре NEW-TITLE нет необходимости использовать команду DONE, поскольку процедура допускает только ввод одного заголовка (а не последовательность операций, как другие функции). Аналогично этому не реализована и команда CANCEL, поскольку можно предположить, что имеющаяся в ПГП подпрограмма клавиа- туры распознает специальные стандартные литеры «стирание лите- ры» (логический шаг назад) и «стирание строки» (логическое удале- ние команды), позволяющие отредактировать строку до ее передачи с помощью (логического) возврата каретки. (А вы, как пользователи, возможно, все же предпочли бы логичность и надежность команды CANCEL?). Процедура NEW-TITLE заменяет сегмент, сначала удаляя старый сегмент заголовка, а затем формируя его вновь с измененным содержанием. Отметим, что просрочка времени на таком уровне ниже главной программы приводит к повторению процедуры WAIT после краткого интервала для привлечения внимания. Сле- довательно, строка должна быть задана пользователем до того, как функция вернется в главную программу. Пример 2.5 procedure NEW-TITLE; {задать новый заголовок изображения) var текст-строка: array [1. ,80] of char; длина: integer; done: boolean; begin done: = false; SET-VISIBILITY(подсказка-заг, on); repeat WА1Т-КЕУВОАЯО(лимит-времени, текст-Строка, длина); if длина = 0 then SCREEN-FEEDBACKC'dipy нового заголовка’); else if текст-строка = ‘help' then HELP-USER(new-t-help) else begin (стереть старый и сформировать новый заголовок) if SEGMENT-EXiSTS(ceeMeHm-eae)then DELETE-SEGM.ENT(cezMeHm-3ae); CR E AT E -SEG MEN T (сегмент-заг); MOVE-ABS-2(заг-х, ваг-у); ТЕХТ(/пекст-строка); CLOSE-SEGMENT; done: = true end until done SET- VI SI BI LI ТУ (подсказка-ваг, off); end; {NEW-TITLE}
Основы интерактивного графического программирования 89 --------->• Переход (Пометка)-*- Со5ытие, ----------> вызывающее Дв^незмисимых (Пометка)-»- перехода. (с§) Символ Возврата каретки Рис. 2.15. Диаграмма переходов для интерактивной работы пользователя с про- граммой LAYOUT.
90 Глава 2 2.16. ДОБАВЛЕНИЕ СИМВОЛА К СТРУКТУРЕ ДАННЫХ Процедура ADD SYMBOL фактически является «сердцем» прикладной программы размещения символов как с точки зрения сложности этой процедуры, так и с точки зрения многочисленности используемых в ней методов графического программирования. Ал- горитм для процедуры ADDSYMBOL может быть представлен следующим фрагментом на псевдокоде (в него не включена проверка правильности указания): высветить меню символов; repeat WAIT событие, генерируемое пользователем; case событие of picksymbol: поместить символ в позицию, указанную пользователем; help: НELP_USER (add-Symbol): done: установить флаг done для возврата в главную программу; cancel: стереть добавленный ранее символ end {case} until done: удалить меню символов В каждом из следующих ниже подразделов мы более подробно рассмотрим отдельные части этого фрагмента на псевдокоде, опи- сывая попутно новые методы, и приведем соответствующие фрагмен- ты программы. 2.16.1. Меню символов Программу обычно легче использовать, если в меню непосред- ственно высвечены символы, которыми может располагать пользо- ватель, а не текстовые строки, представляющие эти символы. При- веденная ниже процедура (пример 2.6) генерирует меню символов, подобное представленному на рис. 2.16. Для каждого символа Рис. 2.16. Меню символов, сгене- рированное процедурой PLACE- SYMBOL. Каждый из символов находится в собственном поле вы- вода, обозначенном штриховым прямоугольником.
Основы интерактивного графического программирования 91 используется окно, полностью охватывающее символ, когда он не повернут и находится в начале системы координат. Каждый сим- вол также отображается на собственное поле вывода, выбираемое так, чтобы разместить символ в области меню на нужном месте и в соответствующем масштабе. Отметим, что можно было бы задать все символы (нужных размеров и в нужном положении) непосредственно в мировой координатной системе, а затем разместить их все сразу на экране с помощью одного окна в одном поле вывода. Используя вместо этого индивидуальные окно и поле вывода для каждого из символов, мы можем легко управлять их относительными размерами и положением за счет выбора конкретных отображений окна на поле вывода. Процедура CREATE_SYMB_MENU («сформировать меню символов») вызывается из процедуры SETUP как часть инициали- зации, подобно тому как вызывалась процедура CREATE_FUNC_ MENU, поскольку формирование меню производится только один раз. Как показано в примере 2.6, процедура ADD_SY MBOL по мере надобности может сделать меню видимым или невидимым. Пример 2.6. procedure CREATE-SYMB-MEN U {Генерация символов меню. Каждый из них задается в собственном сегменте, помещается в собственное поле вывода и сначала невидим. Угловые точки окна и поля вывода для каждого символа задаются в массивах из четырех- компонентных записей (это массивы окно [/] и поле „вывода [/]), включающих целые компоненты x_mm, х„тах, y„min, у„тах. Последовательные имена символов заданы символьными константами мстул, метол и т. д., описан- ными в SETUP.} var i: integer begin for i:—метол to мрастение do begin with окно [г] do WINDOW(x_min, x„max, у „min, y„mcix)\ with поле_вывода}('] do VIEW PORT(x_min, x„max, у „min, y„max); CREATE-SEGMENT(i); SET-V1 SI Bl LITYfi, off); case i of мстул: CHAIR(0.0, 0.0, 0.0); метол: DESK.ffi.0, 0.0, 0.0); мшкаф: BOOKCASEfO.O, 0.0, 0.0); мбарьер: LOWDIVIDER(0.0, 0.0, 0.0); мперегородка: PARTITIONfO.O, 0.0, 0.0); мрастение: FLOORPLANTfQ.Q, 0.0, 0.0) end; {case} CLOSE-SEGMENT end {for} end; {CREATE-SYMB-MENU}
92 Глава 2 2.16.2. Процедура добавления символа 1 Процедура ADDSYMBOL (пример 2.7) сначала делает види-1 мым меню символов. Затем она ожидает (WAIT) указания (селек-| тором), а когда пользователь указывает один из символов, она вы-1 зывает процедуру размещения символов PLACE-SYMBOL) (разд. 2.16.5) для выполнения фактических действий по формиро- ‘ ванию нового символа и его размещению в структуре данных и на изображении. После возврата, осуществляемого процедурой PLACE-SYMBOL (через собственные команды DONE или CANCEL), пользователь может либо указать другой символ для Р LACE _SY MBOL, либо же выбрать DONE или CANCEL (для воз- врата в главную программу). Команда CANCEL в процедуре ADD_ SYMBOL дает возможность пользователю отменить осуществленное ранее размещение символа до возврата в главную программу. Если процедура PLACE _SY MBOL встречает условие отсутствия места в структуре данных для добавления символа, то устанавливается флаг add_done и производится выход как из PLACE-SYMBOL, так и из ADD-SYMBOL. На диаграмме переходов (рис. 2.15) дана сводка всех этих разнообразных возможностей, включая много- кратное размещение символов. С помощью команды CANCEL можно отменить лишь тот сим- вол, который был только что размещен. Для реализации CANCEL процедура ADD SYMBOL сохраняет имя сегмента для размещен- ного последним символа (т. е. фактически адрес символа в массиве структуры данных) в переменной адр-символа. Когда пользова- тель отменяет символ, этот сегмент и соответствующая часть струк- туры данных стираются. Во флаг адр_символа при инициализации засылается 0 (это показывает, что отмена пока невозможна), а при размещении символа этот флаг устанавливается процедурой PLACE_SYMBOL. Кроме того, по команде CANCEL заносятся нули в адр-Символа в процедурах PLACE SYMBOL и ADD_ SYMBOL, поскольку в другой процедуре невозможна вторая отмена. Пример 2.7 ? procedure ADDSYMBOL', {добавление символа к изображению и структуре данных) < var i: integer; адр-символа, имя-сегмента-, integer; add-done: boolean; J begin адр-символа: = 0; f SET-VISIBILITY(done, on)', ’ SET IS1 BI LI TY (cancel, on)', ' add-done: = false; J repeat , for i — мстул to м рас/пение do {меню символов н подсказка внднмы) SET-VISIBILITY(i, on);
Основы интерактивного графического программирования 93 SET1 SIBI LITY(nodcKaeKa-do6aee, on)-, WAIT-Pl С К(лимит-времени, имя_сегмента); for I:—мету л to мрастение do {если символ выбран, меню символов и подсказка должны стать неви- димыми) S£T_YlSlBlL/TY(i, off); SET-VI SI В1ЫТУ(подсказка^добавл, off)-, if ((имя_сегмента> = help) and (имя-сегмента < =cancel)) or ((имя-сегмента> = мету л) and (имя-сегмента < = мрастение)) then case имя_сегмента of {правильный выбор из меню) 0: SCREEN-FEEDBACKC^ny выбора’); мету л, метол, мшкаф, мбарьер, мперегородка, мрастение-. {указан символ из меню, поэтому разместить его копию; его адрес выдается в адр- символа) PLACE-8УМВ0Т(имя-сегмента, адр-символа, add-done)-, help-. HELP-USER(add-he)p); done: add-done: — true; {DONE} eancel: if (адр-символа>0) then {CANCEL только при флаге адр-символа в состоянии on, т. е. при отсутствии предшествующего CANCEL в ADD-SYMBOL или PLACE-SYMBOL) begin {стереть сегмент, а затем и символ) DELETE-SEGMEN Т(адр-сегмента); символы [адр-символа].код: = 0; адр_символа: = 0 {выставить флаг в off во избежание повтора CANCEL) end {CAJVCfLJ else SCREEN-FEEDBACKSотменять нечего’) end {case} else SCREEN-FEEDBACK (‘неверный выбор, попробуйте снова’)1 until add-done; SET-VISl BI LlTY(done, off); SET _VI SI BI LlTY(cancel, off) end; {ADD-SYMBOL} 2.16.3. Размещение с помощью локатора Процедура PLACE_SYM.B0L, описанная в разд. 2.16.5, фор- мирует новый символ и добавляет его к структуре данных. Однако пользователь должен задать положение и ориентацию нового симво- ла: при этом для задания положения нового символа используется локатор, а для задания его ориентации — валюатор. Локатором пользователь может задать позицию на экране (обычно для размещения символа в заданном месте или для «черче- ния» одного и более примитивов) путем обозначения их конечных точек для прикладной программы. Локатор не вызывает события и называется опрашиваемым устройством, поскольку прикладная программа должна в явном виде затребовать (т. е. запросить) текущие значения (х, у) локатора. К физическим устройствам, впол- не пригодным для использования в качестве локатора, относятся планшеты, рычаги, а также вращающиеся ручки для управления перекрестием. Они выдают две координаты в принятом для норми-
94 Глава 2 рованных координат диапазоне 0.0—1.0; в качестве эха на экран в] соответствующей позиции может быть выдано перекрестие или мер*! цающий курсор. К данным, получаемым с локатора, можно обеспе-1 чить доступ с помощью следующего обращения: ] READ-LOCATOR (х, у) < В большинстве случаев координаты, считываемые с локатора, не могут быть использованы непосредственно, так как они даются в системе нормированных координат и показывают, где физически расположен курсор на экране. Однако программа обычно рассмат- ривает картинку на экране как отображение мировой координатной системы, принятой для модели, и поэтому она должна знать, где на- ходится курсор в этом координатном пространстве. Это важно в том случае, когда, например, курсор используется для задания кон- цов отрезков, которые строит пользователь, или же (в случае рас- сматриваемой нами программы LAYOUT) для задания размещения каждого конкретного символа предметов мебели в кабинете (в миро- вых координатах). Для облегчения такого обратного отображения из нормирован- ного пространства в мировое пространство ПГП содержит подпро- грамму INVERSE _2, которая осуществляет переход от позиции в нормированных координатах к позиции в мировых координатах. Это преобразование является обратным по отношению к обычной видовой операции, т. е. оно обратно отображению окна в мировых координатах на поле вывода, заданное в нормированных координа- тах (гл. 4). Ниже приведен оператор вызова указанной процедуры: /NVERSE_2 (нк_х, нк_у, мк_х, мк_у) Эта процедура требует осторожности, поскольку изображение, выведенное на экран, может быть сгенерировано как совокупность отдельных образов, каждый из которых задается с помощью индиви- дуальной видовой операции «окно — поле вывода». При этом только текущая (заданная самой последней) видовая операция может быть использована для вычисления обратного преобразования. Другими словами, ПГП не помнит, какая именно видовая операция была вы- полнена при формировании каждого сегмента. Поскольку обычно курсор локатора используется в позициях, находящихся внутри основной области черчения, можно составить программу таким об- разом, чтобы в последний раз черчение производилось именно в этой области; это позволяет использовать в ПГП последнюю из заданных видовых операций для вычисления обратного преобразования11. Отметим, что локатор не имеет ограничения на выдачу значений только в пределах определенного поля вывода; поэтому если локатор выдает координаты точки, лежащей вне текущего поля вывода, и эта точка будет передана в INVER- SE-2, то обратному преобразованию будет подвергнута точка, находящаяся вне текущего окна.
Основы интерактивного графического программирования 95 Если требуется несколько областей черчения и соответственно не- сколько видовых операций, то прикладная программа должна за- поминать, какая именно видовая операция относится к каждой комбинации поля вывода с сегментом, чтобы затем иметь возможность производить соответствующие обратные преобразования. В нашем примере включенная в главную программу процедура SETUP (как и некоторые из вызываемых ею процедур) изменяет поле вывода для каждого элемента меню; после этого поле вывода зада- ется для главной области построения изображения на экране и сохраняется таким постоянно, чтобы можно было использовать про- цедуру INVERSE_2 для всех последующих операций. 2.16.4. Валюатор Логическое устройство валюатор позволяет пользователю задать прикладной программе одно значение с плавающей точкой в диапа- зоне 0.0—1.0. Валюаторы, подобно локаторам, являются опрашивае- мыми устройствами и не вызывают событий. Физическим устройст- вом, которое чаще всего используется в качестве валюатора, являет- ся ручка со шкалой. Ручка представляет собой обычный потенцио- метр, подобный регулятору звука радиоприемника или телевизора. Аналоговый сигнал регулятора аппаратно преобразуется в цифро- вое значение. Эхо может быть выдано в управляющую область на экране; еще проще использовать в качестве эха указатель на шкале регулятора. Чтобы получить значение от валюатора, следует обратиться к процедуре READ „VALUATOR. При этом опрашивается валюатор, заданный первым параметром этой про- цедуры, после чего значение передается в переменную, заданную вторым параметром. Оператор READ „VALUATORS, значение) означает, что в переменную значение засылается текущее значение с валюатора 1. 2.16.5. Процедура PLACE_SYMBOL Процедура PLACE_SYMBOL (пример 2.8), вызываемая из процедуры ADD _SY MBOL, позволяет пользователю задавать по мере необходимости положение и ориентацию символов. Она име- ет три явных параметра: первый из них задает символ, добавляемый к изображению и к структуре данных, второму процедура при- сваивает значение номера сегмента (одновременно являющееся индексом структуры данных) для добавляемого символа, а третий является флагом, устанавливаемым при переполнении структуры данных для обеспечения возможности выхода из процедуры ADD_ SYMBOL. Отметим, что два последних параметра описаны как var, поскольку они являются выходными параметрами, значения кото-
96 Глава 2 рых могут возвращаться в процедуру ADD .SYMBOL. Три отдель- ные команды позволяют пользователю использовать в программе текущие значения локатора и валюа- тора 1 для размещения и ориентации нового символа; осуществитьИозврат с оставлением символа в текущем положе- нии; отменить данный этап выполнения операции добавления символа (ADD) и осуществить возврат без добавления символа. Эти команды задаются путем указания на новый элемент меню ‘PLACE’ или же на элементы глобального меню DONE и CANCEL. При каждом указании на световую кнопку PLACE пользователь может перемещать символ, пока не укажет на кнопку DONE. Предполагается, что элемент меню ‘PLACE’ и подсказки формиру- ются как невидимые сегменты в процедуре SETUP', имя сегмента световой кнопки PLACE хранится в переменной place. Чтобы процедура PLACE.SYMBOL могла сигнализировать пользователю о своей готовности к опросу локатора и валюатора, программа выдает пользователю подсказку; затем она переходит в ожидание (WAIT), пока не будет нажата кнопка окончания измене- ний значений, поступающих с устройств ввода. (Если для обслужи- вания обоих устройств — селектора и валюатора — используется планшет, то прерывания от нажатия указки, считающиеся «кнопоч- ными» событиями, дают возможность пользователю показать, что теперь планшет используется как локатор в позиции, где было про- изведено нажатие (упражнение 2.10 д по поводу ассоциирования события с опросом). На рис. 2.17 показана последовательность изображений, которая может быть получена в результате вызова процедуры PLACE_ SYMBOL после того, как пользователь указал на символ стола в то время, когда программа передала управление процедуре ADD_ SYMBOL. Получив подсказку (после указания на световую кнопку PLACE) относительно активации кнопки опроса, пользователь по- местил локатор в нужную позицию на экране (обозначенную крес- том) (рис. 2.17, а) и установил выходное значение валюатора 1 (переведенное в градусы) на величину +180°, что видно по сообще- нию обратной связи в правой нижней части экрана. Затем программа генерирует новый символ в заданной позиции (рис. 2.17, б). Теперь пользователь вновь указывает на световую кнопку PLACE, пере- мещает локатор (рис. 2.17, в) и после нажатия на кнопку получает изображение, приведенное на рис. 2.17, г. Указав на кнопку DONE, пользователь сообщает, что он удовлетворен результатом, и возвра- щается в процедуру ADD _SY MBOL. В результате появляется изображение, показанное на рис. 2.17, д. Хотя этот первый пример размещения символа правилен с точки зрения пользователя, он не является достаточным, поскольку в нем символ стола непрерывно
Основы интерактивного графического программирования 97 PLACE-помещает символ на курсор локатора пав углом, святым от DONE- фиксирует сингал •олюатара 1 ROOM 526 на 1том месте DONE CANCEL HELP PLACE \ / VP 180.0 а PLACE-помещает символ на курсор DONE локатора поВ углом,ввятым от гдыгг| DONE-фиксирует символ в°люатоРа 1 НЕ1_р ROOM 526 на этом меств PLACE в PLACE-помещает символ на курсор локатора пой углом.ввятым От DONE* фиксирует символ валюатора 1 ROOM 526 на этом месте DONE CANCEL HELP PLACE \ — VI-180.0 6 РЬЛСЕ-помесцает символ на курсор локатора поз углом, взятым от DONE’qjuKCupyem символ вчлюотора 1 ROOM 526 но этом месте DONE CANCEL HELP PLACE \ — 1 VI: 1'80,0 г PICK SYMBOL ROOM 526 TO BE ADDED DONE CANCEL HELP r-| U / 1 о Рис. 2.17. Размещение символа процедурой PLACE_SYM BOL. а — эхо от локатора и валюатора 1 (VI) перед указанием на световую кнопку PLACE; б — генерация символа после указания на световую кнопку PLACEj е —• перестановка локатора; г — переме- щение символа после повторного указа- ния на кнопку PLACE; о — возврат в процедуру ADD_SYMBQL после ука- зания на кнопку DONE.*» 3
98 Глава 2 следовал за курсором. Такой способ известен под названием бук<я сировки (разд. 2.18.2). 1 Процедура PLACE SYMBOL вызывает процедуру СЕТ_| ENTRY, которая выдает индекс первого свободного элемента масси-1 ва символы, куда можно поместить новый символ. (В поле код этого] элемента засылается 0; это означает, что элемент свободен.) Если! элемент свободен, его индекс выдается в качестве аргумента. В про- Я тивном случае выдается 0, и процедура ADDSYMBOL не может] работать, пока пользователь не сотрет несколько символов; при ; этом генерируется сообщение об ошибке и устанавливается глобаль- i ный флаг выхода для процедуры ADDSYMBOL. Для упрощения ! чтения текста две внутренние процедуры, используемые в операторе case, приводятся отдельно. Пример 2.8 procedure PLACE-SYMBOL ( имя_указанного сегмента: integer; {размещаемый символ) var адрес „нов „симе: integer; {индекс структуры данных или имя сег- мента) var add-done: boolean; {флаг выхода при заполнении структуры данных) {сформировать и разместить символ с именем имя_указанного .сегмента в струк- туре данных и на экране, запрашивая позицию и угол поворота при каждом указании на PLACE) var нк-Х, нк-у: real; {координаты, выданные локатором) place-done: boolean; {флаг выхода) имя .сегмента: integer; {для указанной селектором световой кнопки) {здесь должен находиться текст внутренних процедур PLACE-CASE и CANCEL-CASE} begin QET-ENTRY(adpec-Hoe-CUMe)‘, {получение свободного элемента массива) if ад pec .нов .симе = 0 then {в структуре данных нет места) begin SCREEN-FEEDBACK('crpyKTypa данных заполнена, пожалуйста, со- трите несколько символов’); add-done: = true {возврат, завершение обращения) end else {высветить локальный элемент меню и подсказку; DONE и CANCEL уже высвечены в ADDSYMBOL} begin SET-VlSlBlLITY(place, on}-, SET-VlSlBlLlTY(nodcKasKa_npu указании „на-place, on): place-done: = false; repeat W'AlT-PICK(лимит-времени, имя.сегмента); if ((имя-сег мента> = place) and (имя-сегмента < = cancel)) or (имя-сегмента = 0) then {„легальное" указание) case имя-сегмента of 0: SCREEN _ЕЕЕОВАСА(‘жду_выбора’); s place: PLACE-CASE: I help: HELP-U SER(place-help): 1 done: place-done: = true; {выход} 1 cancel: CANCEL-CASE J
Основы интерактивного графического программирования 99 end {case} else SCREEN-FEEDBACKS неверный выбор, попробуйте снова’) until place-done end {else} {погасить локальный элемент меню и подсказку} SET.VISI BI LITY(place, off); SET _V I SI BI LI ТУ(подсказка-при-указании-на-place, off) end; {PLACE-SYMBOL} procedure PLACE-CASE; {размещение символа в процедуре PLACE-SYMBOL; засылка значений от локатора и валюатора в поля х, у п theta символа в записи символы [адр-нов-символа]. Сначала подсказка пользователю и ожидание нажатия им любой кнопки (как требования на опрос устройства) или же просрочки времени} begin with символы [адр-нов-символа] do begin SET -VI SI ВI LI ТУ(подсказка_при_указании-на-place, off); S ET -VI SI BI LI ТУ(подсказка-Опроса_для-place, on); WAIT-BUTTON(лимит,_времени, номер_кнопки); READ-LOCATOR(hk-x, нк-у); INVERSE-2(hk-X, нк-у, х, у); {определение х, у} READ_VALUATOR(l, theta); theta: = theta*360 {перевести доли окружности в градусы, задать значе- ние в поле theta} {далее преобразовать имя сегмента указанного символа, переданное из ADD-SYMBOL, в его код типа, имеющий значения от 0 до 6, и запом- нить в поле код; код типа есть смещение относительно имени сегмента первого символа плюс единица} код: — имя-указанного-сегмента—мстул + 1; {теперь запись содержит полный символ, поэтому его следует вывести} if SEGMENT-EXISTS (адр-нов-символа)И\еп ОЕТЕТЕ-8ЕОМЕЫТ(адр-нов-символа); DI SPLAY-SY MBOL(adp-нов-символа); SET -VI SI BI LITY(n одсказка _ опроса -для-place, off); SET-VI SI BI LI ТУ (подсказка -При_ указан ии- на -place, on) end {with} end; {PLACE-CASE} procedure CANCEL-CASE; {стирание символа в структуре данных и с экрана в PLACE SYMBOL и уста- новка флага выхода} begin if SEGMENT_ЕХIЗТ8(адр-нов-Символа)(1\еп begin DELETE-SE GMEN Т(адр _ нов-символа); символы[адр - нов _ символа] .код: =0; адр-нов-символа: =0 end place-done: — true end; {(M/VCRA-C/ISR} 2.17. СТИРАНИЕ (УДАЛЕНИЕ) СИМВОЛОВ С помощью процедуры DELETE-SYMBOL (пример 2.9) поль- зователь может стереть любое число символов в структуре данных и в изображении. В DELETE-SYMBOL использован способ, ко-
100 Глава 2 ---------------------------------------------------------------------- торый называют мягким стиранием-, благодаря ему пользователь! может отменить ошибочное стирание. По этому способу сегмент,; соответствующий символу, сначала просто гасится на экране, что-1 бы показать, каким будет результат стирания, однако фактически сегмент или структура данных символа не стираются. Если пользо- ватель решит, что стирание нежелательно, он указывает на кнопку CANCEL и символ вновь высвечивается. Если же пользователь за- просит другое стирание или укажет на световую кнопку DONE, то стирание фиксируется: элемент структуры данных стирается пу- тем занесения нуля в его код, и сегмент стирается. Имя сегмента, подвергнутого мягкому стиранию, заносится в переменную стерт_ символ. Процедура DELETE-SYMBOL приведена ниже. Пример 2.9 procedure DELETE-SYMBOL-, {стереть символы в структуре данных и удалить соответствующие образы с эк- рана} var стерт-символ, имя-сегмента; integer; delete-done; boolean; begin SET-VISI BI LITY(dotte, on), SET-VISIBILITY (cancel, on)-, SET-VISI BI LI TY (подсказка-delete, on)-, стерт-символ; = 0; {не начато стирание символа} delete-done. = false, repeat WAIT-PICK (лимит _ времени, имя- сегмента); if ((имя-сегмента = 1ге1р) or (имя-сегмента = cancel} or (имя-сегмента = 0) then case имя-сегмента of 0. SCR EEN-FEEDBACKS жду ..стирания’); help; HELP-USER (delete-help), cancel; if стерт-символ>0 then {символ был стерт мягко} begin {высветить его вновь} SET-VISI BI LI TY (стерт _ символ, on); стерт-символ; = 0 {мягкое стирание отменяется} end end (HELP, CANCEL case} else Н(((имя_сегмента> — 1) and (имя-сегмента<=макссимво/1)) or (имя-сегмента— done)) then {указаны DONE или другой символ} begin {сначала сделать предыдущее мя1кое стирание, если оно есть, постоянным (путем стирания сегмента и очистки соответствующего элемента массива)} if стерт-символ>0 then begin си мволы[сте рт-символ] .код: = 0; DE LETE-SE GM Е N Т(стерт _ символ) end; (теперь проверка на DONE или стирание другого символа} f имя _сегмента=done then delete-done; = true j else {снова стирание, поэтому выполнить мягкое стирание} ? begin л
Основы интерактивного графического программирования 101 стерт-символ; = имя-сегмента', SET -VI SI Bl LITY(стерт-символ, off) end end {DONE, символы [i]} else SCREEN - F EE D В ACK(‘неверный выбор, попробуйте снова’) until delete-done-, SET _VI SI BI LITY(done, off)', SET-VlSlBlLITY(cancel, off); SET -Vl SI BI LlTY(nodcKO3Ka-deleie, off) end {DELETE-SYMBOL} 2.18. ИЗМЕНЕНИЕ ВИДА ПУТЕМ УВЕЛИЧЕНИЯ ЧАСТИ ИЗОБРАЖЕНИЯ Процедура CHANGE-VIEW (пример 2.10) позволяет показы- вать все более крупным планом11 постепенно уменьшающуюся часть видимого изображения, и с помощью команды RESET возвращать- ся к прежнему изображению, когда окно охватывает всю сцену, или же выполнять любую последовательность этих операций. Для получения крупного плана пользователь мог бы задать размеры и расположение окна путем ввода параметров с клавиатуры, одна- ко это не обеспечивает непосредственной обратной связи и дос- таточно трудоемко. Вместо этого на экране можно задать квадрат, ограничивающий ту часть текущей картинки, которая должна быть выдана как следующая увеличенная картинка. Фактически этот квадрат является не окном, а его видимым изображением на экра- не, и он перемещается по отношению к текущей картинке, т. е. к отсеченному, преобразованному и выданному на экран содержанию предыдущего окна. Новое окно можно задать внутри старого, или же можно вернуться к самому большому, исходному окну, охваты- вающему всю сцену. Пользователь задает квадрат, определяющий часть изображения, путем установки локатора в левый нижний угол нового окна, ис- пользуя при этом валюатор 1 для указания его размера. Процедура ZOOM._IN (разд. 2.18.4), вызываемая из процедуры CHANGE- VIEW, непрерывно выводит на экран изменяющийся квадрат, кото- рый соответствует окну, заданному текущими значениями от ло- катора и валюатора 1. Таким образом, пользователь может букси- ровать угол квадрата с помощью локатора и одновременно менять его размеры валюатором. Когда задано требуемое окно, пользова- тель указывает на световую кнопку DONE, генерируется новое изображение и управление передается процедуре CHANGE- VIEW. Взаимосвязь между CHANGE-VIEW и ZOOM-IN пока- зана на'диаграмме переходов (рис. 2.15). 1) В оригинале используется слово ZOOM-IN, которое означает «электрон- ное увеличение изображения» (в телевидении) или «наезд» (в кинематографии).— Прим. ред.
102 Глава 2 Непрерывный вывод квадрата, ограничивающего возможное но- вое окно, является простой формой динамической графики, которая может оказаться очень удобной на устройствах с регенерацией. На других устройствах невозможно избирательное редактирование на экране; например, в дисплеях с запоминающей ЭЛТ (ЗЭЛТ) без режима «сквозной записи» (write„through mode)1'1 описанный выше способ программирования непригоден для задания окна. В этом случае было бы предпочтительнее задавать локатором нижний левый и верхний правый углы нового окна на последовательных эта- пах ввода до тех пор, пока пользователь не будет удовлетворен ре- зультатом, а затем один раз нарисовать границу окна для оконча- тельной проверки перед повторным выводом всей сцены. И наоборот, в системах, где основная часть графического пакета реализована ап- паратно (включая отсечение и преобразование «окно — поле выво- да»), прямоугольную границу окна можно буксировать по преды- дущей картинке (обычно это изображение всего объекта) в одном поле вывода, тогда как результирующее отсеченное и преобразованное новое изображение можно при этом показывать в другом поле вы- вода. Такая тесная обратная связь обеспечит чрезвычайно удобный режим работы для пользователя. 2.18.1. Процедура CHANGE_VIEW Процедура CHANGE „VIEW (пример 2.10) использует два простых элемента меню: пользователь может указать либо на RESET, либо на ZOOM, Предполагается, что эти элементы меню генерируются и делаются невидимыми при инициализации в глав- ной программе, а здесь их нужно только высветить. Мы также счи- таем, что переменные reset и zoom содержат имена сегментов для соот- ветствующих элементов меню. Операция CANCEL для этой проце- дуры восстанавливает те параметры окна, которые оно имело при входе в процедуру. Отметим, что команды RESET и ZOOM вызыва- ют регенерацию изображения по структуре данных, включая необ- ходимое отсечение (поле вывода постоянно, изменяется лишь окно). Однако, прежде чем рассматривать процедуру ZOOM.„IN (разд. 2.18.4), поговорим о некоторых дополнительных возможностях ПГП. Пример 2.10 procedure CHANGE-VIEW {переопределение окна и регенерация изображения} var coxp„min„x, сохр„тах„х, coxp„min„y, сохр„тах„у: real; view „done: boolean; имя„сегмента: integer; Ограниченная возможность регенерации небольшого числа примитивов, образы которых не хранятся на ЗЭЛТ и, следовательно, могут быть избирательно отредактированы (гл. 3).
Основы интерактивного графического программирования 108 begin {запомнить параметры текущего (глобального) окна на случай CANCEL) сохр-min-x: = min-x; сохр-max-x: = тах-х; сохр-min-y: = min-y; сох р-max-у: = тах-у; SET-Vl SI Bl LITY(done, on)-, SET-Vl SI Bl LITY(cancel, on); view-done: = false; repeat SET-VI SI Bl Ll TY (подсказка- view, on); SET-VISlBILITY(reset, on); {включить элементы меню) SET-VISI BlLlTY(zoom, on)-, WAIT-PICK(лимит-времени, имя-сегмента); SET-V1 SI Bl LlTY(nodcKa3Ka_view, off)-, SET_VlSlBlLlTY(reset, off); {выключить элементы меню) SET-VlSlBlLITY(zoom, off); if (имя-сегмента — 0) or (имя-сегмента = zoom) or (имя-сег мента = reset) or ((имя-сегмента> —help) and (имя-сегмента <—cancel)) then case имЯ-сегмента of 0: SCREEN _FEEDBACK(‘'Kny выбора’); zoom: ZOOM-1N; {задать меньшее окно} reset: begin {задать первоначальное наибольшее окно} min-x: =комн-т1п-х; max-x: = комн-tnax-х; min-y: — комн-пйп-у; max-у: =комн-тах-у; WINDOW (min-x, max_x, min-y, max-у); DISPLAY-D-STR {регенерация изображения} end help: HELP-USER (view-help); done; begin view-done: = true DISPLAY-D-STR {регенерация изображения} end cancel-, begin {восстановление сохраненного окна) min-xt — coxp-tnin-x; max-x: = coxp-tnax-x; min-y: ~coxp-min-y; max-y. = coxp-max-y; WlNDOW(min-x, max-x, min-y, max-y); DI SPLAY-D-STR {регенерация изображения} end end {case} else SCREEN-FEEDBACKS неверный выбор, попробуйте снова’) until view-done; SET-VISIBILITY(done, off); SEN _VISlBILlTY(cancel, off) end; {CHANGE-VIEW} 2.18.2. Буксировка путем переноса Обычный способ размещения образа на экране состоит в том, что программа задает объект в заданной позиции в мировом коорди- натном пространстве, а затем использует задание окна и задание поля вывода для видовой операции, которая размещает требуемый образ. Однако часто желательно предоставить пользователю воз- можность перемещать изображение после его генерации без обра- ботки объекта с помощью ПГП при измененных параметрах видовой операции. Предположим, например, что нам требуется отбуксиро- вать квадрат — границу окна,— непрерывно передвигая его вслед
104 Глава 2 за локатором. Если вновь воспользоваться аналогией с воображае- мой фотокамерой, то можно считать, что мы хотим переместить име- ющийся снимок по доске сообщений вместо того, чтобы задать вновь некоторые параметры для перенастройки этой фотокамеры (включа- ющие задание окна и поля вывода), а затем получить от ПГП со- вершенно новый снимок, который будет «вывешен» в новом положе- нии. При таком перемещении образа можно избежать полной после- довательности действий, которые необходимы для видовой операции в ПГП и обычно требуют больших затрат машинного времени на процесс отсечения. Как показано в гл. 3, на большинстве дисплеев с регенерацией изображение можно перемещать в реальном времени просто путем изменения одной дисплейной команды, предшествую- щей примитивам сегмента. Эти примитивы задаются в относитель- ных координатах, чтобы их можно было автоматически переместить при изменении начальной команды абсолютного перемещения. Другие возможности реализации преобразования образа представ- лены в гл. 8, где рассмотрены также трехмерные преобразования. Для двумерного переноса образа производится следующий вызов подпрограммы: TRANSLATE_/МAGE_2 (имя_сегмента, х_отн, у_отн) где х_отн и у_отн (величины, необходимые для буксировки) могут быть получены от локатора. Отметим, что х_отн и у_отн задают перенос в нормированных координатах. Последовательные переносы образа выполняются без накопления: они задают перенос образа относительно его исходного положения. Поэтому в приклад- ной программе может потребоваться сохранение исходной позиции, чтобы вычислять соответствующие величины переноса. Чтобы подтянуть к локатору некоторую специфическую связу- ющую точку (например, левый нижний угол границы окна), при- кладная программа должна вычесть нормированные координаты связующей точки из нормированных координат локатора и затем передать эти значения переноса в процедуру TRANSLATE- IMAGE-2, которая переместит весь образ на указанную величину. Например, для буксировки левого нижнего угла границы окна с помощью локатора сначала следует поместить этот угол в точку с координатами (0, 0) в мировом координатном пространстве и затем отобразить ее в точку (0, 0) в нормированном пространстве. После этого величины от локатора можно использовать непосредственно в процедуре переноса. Теперь рассмотрим процедуру DRAW-BOX (нарисовать квад- рат), которая показывает, как используется перенос изображения при установке в заданную позицию и при буксировке. Процедура DRAW-BOX рисует квадрат штриховой линией по четырем пара- метрам (номер сегмента, мировые координаты х, у нижнего левого угла квадрата и длина стороны в мировых координатах). Квадрат
Основы интерактивного графического программирования 105 генерируется невидимым в новом сегменте с заданным номером. От- метим, что здесь вводится новое обращение к ПГП для управления атрибутом типа линии SET_L1NESTYLE; при этом все примитивы LINE имеют заданный атрибут типа линии до тех пор, пока он не будет изменен. По умолчанию он имеет значение сплошная, другие значения этого атрибута — штриховая, пунктирная, штрихпунк- тарная. procedure DRAW-ВОХ(квадр-сегм; integer, х, у, сторона-, real); {построить квадрат штриховой линией с левым нижним углом в х, у и сто- роной сторона} begin CREATE-SEGMENT(Keadp-CeeM); SET-VI SI Bl Е1ТУ(квадр_сегм, off}-, SET-LINESTYLE(штриховая}; {тип линии} MOVE _ABS-2(x, у}; LlNE-REL-2(<3, сторона); LI N E-REL _2(сторона, 0); LI N E-REL_2(0, —сторона); LINE-REL-2(—сторона, 0); CLOSE-SEGMENT; SET -LIN ESTY ЕЕ(сплошная); end; {ОД/Ш-ВОЛ'} Предположим, что мы вызываем процедуру DRAW-BOX для рисования внешнего контура возможного нового окна, используя следующие операторы: DRAW_BOX(box, min_x, min.y, 5.0); SET .VISIBILITY (box, on) Вспомним, что комн_тлп_х и комн.тлп.у — мировые ко- ординаты нижнего левого угла окна и что главное поле вывода есть (0.0, 0.8, 0.0, 0.8). Если исходное окно, отображаемое на поле вывода, имеет ширину около 10 единиц, то будет получено изобра- жение окна на экране, показанное на рис. 2.18, а. Если теперь в программе выполнить оператор TRAN SLATE .IMAGE .2 (box, 0.50, 0.50) то будет получено изображение, показанное на рис. 2.18, б. В этом случае процедура переноса образа перемещает квадрат так, чтобы его левый нижний угол оказался в позиции на экране, заданной дву- мя последними параметрами. Приведенный ниже фрагмент программы показывает, как ис- пользуется перенос образа для реализации буксировки. Координа- ты, принятые от локатора, используются для перестановки квад- рата до тех пор, пока не будет указания на кнопку DONE. Опрос локатора производится каждую 1/30 с в течение заданного лимита времени и пока пользователь указывает на любой сегмент, кроме DONE. (Более полная версия, ZOOM.IN, рассмотренная в разд. 2.18.4, производит проверку и на обычные глобальные команды.)
106 Глааа 2 repeat iизменить размещение} )EAD-LOCATOR(x, у); {позиция локатора} TRANSLATE-I MAGE-2(Ьох, х, у)-, {ожидание (в течение 1/30 с) указания пользователем на DONE} WAIT-PICK(.O33, имя-сегмента) until имя-сегмента ~ done-, 2.18.3. Двойная буферизация В примерах 2.2 и 2.5 мы заменяли видимые сегменты, сначала стирая старый сегмент, а затем формируя новый. Если генерация нового сегмента требует значительного времени, то возникает за- держка, которая может мешать пользователю, поэтому часто пред- почтительнее использовать двойную буферизацию образа. Она осу- ществляется путем генерации нового сегмента (в невидимом состоя- нии) до стирания старого. Для упрощения управляющих операций при двойной буфериза- ции можно использовать входящую в ПГП процедуру RENAME- SEGMENT («переименовать сегмент»). Первым ее аргументом является имя существующего сегмента, вторым — новое имя, при- сваиваемое этому сегменту. Например, следующее обращение к про- цедуре изменяет текущее имя сегмента 3 на имя 5: RENAMESEGMENT (3,5) Приведенный ниже фрагмент программы показывает реализацию двойной буферизации в ПГП. Поскольку здесь процедура DRA W_ BOX генерирует невидимый квадрат, предыдущий квадрат остается видимым, пока не завершится формирование нового (упражнение 2.19). DRAW-ВОХ(врем-имя, tniti-х, min_y, сторона)-, TRANSLATE-IMAGE_2(врем-имя, поз-Х, поз-у): SET-Vl SI BI LITY(box, off); SET-VI SI Bl Е1ТУ(врем-имя, on); DELETE-SEGMENTfbox); RENAME-SEGMENT(epeM-UMn, box) 2.18.4. Процедура Z00M_IN Рассмотрим теперь подробно процедуру Z00M_[N (пример 2.11) и ее главную внутреннюю процедуру NEW-BOX (пример 2.12). Пока нет указания на CANCEL, процедура Z00M-IN' переопределяет параметры глобального окна и регенерирует изобра- жение (см. упражнение 2.14). Переменные нов_х, нов-у, сторона. и символьная константа box определяют соответственно положение (в нормированных координатах), размер (в мировых координатах^
Основы интерактивного графического программирования W7 Рис. 2.18. Левый нижний угол квадрата в начале нормированной системы коор- динат (а) и квадрат после выполнения над сегментом операции переноса образа (б). и номер сегмента последнего сгенерированного квадрата, и эти пе- ременные являются параметрами процедуры NEW_BOX. Проце- дура NEW_ВОХ повторно формирует квадрат, если его вновь заданный размер отличается от предыдущего, и перемещает его в новое положение, если оно отличается от прежнего. Отметим, что пользователь может перемещать локатор и валюатор непрерывно. Однако они опрашиваются процедурой NEW_BOX только при обращении к ней из процедуры Z00M.-1N после того, как пользо- ватель укажет команду ZOOM в процедуре CHANGEJVIEW. Фактически ZOOM-IN дает команду на опрос через каждую 1/30 с, вызывая NEW-BOX по истечении лимита времени, если не было указания на HELP, DONE или CANCEL. На рис. 2.19 показана последовательность картинок, которая могла быть результатом использования команды ZOOM в функции CHANGE_VIEW. На рис. 2.19, а представлен вид комнаты вместе с квадратом, определяющим окно (он обозначен здесь штриховой линией). После изменения значения валюатора может быть получен новый уменьшенный квадрат (рис. 2.19,6). Затем можно восполь- зоваться локатором для буксировки квадрата в позицию, показанную на рис. 2.19, в. Наконец, указание на световую кнопку DONE приводит к новому виду, показанному на рис. 2.19, г. Пример 2.11 procedure ZOOM-IN-, {задание нового окна как части старого окна} var «оз_х, поз..у. real;
108 Глава 2 Рис. 2.19. Выбор окна в процедуре изменения вида CHANGE-VIEW. а — квадрат окна; наверху подсказка «определите новое окно»; б — уменьшенный квадрат окна; в — перемещенный квадрат окна, г *— выполнено указание на кнопку DONE для зада- ния нового окна; наверху подсказка «укажите видовую функцию». begin поз-х := 0.0; поз-у := 0.0; масштаб 1.0; {отношение нового окна к текущему} SET -VISI Bl LI TY (подсказка _гоот, on); {инициализация квадрата, соответствующего новому окну} DRAW-BOX(box, min_x, min-у, масштаб*(тах-х—min_x)): SET-VISIBlLITY(box, on)-, zoom_done: = false; repeat WAIT-PICK(.O33, имя-сегмента)-, {1/30 с} if ((и мя - сегмента >= help) and (имя-сегмента < — cancel)) or (имя-сегмента = 0)then {«легальное» указание} case имя-сегмента of j 0: {просрочка времени=> проверить необходимость нового квад-? рата} 1 NEW-ВОХ(Ьох, поз-Х, поз-у, масштаб)-, help: HELP-USER(zoom-help)-, 1
Основы интерактивного графического программирования 109 done: begin {текущий квадрат определяет новое окно, нормированные координаты нижнего левого угла преобразуются в мировые координаты} сторона : — масштаб * {тах-х—min_x); INVERSE-2{поз_х, поз-у, min-x, miti-y): max-x := min_x-\-сторона-, тах-у;== min-у-}-сторона: WI ND0W{min_x, тах_х, min-y, тах-у): SET _V1 Si Bl LITY{box, off): DISPLAY-D-STR: zoom-done := true; end cancel: zoom-donetrue end {case} else SCREEN-FEEDBACK (‘неверный выбор, попробуйте снова’) until zoom-done-, DELETE-SEGMENTfbox): SET -VI SI Bl Ll ТУ{подсказка-гоот, off): end; {ZOOM-IN} Пример 2.12 procedure NEW-BOX{box: integer; var нов-Х, нов-у, масштаб: real); {переместить и (или) регенерировать квадрат} const врем_имя=999: {сегмент буфера} масшт-eps — 0.01; {точность “epsilon”} поз-ерз= 0.01; var нов-масштаб, нов_х, нов-у: real; begin READ _V ALU ATOR{\, нов-масштаб)-, {если валюатор достаточно изменен по сравнению со старой стороной, то новый квадрат} if АВ5{нов .масштаб—масштаб) >масшт-eps then begin масштаб := нов-масштаб: DRAW-ВОХ(врем_имя, min.x, min_y, (max-x—min-х) * масштаб): TR AN SLATE-I MAGE-2(врем .имя, поз_х, поз_у): SET_VlSlBlLITY(box, off): SET-VISIBILI TY {врем-имя, on): DELETE _SEGMENT{box): RENAMESEGMENT{epeM-UMH, box) end; WAIT-BUTTON{AUMum-epeMeHU, номер-кнопки): READ-LOCATOR{hob-X, нов-у): {если локатор достаточно сместился со старой позиции, сдвинуть квадрат} if (АВ8{нов-х—поз-х) >поз_ерв) ог(АВ5{нов-у—поз_у) > no3_eps)then begin TRANSLATE- IMAGE-2{box, нов-х — поз.х, нов.у—поз.у); поз-х := нов-х: поз-у := нов-у, end end; {NEW-BOX}
СТО Глава 2 2.19. ДОБАВЛЕНИЕ СПЛОШНЫХ ОБЛАСТЕЙ НА РАСТРОВЫХ ДИСПЛЕЯХ Как запустить рассматриваемую нами программу размещения на растровом дисплее? Прежде всего такие дисплеи могут выдавать точки, линии и литеры, поэтому программа размещения (LAYOUT) благодаря независимости ПГП от устройства может работать без изменений. Однако если мы хотим использовать возможности, предоставляемые дисплеем, для вывода сплошных областей (черно- белых или цветных), то в ПГП следует ввести понятие сплошных замкнутых областей. Для этого используются обращения к графиче- скому примитиву POLYGON и к установке атрибута’цвета SET_ COLOR. Процедура POLYGON в качестве параметров имеет два мас- сива координат (х, у) вершин многоугольника и число вершин и по- зволяет получить многоугольник, закрашенный текущим цветом: POLYGON (список_х, список_у, число_веришн) Атрибут цвета COLOR, как и атрибут типа линии LINE_STYLE, действует на все последующие примитивы до тех пор, пока не будет изменен; его значением по умолчанию является наиболее видный из имеющегося диапазона цветов: например, белый цвет на сером или зеленом экране или черный на печатающем устройстве. Чтобы закрасить в нужные цвета используемые нами шесть стан- дартных символов, мы изменяем рисующие их программы так, чтобы на месте прежнего цикла for, который чертит отрезки прямых через последовательность вершин, образуя замкнутый многоуголь- ник, находилось одно обращение к процедуре POLYGON. Это обра- щение окаймляется соответствующими обращениями к процедуре SET-COLOR с использованием нового параметра цвета. Для сохра- нения прежнего цвета применена процедура INQUIRE-COLOR— одна из многочисленных процедур INQUIRE, используемых с целью получения текущих значений любого атрибута, ТП и т. д. [2031. В этом случае процедура CHAIR из разд. 2.11 приобретает следующий простой вид: procedure CHAlR(xc, ус, уг-повор: real; цвет", integer); var стул-х, стул-у, стул-х-нов, стул-у-нов'. аггау[1..7] of real; begin {преобразовать координаты, применяя поворот н перенос) XFORM(xc, ус, уг-повор, стул-Х, стул-у, стул-х-нов, стул-у-нов, 7); прежний-Цвет ;= IN QU IR Е-COLOR; SET-COLOR (цвет); POLYGON(стул-Х-нов, стул-у-нов, 6); SET-COLOR (прежний-цвет) end;
Основы интерактивного графического программирования 111 2.20. АЛЬТЕРНАТИВНАЯ РЕАЛИЗАЦИЯ В предыдущих разделах рассматривалась такая реализация программы размещения символов, которая максимально упрощена. Она описана по способу «сверху вниз», и различные процедуры вво- дились по возможности независимо, насколько это допускал при- нятый язык программирования. Программа, полученная при такой реализации, является хорошей с точки зрения эргономики: в ней удачно реализованы функции HELP, а во многих случаях и функции CANCEL. Однако эта программа не совсем удобна для пользователя, который должен явно выходить из каждой процедуры (путем указа- ния на световую кнопку DONE) прежде, чем выбрать другую функ- цию. Предпочтительнее было бы всегда иметь главное меню видимым и разрешить пользователю в любой момент указывать новую функцию. Однако такое небольшое изменение в общении пользователя с программой оказывается очень важным для реализации последней; необходимо либо значительно модифицировать существующую прог- рамму, либо разработать новую схему ее реализации. Если принято решение модифицировать существующую программу, то следует обеспечить в каждом цикле обработки событий другие возможности для проверки указания на сегменты функций в меню; многие из процедур должны возвращать указание о том, были ли они заверше- ны в связи с указанием на световую кнопку DONE, а главная прог- рамма должна вызывать указанную функцию, не ожидая другого события. Диаграмма переходов при этом становится более сложной, поскольку появляются дополнительные варианты. В общем хотя требуемые изменения обычно очевидны, они также достаточно трудоемки и требуют введения дополнительных явных параметров и (или) глобальных переменных. Другим решением является разработка совершенно новой схемы реализации, основанной на пересмотренных требованиях. Альтер- нативная реализация имеет только одну процедуру для обработки событий, которая обрабатывает все события и вызывает соответст- вующие процедуры в зависимости от значения переменной текущего состояния п. Например, когда система находится в состоянии до- бавить символ, выбор одного из элементов меню инициирует опера- цию добавления символа, а выбор элемента меню стереть символ (без указания на кнопку DONE для выхода) переводит систему в состояние стереть символ. Хотя такой подход может улучшить связь пользователя с программой, полученная в результате программа может быть гораздо неудачнее разделена на модули, чем предыдущая 1) Такой подход представляет собой особый случай более общего способа с использованием процессора регулярного языка для задания и обработки последо- вательности интерактивных действий. В работе [345] этот вопрос рассмотрен более подробно.
112 Глава 2 версия, поскольку в ней должны использоваться глобальные пере- менные для сохранения важной информации между последователь- ными событиями. 2.21. ЗАКЛЮЧЕНИЕ В данной главе изложены основные понятия и методы, достаточ- ные для написания многих не очень сложных и полезных прикладных программ. Большое внимание уделялось обеспечению логичного, единообразного стиля интерактивной работы человека с ЭВМ, а также единообразной реализации главной программы и входящих в нее процедур. Четко разделены три основных вида работ: рисо- вание (изготовление снимков объектов), обслуживание структуры данных, где хранится модель одного или нескольких объектов (ко- торые требуется видеть и с которыми нужно работать в интер- активном режиме), и выполнение интерактивных действий. Одна процедура может включать все эти три аспекта (например, PLACE- SYMBOL), однако работы, относящиеся к каждому из них, выпол- няются разными фрагментами или даже разными процедурами. Один из основных способов для такого разделения состоит в том, что примитивы помещаются в сегменты для обеспечения воз- можности избирательной модификации изображений или для того, чтобы эти примитивы можно было делать видимыми или невидимыми. Другим способом является использование интерактивных циклов, управляемых событиями, для синхронизации диалога пользователя с ЭВМ. Сами программы — программы высокого уровня и допуска- ют перенос на другие ЭВМ, так как они независимы от машины и уст- ройства. Это достигнуто благодаря использованию языка Паскаль и ПГП — независимого от графических устройств программного пакета. Было сделано много попыток дополнить стандартные языки программирования высокого уровня (Фортран, ПЛ/1, Алгол-68 и Паскаль) графическими типами данных и графическими операторами для обеспечения более логичной и изящной связи с графическими системами, чем при использовании программного пакета [122, 296, 413, 431]. Как уже говорилось в гл. 1, ПГП и родственный ему пакет Core, предложенный ACM SIGGRAPH в 1979 г., были использованы как временные стандарты, и на их основе были осуществлены много- численные практические разработки для коммерческого распрост- ранения и варианты этих пакетов. В то же время Американский национальный институт стандартов (ANSI) и Международная орга- низация стандартизации (ISO) рассматривали национальные и меж- дународные стандарты, разработанные на основе Core [8, 236]. В последних работах предлагается ликвидировать ТП (за счет яв- ного задания начальных и конечных точек) и включить возможности для иерархического задания сбъектов (гл. 9). Другие изменения
Основы интерактивного графического программирования 113 касаются различных отображений образов на физические устройства, причем для некоторых из этих отображений не так просто использо- вать аналогию с воображаемой фотокамерой (например, преобразо- вания в рабочей станции GKS); кроме того, гораздо большее вни- мание уделено специальным вопросам растровой графики (гл. 11 и 12). Следует отметить, что ни одно из этих возможных улучшений и изменений не приведет к тому, что изложенные в данной главе основные принципы и использованный стиль программирования окажутся устаревшими: почти все представленные здесь концепции и методы, по всей вероятности, будут полезны и в более сложных программных пакетах. В следующей главе (гл. 3) описан весь су- ществующий в настоящее время набор аппаратных средств машин- ной графики, а в гл. 4 рассмотрены способы реализации простого программного пакета (например, ПГП) для такой аппаратуры. УПРАЖНЕНИЯ 2.1. Разработайте символическую схему высокого уровня для модели хорошо' знакомой вам прикладной области, используя диаграммы с надписями или абст- рактные изображения структур данных, аналогичные приведенным в разд. 2.1. Опишите различные изобразительные представления (виды), которые могут быть получены по структуре данных. Как будет использоваться интерактивность для изменения модели и (или) ее изобразительного представления на экране? 2.2. Для трех областей применения разработайте удобную систему координат пользователя (мировую систему), т. е. предложите единицы измерения и диапазо- ны значений координат, в пределах которых будут располагаться объекты. 2.3. Вновь сформулируйте две цели описания окна. 2.4. Как будут использоваться окна в применении, выбранном для упраж- пенит 2.1? 2.5. а) Напишите программу, которая использует ПГП и вычерчивает кон- туры одноэтажного домика; при этом используйте три сегмента, содержащие соот- ветственно квадратную стену, прямоугольную дверь в стене и треугольную кры- шу. Не задавайте поле вывода, т. е. по умолчанию используйте все нормирован- ное координатное пространство. б) Задайте видовое окно для этого домика, чтобы выделить и увеличить его часть от конька крыши до верха двери. в) Напишите программу с использованием ПГП, которая самым эффективным способом чертила бы улицу из шести контурных изображений одноэтажных домиков, расположенных вплотную один к другому. Указание. Не делайте не- нужных повторных обращений к ПГП и помните, что вложение сегментов не до- пускается. 2.6. Разработайте и, если есть возможность, реализуйте простую и удобную в использовании изолированную программу для вывода гистограмм. Используйте автоматическое масштабирование для определения максимальной и минимальной высоты и ширины, чтобы чертеж вписывался в экран. Придется ли вам изменять требования и (или) программу для вывода такого чертежа на графопостроитель? 2.7. Выделите переменные, в совокупности включающие всю структуру дан- ных, к которой имеет доступ и которую изменяет программа размещения символов LAYOUT. 2.8. Напишите и, если можно, отладьте вариант программы LAYOUT, который дает возможность пользователю размещать контур домика из упр. 2.5 в любом месте на экране, изменять его положение или стирать его. При этом мо-
114 Глава 2 жете использовать любые устройства ввода. Какие элементы глобального меню! (например, HELP, DONE, CANCEL) могут быть полезны в LAYOUT? , 2.9. а) Вызывает лн у вас возражения какой-либо из человеческих факторов, перечисленных в разд. 2.2? Не забыт ли еще какой-нибудь из них? Нет лн нару- шений или недостаточно строгого соблюдения какого-либо из указанных правил в программе LAYOUT? б) На основании усовершенствованного вами перечни человеческих факторов критически рассмотрите интерактивную программу, которая вам меньше всего нравится, иапрнмер, используемый вами редактор текста. Как бы вы нзменнлн программу, чтобы она стала более удобной для пользователя? Замечание. Здесь мы имеем в виду не те обстоятельства, которые не зависят от пользователя (напри- мер, время ответа при перегрузке системы с разделением времени), и не улучшение функциональных возможностей. 2.10. а) Рассмотрите физические устройства ввода в доступной вам графиче- ской системе нлн системах н определите, к какому из пяти классов логических устройств, имеющихся в ПГП, онн относятся. б) Как обрабатываются эхо, поступающие от этих устройств? в) Как можно смоделировать логическое устройство, для которого нет соот- ветствующего физического устройства, с помощью имеющихся физических уст- ройств? г) Существует ли физическое устройство, которое непосредственно не соот- ветствует ни одному из пяти логических устройств? Могли бы вы определить для него соответствующее новое логическое устройство? д) Объясните, почему в процедуре PLACE-SYMBOL (разд. 2.16.5) необ- ходимо применить кнопку для обозначения перехода при использовании план- шета из режима селектора в режим локатора (Указание. Предположим, что поль- зователь указал на PLACE, а программа затем произвела опрос устройства без процедуры WAIT-BUTTON. Что при этом произойдет?) Какие возможны конфликты, когда одно физическое устройство используется для моделирования нескольких логических устройств? Другая связанная с этим проблема состоит в том, что в системе с разделением времени между обработкой события «кнопка» и моментом опроса может пройти довольно большое время. В течение этого интервала времени пользователь может изменить состояние опрашиваемого устройства, и полученное от него значение будет отличаться от заданного в момент события. Для устранения этого времен- ного разрыва в Core имеется возможность ассоциирования опрашиваемого устрой- ства с устройством, генерирующим событие. Такое ассоциирование означает, что обработка события и выполнение опроса осуществляются как одна нераздельная операция. Как следует изменить программу PLACE-SYMBOL, если в нее вклю- чить обращение вида ASSOCIATION (кнопка, валюатор, значение) 2.11. Составьте в общем виде проект интерактивной графической дисплейной программы для простой версии применения, рассмотренного в упр. 2.1 (или для другой простой прикладной задачи по вашему выбору). Применение должно быть не сложнее, чем для LAYOUT. Начните с простой, но понятной пользователю ин- струкции (даже если ее длина не больше страницы). Нарисуйте иерархию модулей (или ориентированный граф, если имеются многократные обращения) и диаграмму переходов, показывающую допустимые последовательности интерактивных дей- ствий. Используйте мнемонические названия для всех процедур, рисующих символы, не расписывая подробно обращения к выходным примитивам, и напи- шите другие процедуры с использованием ПГП или на псевдокоде высокого уров- ня (как вам удобнее). Можно также использовать абстрактные определения струк- туры данных. Тексты программ не должны требовать дополнительных пояснений; при необходимости следует использовать рисунки. (Пассивная машинная графика тоже полезна!) На это упражнение следует затратить не более 3 ч и не больше 10—15 листов бумаги. 2.12. Как нужно усовершенствовать программу LAYOUT, чтобы можно было одновременно активировать и ожидать несколько устройств ввода? Рассмотрите
Основы интерактивного графического программирования 115 возможности, имеющиеся в Core или в другом используемом вами графическом пакете с точки зрения такого избирательного ожидания, и с учетом этого решите, что следует изменить в логике программы LAYOUT. Если вы считаете, что осу- ществление таких изменений в LAYOUT невозможно, то рассмотрите другую про- грамму, в которой такая возможность была бы полезна. 2.13. После выполнения заданий по программированию, содержащихся в упр. 2.6 и 2.8, вы приобрели некоторый начальный опыт. Теперь после пересмотра корректировки и одобрения вашей разработки для упр. 2.11 напишите программу, постепенно и детально уточняя ваш псевдокод и абстрактную структуру данных. Следите за тем, на что вы тратили время, -документируйте этн затраты, свои труд- ности и ошибки. Обсудите накопленный вами опыт с коллегами и преподава- телем. 2.14. В программе LAYOUT после укрупнения плана структура данных регенерируется путем стирания сегмента н его повторного формирования с сохра- нением действующих параметров видовой операции. Что будет видеть пользователь на экране по ходу последовательных стираний и замен? Как можно использовать, двойную буферизацию, чтобы непосредственно переходить от старого изображения к новому? 2.15. Покажите, каким образом можно реализовать процедуру SCREEN- FEEDBACK, упомянутую в разд. 2.13, а также «прозрачную» функцию HELP- USER, упомянутую в разд. 2.14.3? 2.16. В рассмотренной реализации программы LAYOUT при обращении из процедуры ADD-SYMBOL к PLACE-SY MBOL возможно добавление и раз- мещение за один раз только одного символа. Покажите, как следует изменить обе процедуры, чтобы они допускали добавление и размещение многих символов без излишних указаний на меню. Какие дополнительные возможности в ADD-SYM- BOL могут быть удобны для пользователя? (Они должны быть однозначными, но достаточно лаконичными.) Какие изменения необходимы в ПГП для упрощения такой интерактивной работы? 2.17. Подробно разработайте одну из альтернативных реализаций программы LAYOUT, рекомендованных в разд. 2.20. 2.18. Одним из многочисленных расширений, имеющихся в более развитых пакетах типа Core, является понятие атрибута сегмента. В LAYOUT мы видели, каким образом можно использовать видимость в качестве динамического атрибута сегмента и изменять этот атрибут после формирования сегмента (в отличие от статических атрибутов примитивов, например, цвета и типа линии). Для того что- бы обеспечить возможность избирательного указания видимых сегментов, можно применить динамический атрибут реактивности сегмента. Покажите, каким об- разом можно упростить текст программы LAYOUT за счет избирательного вклю- чения (on) и выключения (о//) реактивности. Покажите также, как можно исполь- зовать динамический атрибут выделение сегмента, чтобы обеспечить пользователю обратную связь от указанных им графических символов и световых кнопок. Этот атрибут используется для привлечения внимания пользователя к сегменту путем повышения яркости или мерцания образа. 2.19. На растровом дисплее изменение видимости сегмента требует гораздо больше времени, чем на векторном, поскольку сегмент нужно рисовать заново (при выключении сегмент рисуется цветом фона). Как изменить фрагмент про- граммы в разд. 2.18.3, чтобы переход от старого объекта к новому на растровом дисплее происходил более плавно?
Глава 3 Технические средства 1 машинной графики В этой главе рассмотрены организация и функционирование полной интерактивной графической системы, в основном с точки зрения аппаратной реализации. На рис. 3.1 показана типичная система такого рода. В ней имеются четыре основные подсистемы: ЭВМ, дисплейный процессор (ДП), устройство отображения (дис- плей) и диалоговые устройства. К ЭВМ подключены два устройства для получения твердых копий — печатающее устройство и графо- построитель. ЭВМ, безусловно, является главной частью системы. Поэтому знание основных принципов работы аппаратуры ЭВМ будет полезно при чтении данной главы. В качестве устройства отображения в интерактивной графике •обычно используется электронно-лучевая трубка (ЭЛТ). В настоя- щее время разрабатываются новые устройства отображения, неко- торые из них уже нашли ограниченное применение, однако ЭЛТ, по-видимому, сохранят господствующее положение еще достаточно продолжительное время. Новые технические принципы работы уст- ройств отображения кратко обсуждаются в разд. 3.2.5 и 3.2.6. Как уже говорилось в гл. 1, имеются два основных типа ЭЛТ: без запоминания изображения и с запоминанием изображения. В первом случае для поддержания на экране устойчивого изобра- жения необходимо обновлять его, т. е. регенерировать от 30 до 60 раз в 1 с по цифровому представлению, хранимому в буфере. ЭЛТ с запоминанием изображения хранит его в виде внутреннего распределения зарядов на экране и для нее не нужен ни буфер • для цифрового представления, ни цикл регенерации. Дисплейный процессор можно рассматривать как специализи- рованный процессор, имеющий собственный набор команд, особые, форматы данных и свой счетчик команд. Этот процессор выполняет j последовательность дисплейных команд (дисплейный файл, который ' ниже называется дисплейной программой или ДП-программой)) и порождает рисунок на устройстве отображения. Отдельные дис- $ плейные команды обычно рисуют точку, линию или цепочку литер. ] Устройства ввода, с помощью которых пользователь вводит коман- | ды и другую информацию, подключены к ДП. В данной главе, описаны только несколько основных устройств. Более подробное) описание устройств ввода можно найти в гл. 5. | ДП может создавать изображение путем произвольного скани-1
Технические средства машинной графики 117 Рис. 3.1. Блок-схема типичной интерактивной графической системы. рования экрана или путем растрового сканирования. В системе с произвольным сканированием (такие системы называются также векторными, штриховыми или каллиграфическими) части рисунка могут появляться на дисплее в любом порядке. Домик на рис. 3.2 нарисован путем переноса (отклонения) электронного луча в на- чальную точку, включения луча и последовательного его смещения вдоль линий, образующих контур домика, от одной конечной точки до другой. В системе с растровым (телевизионным) сканированием Рис. 3.2. Домик, нарисованный си- стемой с произвольным сканирова- нием. Рис. 3.3. Схема растрового сканирования. рисунок разбивается на горизонтальные строки. Сначала появля- ются все части рисунка, находящиеся в первой строке (слева на- право), затем все части рисунка, находящиеся во второй строке и т. д. В устройствах получения твердых копий также применяется либо произвольное, либо растровое сканирование. Печатающее уст- ройство является простым устройством с растровым сканированием. Печатающая головка движется слева направо, сверху вниз. Перье- вой графопостроитель, в котором перо может перемещаться над ли- стом бумаги в любом направлении, является устройством с произ- вольным сканированием. На рис. 3.3 приведена основная схема организации растрового сканирования, начинающегося с левого верхнего угла экрана. Во время перемещения луча слева направо его интенсивность модули- руется для создания различных уровней тона. При достижении
118 Глава 3 правого края растра луч выключается, переводится (штриховая линия) к левому краю, смещаясь при этом на одну единицу растра вниз, и снова включается. После того как будут отработаны все возвращается в верхний левый угол. Телевизи- онное вещание в Соединенных Штатах Амери- ки работает с растром, состоящим из 525 строк, но большинство растровых графиче- ских систем используют 256—1024 строк. Чем больше строк, тем выше качество изоб- ражения. На рис. 3.4 показано, как могло бы, формироваться изображение контура домика на экране растрового дисплея; обозначены строки растра и выделены точки, в которых1 интенсивность луча увеличивается. В данной главе сначала рассмотрено ис- пользование печатающих устройств и графо- построителей как устройств графического вы-' вода. Затем обсуждены некоторые важные растровым сканировани- ем. технические вопросы, касающиеся аппаратуры дисплеев, и подробно изучена архитектура ос- новных векторных ДП. Более совершенные ДП представлены в гл. 10. В данной главе описаны также растровые дисплеи, которые более подробно обсуждаются в гл. 12. Разделы, отмеченные звез- дочкой (¥), целиком посвящены аппаратуре. Их можно пропустить, не опасаясь потерять нить изложения. Читателям, желающим глуб- же разобраться в технических вопросах, рекомендуется ознако- миться с работой [422]. 3.1. ГРАФИЧЕСКИЙ ВЫВОД ЭВМ использовались для построения рисунков задолго до по- явления интерактивной графики. Для этой цели применялись глав- ным образом два устройства — печатающее устройство и графопо- строитель. 3.1.1. Использование печатающих устройств для графического вывода Использование построчных печатающих устройств для графиче- ского вывода целесообразно в следующих основных областях: ри- сование блок-схем (и других подобных диаграмм), построение гра- фиков функций одной переменной (включая столбчатые диаграммы и т. д.) и изображение функции двух переменных путем управления «жирностью» литеры в каждой позиции («жирность» литеры соответ- ствует значению функции).
Технические средства машинной графики 119 / ERPR / PGERR | 01 |” ST 1«RGSTR1 | <00007*> । 02 /...............7 / PRINT PROGRAM / / ERROR / / PUT / / CFILE.ERLINE / (000076) । 03 | "’*8ALR 13*0 | (000078) । 04 | L 15»=A(ERR0R) I (000081) । 05 | L 1.RGSTR1 | JACK TO PRINT DETAIL LINS e pgrt | NOTE 06 *********** * CSECT * *********** 03.18- —> ERROR | 07 | SAVE (14*12) | (000020) * 08 HIGH «PAGE OFLOU • EQUAL ---* CLI *---------- * PGCT+3* • * X»32* * * • ELSC L 3*PGCT LA 3*1(3) ST 3*PGCT L 14*4(1) (000027) • 10 ELSE (000028) И L 14*0(1) j MVI PLINE»C» • MVC PLINE+1(131)• PLINE _ • * .........>♦ PGOVFL I 18 I MVI PGCT*3*X»00* I I ST l.RGSTRl | (000064) | 19 / PRINT THE /Z / HEADING / / PUT / I PFILE.PHEAD / (000066) I 20 | BALR 13*0 | (000068) I 21 L 15*=A(ERR0R) | (000071) I 22 |" L l.RGSTRl | BACK TO PRINT DETAIL LINS В PGRT Рис. 3.5. Блок-схема, полученная на печатающем устройстве. Пакет AUTOFLOW II. (С разрешения фирмы Applied Data Research, Inc., Принстон, Нью-Джерси.) Основным фактором, определяющим применимость некоторого графического устройства в конкретном приложении, является его разрешающая способность — число различимых элементов в еди- нице длины. Низкая разрешающая способность печатающего уст- ройства (обычно 4 точки на 1 см по горизонтали и 2,4 точки на 1 см по вертикали) ограничивает его применимость. В то же время пе- чатающие устройства обладают рядом привлекательных особенно- стей: высокой скоростью, доступностью и низкой стоимостью одной страницы вывода. Несмотря на низкую разрешающую способность, в блок-схеме на рис. 3.5 не потеряно существенной информации, а стоимость создания этого рисунка значительно ниже, чем при ис- пользовании графопостроителя. Некоторые печатающие устройства,
120 Глава 3 >20 200 2*0 ЮС 120 40 Рис. 3.6. График, полученный на построчном печатающем устройстве. формирующие изображения лтер с помощью матрицы точек, могут печатать отдельные точки с разрешающей способностью до 40 точек на 1 см. Если они при этом оснащены многоцветными лентами, то получаемые с их помощью твердые копии обладают достаточно высоким качеством. На рис. 3.6 приведен график функции, построенный в разме- ченных осях. Для построения такого графика необходимо вычис- лить значения функции для значений независимой переменной, соответствующих всем позициям печати литер по горизонтальной оси. Каждое значение функции должно быть округлено или усечено до величины, соответствующей ближайшей позиции печати строки. Если рисунок занимает только одну страницу печатающего уст- ройства размером примерно 50 позиций по вертикали, то округле- ние может внести ошибку до 1 %. Кроме того, могут возникнуть не- желательные визуальные эффекты, такие, как рваные «ступеньки» на прямых линиях. Изображение функций двух переменных целесообразно в не- скольких конкретных областях приложений, в частности при рисо- вании карт пространственного распределения (рис. 3.7) и при генерации компьютерных рисунков (рис. 3.8). Независимо от обла- сти приложения необходимо выбрать набор литер, достаточный для представления требуемого числа уровней яркости (от очень светлого до очень темного), чтобы человек мог правильно интер- ; претировать получаемое изображение. Некоторые печатающие уст- J
Технические средства машинной графики 121 Рис. 3.7. Средний доход на семью в штате Массачусетс в 1968 г Карта получена с помощью программы SYMAP, разработанной в лаборатории машинной графики и пространственного анализа (Гарвардская высшая школа проектирования, Кембридж, шт Массачусетс) ройства позволяют увеличить возможное число уровней яркости путем наложения нескольких литер в одной позиции. Печатающие устройства, использующие печатающий механизм в виде матрицы точек, иногда позволяют управлять отдельными точками В этом случае различные уровни яркости можно изображать, печатая раз- ное число точек в одной позиции. Программы, предназначенные для построения рисунков, подоб- ных представленным здесь, обычно накапливают литеры в двумер- ном массиве, размеры которого соответствуют числу столбцов и строк на странице печатающего устройства. Если один рисунок занимает более одной страницы, размер массива может быть увели- чен В исходном состоянии массив содержит пробелы, а затем отдельные элементы массива заполняются отличными от пробела литерами. Для того чтобы нарисовать график функции одной пере- менной, в соответствующие элементы массива вставляются лите- ры, предназначенные для рисования осей, их названий, разметки осей, названия графика и значений функции. После того как в мас- сиве накоплены все литеры, относящиеся к данному рисунку, он печатается строка за строкой. Фактически мы сейчас рассмотрели алгоритм развертки, пере- водящий описание рисунка в терминах точек, линий и функций в по-
122 Глава 3 Рис. 3.8. Рисунок, полученный на печатающем устройстве. следовательную построчную форму растрового сканирования. Ал- горитмы развертки являются фундаментальными для всех растро- вых графических устройств. В гл. 11 они обсуждаются подробно. 3.1.2. Графопостроители Как и дисплеи, графопостроители делятся на два больших, класса: с произвольным сканированием и с растровым сканирова- J нием. Планшетные графопостроители являются устройствами о, произвольным сканированием. Они строят рисунки на листе бума-, ги, удерживаемом на специальном столе с помощью электростати- ‘ ческого заряда, вакуума или путем натяжения (рис. 3.9) Вдоль стола перемещается каретка. На каретке установлено перо, которое ’ движется вдоль каретки Перо может подниматься и опускаться. Размеры планшетных графопостроителей колеблются в пределах 30X45 см — 2x3 м. В некоторых случаях «перо» является источ- ником света для экспонирования фотографических негативов или 4
Технические средства машинной графики 123 Рис. 3.9. Планшетный графопостроитель. (С разрешения фирмы California Com- puter Products.) ножом для резания материала. Часто используются перья различ- ного цвета и различной толщины. Барабанные графопостроители (другая разновидность устройств с произвольным сканированием) рисуют изображение на свернутой в рулон бумаге, туго натянутой на барабане (рис. 3.10). Выступы на барабане, входящие в заранее сделанные в бумаге отверстия, слу- жат для предотвращения проскальзывания. Барабан может вра- щаться в обоих направлениях, натяжение бумаги обеспечивается подающим и приемным роликами, находящимися с разных сторон от барабана. Перо движется поперек бумаги и может подниматься и опускаться. Ширина бумаги изменяется от 30 до 90 см. Для всех графопостроителей с произвольным сканированием имеются общие команды: опустить перо, поднять перо, сместиться на один шаг влево (вправо), сместиться на один шаг вверх (вниз). Команды перемещения реализуются исполнительной системой с об- ратной связью, состоящей из сервомоторов и датчиков положения, перо поднимается и опускается электромагнитом. Более совершен- ные графопостроители могут выполнять перемещения на один шаг в любом из 8 или даже 16 направлений, кроме того, разрешаются перемещения более чем на один шаг. Графопостроители, в состав которых входят микропроцессоры, обычно могут исполнять коман- ды, рисующие окружности, дуги и литеры. В этом случае команды нижнего уровня, выполняемые непосредственно аппаратурой, ге- нер ируются ми кропроцессор ом.
124 Глава 3 Рис. 3.10. Барабанный графопостроитель. (С разрешения фирмы California Computer Products.) Наиболее распространенный растровый графопостроитель — t электростатический — работает следующим образом: сначала на | те части белой бумаги, которые должны быть темными, наносится ; отрицательный заряд. Затем над бумагой распыляется положитель- j но заряженный черный краситель (рис. 3.11). Частицы красителя! оседают на бумагу в тех местах, где был нанесен заряд. Заряд >' наносится на бумагу (шириной до 180 см) построчно. Бумага дви- жется со скоростью 7,5 см/с под горизонтально расположенной1 частой гребенкой электрических контактов, размещенных с плот- ностью 40—100 на 1 см. Каждый контакт либо включен (для на- несения отрицательного заряда), либо выключен. Таким образом' получается 40—100 строк на 1 см. Каждое пятно на электростати- ческом изображении будет либо черным, либо белым. Однако можно- получить ограниченный набор уровней гона, определив более круп- ные конфигурации, состоящие из нескольких пятен. Включая в их состав различное число черных пятен, можно получить полутоновое изображение (этот метод более подробно обсуждается в гл. 17)., Сравнение электростатических и перьевых графопостроителей. Перьевые графопостроители дают четкие изображения с высокой! контрастностью и могут использовать перья различных цветов и! различной толщины. Изображения, получаемые на электростати-1 ческих графопостроителях, имеют более низкую контрастность, по- скольку небольшое количество красителя прилипает и к незаря-’ женным участкам бумаги. В настоящее время изображения могут) быть только черно-белыми. Электростатический графопостроителе
Технические средства машинной графики 125 Рис. 3.11. Электростатический графопостроитель. обычно в 10—20 раз быстрее перьевого, однако он требует времени на алгоритм развертки. Этот алгоритм может выполняться либо универсальной ЭВМ, либо специализированным процессором, струк- тура которого оптимизирована для данной конкретной задачи. Электростатические графопостроители могут использоваться в ка- честве печатающих устройств среднего быстродействия. Другие технические принципы. В настоящее время все более широкое распространение получают другие методы изготовления твердых копий. Наиболее важным является, по-видимому, ксерогра- фический процесс, разработанный фирмой Xerox. Обычный копиро- вальный аппарат этой фирмы воспроизводит страницу оригинала, создавая на селеновом барабане электростатический заряд в точках, соответствующих черным точкам оригинала. Сухой краситель осаж- дается на барабане в тех местах, где есть заряд, и затем переносится на бумагу для получения копии. Для воспроизведения цветной ко- пии этот процесс повторяется три раза — для каждого основного- цвета. Порошкообразные цветные красители смешиваются на бу- маге и образуют остальные цвета. Данный метод был модифицирован таким образом, чтобы вклю- чить ЭВМ в процесс построения изображения. В аппарате, управля- емом ЭВМ, лазерный луч, сканирующий поверхность вращающегося селенового барабана, создает па нем такой же заряд, какой создается в копировальном устройстве по документу-оригиналу. После того, как заряд нанесен, процесс протекает так же, как и в обычном ко- Рис. 3.12. Струйно-чернильный графопостроитель.
126 Главе 3 Рис. 3.13. Устройство для киносъемки с экрана ЭЛТ. пировальном аппарате. Разрешающая способность этого метода достигает нескольких сотен точек на 1 см. Струйно-чернильный графопостроитель «стреляет» чернилами трех цветов в бумагу, натянутую на быстро вращающемся барабане (рис. 3.12). Чернильные форсунки медленно перемещаются по на- правляющей от одного конца барабана к другому. Принципиально этот процесс аналогичен предыдущему: осуществляется растровое сканирование барабана. Однако в последнем случае все три цвета наносятся одновременно. Другим типом устройства, предназначенного для получения твердых копий, является фото- или кинокамера, фиксирующая изображение, выводимое на экран электронно-лучевой трубки. В простых «самодельных» системах используется обычная фото- или кинокамера, подключенная к дисплею и находящаяся в затем- ненной комнате. Коммерческие системы построены на том же принципе, но в них используются прецизионные ЭЛТ и цветные фильтры (рис. 3.13). Изображение, показываемое на экране, сортируется по цвету, что- бы исключить лишние смены фильтров, поскольку каждая такая операция отнимает много времени. Смесь цветов создается повтор- ным экспонированием отдельных частей изображения через два и более фильтров, возможно, с различной интенсивностью электрон- ного луча. В некоторых недорогих растровых системах с цветным изображением сигналы, управляющие ЭЛТ, используются также для управления «подчиненным» телевизионным монитором с более высоким качеством изображения. Такой метод позволяет избежать дублирования аппаратуры. Фотографирование осуществляется через цветные фильтры, что позволяет устранить дискретность, обуслов- ленную теневой маской (разд. 3.2.4). 3.2. ДИСПЛЕИ Интерактивной машинной графике необходимы устройства, изо- бражения иа которых (в отличие от нарисованных графопострои- ( телями) могут быть очень быстро заменены. Графические устройст- ;
Технические средства машинной графики 127 ва, создающие непостоянное изображение, позволяют изменять его и осуществлять динамическое перемещение отдельных его час- тей. По распространенности электронно-лучевая трубка (ЭЛТ) значительно опережает все другие устройства такого типа и сохра- нит это положение надолго. Однако развитие полупроводниковой техники может в конечном итоге изменить ситуацию, разумеется, не в пользу ЭЛТ. 3.2.1. Электронно-лучевые трубки с регенерацией изображения ЭЛТ черно-белых бытовых телевизионных приемников практи- чески идентичны трубкам, используемым в одноцветных графиче- ских дисплеях. На рис. 3.14 приведена схема ЭЛТ. Электронный прожектор испускает поток электронов, движущихся с ускорением по направлению к экрану, покрытому люминофором. Расположен- ное на их пути фокусирующее устройство фокусирует поток в узкий луч, а отклоняющая система с помощью электростатического или магнитного поля направляет этот луч в конкретную точку экрана. Когда электроны достигают экрана, люминофор испускает видимый свет. Генераторы символов и векторов рисуют изображение на эк- ране, управляя лучом с помощью отклоняющей системы. Посколь- ку светимость люминофора уменьшается со временем по экспонен- те, необходимо повторять рисование всего изображения много раз в 1 с. В результате наблюдатель видит устойчивое немерцающее изображение. Поток электронов создается с помощью термоэмиссии: нагретая поверхность металла или окиси металла в вакууме испускает элек- троны. Высокое напряжение (тысячи вольт), приложенное к метал- лическому покрытию внутренних боковых поверхностей трубки, направляет электроны к передней части ЭЛТ. Скорость, которую приобретут электроны, зависит от величины напряжения. Поэтому оно обычно называется ускоряющим напряжением. Напряжение, приложенное к управляющей сетке, определяет, сколько электронов на самом деле достигнут экрана. Чем больше отрицательное напряжение на сетке, тем меньше электронов смо- гут пройти через нее к экрану и, следовательно, будет меньше ток луча. Это дает возможность управлять яркостью изображения, поскольку светимость люминофора падает с уменьшением числа электронов, попадающих в него. При достаточно большом отрица- тельном напряжении на сетке через нее не сможет пройти ни один электрон. Фокусирующая система использует либо электрическое, либо магнитное поле для фокусирования луча таким образом, чтобы он сходился в небольшую точку на поверхности экрана. При электро- статическом способе фокусирующие элементы устанавливаются внутри горловины трубки (рис. 3.14), при магнитном — фокуси-
128 Глава 3 рующие катушки устанавливаются с внешней стороны горловины. Тонкий параллельный пучок электронов вследствие взаимного отталкивания стремится расшириться, поэтому задачей фокусирую- щей системы является обеспечение сходимости пучка За исклю- чением тенденции электронного пучка к расхождению, фокусиро- вание электронного луча аналогично фокусированию света Элек- тронные линзы так же, как и оптические, имеют фокусное расстоя- ние, которое в случае ЭЛТ выбрано таким образом, чтобы луч схо- дился в месте расположения экрана. Рис. 3.15. Фокусирование электронного луча Рис. 3.16. Магнитное откло- нение без компенсации На рис. 3.15 приведена схема фокусирования электронного луча и одновременно поясняется проблема, характерная для ЭЛТ. Луч показан в двух положениях. В одном положении он сходится в точке, находящейся на экране, в другом — точка сходимости не попала на экран. В результате изображение получается нечетким.
Технические средства машинной графики 129 В чем причина такого явления? Радиус кривизны большинства ЭЛТ намного больше, чем расстояние от линзы до экрана. Поэтому не все точки экрана находятся на одинаковом расстоянии от линзы. Если луч точно фокусируется, когда он направлен в центр экрана, то во всех остальных точках фокусировка будет нарушена. Чем дальше от центра отклоняется луч, тем больше расфокусировка. В высокоточных дисплеях эта проблема разрешается следующим образом: фокусное расстояние линзы динамически изменяется как функция положения луча. ★ Отклоняющая система. С точки зрения машинной графики наи- более важной частью ЭЛТ является отклоняющая система, с по- мощью которой рисуется изображение на экране. Как фокусирова- ние, так и отклонение электронного луча осуществляются либо электрическим, либо магнитным полем. При электростатическом отклонении в горловину ЭЛТ встраиваются два комплекта пластин (рис. 3.14). Электронный луч проходит сначала между двумя пла- стинами вертикального отклонения (они параллельны друг другу и лежат в горизонтальной плоскости) и притягивается к пластине с более высоким напряжением. Величиной отклонения легко уп- равлять, поскольку оно прямо пропорционально разности напря- жений между пластинами. Второй набор пластин управляет гори- зонтальным отклонением. Электромагнитные отклоняющие системы состоят из двух кату- шек, охватывающих горловину трубки. Поле одной катушки откло- няет проходящий внутри катушки электронный луч по горизонтали, поле другой катушки — по вертикали. Величина отклонения только приблизительно пропорциональна току в соответствующей катушке: для трубки с плоской поверхностью связь между током в катушке I п результирующим отклонением D описывается следующим выра- жением: р, Lkl — V1 — (й/)2 1 где k — постоянная, a L — расстояние от отклоняющей катушки до экрана. Для коррекции нелинейной зависимости D от / можно ис- пользовать либо компенсационные схемы, либо постоянные магни- ты, смонтированные вокруг горловины трубки. Как показано на рис. 3.16, без коррекции регулярная квадратная сетка превращается в «подушку для булавок». На этом рисунке можно заметить два отдельных искажающих эффекта. Вдоль горизонтальной и верти- кальной центральных линий точки сетки находятся не на равном расстоянии одна от другой. Кроме того, отклонение вне централь- ной линии больше, чем на ней. Это является следствием того, что приведенное выше уравнение дает значение D вдоль одной оси в предположении, что вдоль другой оси отклонение отсутствует. В общем случае это предположение не выполняется, и рис. 3.16 иллюстрирует взаимное влияние отклонений по различным осям.
130 Глава 3 Увеличение отклонения по оси х при одном и том же токе в катунШ ке увеличит отклонение по оси у. ‘Я ★ Сравнение отклоняющих систем. По сравнению с электростати-Я ческой системой магнитная система отклонения имеет много пре-Я имуществ и мало недостатков. Во-первых, упрощается конструкция! трубки, поскольку отклоняющая система располагается вне ее.1 Во-вторых, проще управление яркостью и меньше размеры пятна,! в которое может быть сфокусирован луч на экране ЭЛТ. Кроме’ того, магнитные системы позволяют применять большее ускоряю- 1 щее напряжение, что в свою очередь позволяет получать более яр- ;; кие изображения, поскольку яркость пропорциональна числу J электронов в луче и их скорости. Большее ускоряющее напряжение * возможно потому, что в магнитных системах мощность, необходимая { для создания требуемого отклонения, линейно зависит от ускоряю- щего напряжения, в то время как для электростатических систем имеет место квадратичная зависимость. По этой же причине трубки с магнитной отклоняющей системой можно сделать более коротки- ми, чем с электростатической системой. Электростатические системы имеют три достоинства. У них существенно выше скорость генерирования изображения (а следо- вательно, можно без мерцания показывать более насыщенные кар- тинки), лучше точность позиционирования и отсутствует искажение прямоугольной сетки («подушка»). Несмотря на эти достоинства, 5 в большинстве интерактивных дисплеев с произвольным сканиро- | ванием и во всех растровых дисплеях используются магнитные-^ системы вследствие их относительной простоты. j Люминофор. Когда электронный луч достигает люминофора, нанесенного на экран ЭЛТ, электроны обладают кинетической энер- \ гией, пропорциональной ускоряющему напряжению. Часть этой энергии превращается в тепло, остальная часть передается электро- нам атомов люминофора, которые переходят на более высокие энер- гетические уровни Эти возбужденные электроны возвращаются на прежние уровни; при этом избыточная энергия превращается в све- товое излучение, частота которого предсказывается квантовой,, теорией. В любой конкретной разновидности люминофора имеется^ несколько различных квантовых уровней, на которые могут пере-г ходить возбужденные электроны. Каждому из этих уровней соот-j ветствует световое излучение определенной длины волны (опреде-: ленного цвета). Кроме того, некоторые уровни менее устойчивы! и электроны возвращаются с них в невозбужденное состояние! быстрее, чем с других. Флуоресценцией называется свечение люми-1 нофора, которое возникает в результате потери этими очень неустой-’ чивыми электронами своей избыточной энергии в тот отрезок вреЧ мени, когда электронный луч активирует данный участок экрана.! Фосфоресценция — свечение, возникающее вследствие возврата в не-! возбужденное состояние более устойчивых электронов после того! как активирующий электронный луч покинет данный участок эк!
Технические средства машинной графики 131 рана. Свечение люминофора уменьшается со временем по экспонен- циальному закону. Существует много разновидностей люминофора (каждая разновидность имеет собственные характеристики). В ма- шинной графике обычно используются люминофоры Р1,Р4 (приме- няемые также в черно-белом телевидении), Р7 и Р31. Временем послесвечения люминофора называется промежуток времени, в течение которого фосфоресценция снизится до 10% пер- воначального уровня после удаления луча. Для отдельных разно- видностей люминофора это время достигает многих секунд, но для люминофоров, применяемых в машинной графике, обычно колеб- лется в пределах 10—60 мкс. Послесвечение является основным фак- тором, определяющим выбор частоты регенерации (число повтор- ных рисований изображения в 1 с), необходимой для получения немерцающего изображения. Чем больше время послесвечения, тем меньше частота регенерации. Немерцающее изображение кажется наблюдателю постоянным или устойчивым, даже если на самом деле каждая его точка гораздо большее время находится в неактивируе- мом состоянии, чем в активируемом. Частота регенерации, при ко- торой картинка перестает мерцать и сливается в устойчивое изобра- жение, называется частотой слияния. Это явление мы испытываем на себе постоянно, когда смотрим телепередачу или кинофильм. Частота регенерации для дисплеев с растровым сканированием фиксирована (30 или 60 раз в 1 с) и не зависит от сложности изобра- жения. Частота регенерации для векторных систем прямо зависит от сложности изображения (число линий, точек и символов): чем больше сложность, тем больше времени затрачивается на один цикл регенерации и тем меньше частота регенерации. Если частоту регенерации можно уменьшить путем увеличения времени послесвечения, почему же не использовать тогда очень «медленный» люминофор? Проблема состоит в том, что после из- менения картинки на экране будут видны сразу два изображения: яркое новое и менее яркое, но отчетливо видимое старое, медленно угасающее в течение 1 мин или более. Таким образом, движущееся изображение оставит на экране пятно, состоящее из предыдущих изображений. В общем случае в приложениях с быстро изменяющи- мися изображениями требуется небольшое послесвечение, однако имеются приложения, связанные с машинным проектированием, для которых более важна возможность нарисовать сложное, устой- чивое, относительно статическое изображение. Зависимость, существующая между частотой слияния и после- свечением, нелинейна: удвоение времени послесвечения с 10 до 20 мкс не приведет к уменьшению вдвое частоты слияния. Конечно, с увеличением послесвечения до нескольких секунд частота слияния станет совсем маленькой. С другой стороны, можно использовать люминофор, который совсем не обладает послесвечением, поскольку для глаза достаточно видеть свет в течение короткого промежутка времени, но повторяющийся с частотой, примерно равной частоте
132 Глава 3 слияния. В свечение типичных видов люминофора основной вклад! дает фосфоресценция, поскольку активация, а следовательно, и 1 флуоресценция длятся обычно долю микросекунды. При нулевом | послесвечении электронный луч должен был бы гораздо дольше й задерживаться на каждой точке, а это уменьшило бы число точек, j которые луч мог бы активировать в течение цикла регенерации. Послесвечение не единственный фактор, влияющий на частоту регенерации. Последняя увеличивается с ростом яркости изобра- жения и с увеличением внешней освещенности зависит от длины волны испускаемого свеча. Наконец, она зависит от наблюдателя: помимо всего прочего, слияние — явление психологическое. Таким образом, любая названная частота слияния — это на самом деле среднее значение частоты для большого числа наблюдателей. ★ Критерии оценки. Качество отклоняющих и фокусирующих систем дисплея обычно измеряется в терминах разрешающей спо- собности, размера пятна, повторяемости, линейности и скорости. Для векторной графики разрешающая способность и размер пятна (диаметр сфокусированного луча) эквивалентны: при разрешающей способности, равной 40 линиям на 1 см (примерно лучшая из дости- жимых в настоящее время), размер пятна составляет 0,25 мм. Раз- решающая способность обычно измеряется с помощью сжимающего- ся растра: на экране показывается заданное число параллельных линий, расположенных на одинаковом расстоянии одна от другой, и это расстояние равномерно уменьшается до тех пор, пока линии не начнут сливаться Разрешающая способность — это расстояние между двумя самыми далекими друг от друга линиями, деленное на число линий в растре С увеличением интенсивности электронного луча разрешающая способность уменьшается, поскольку более яркие линии шире. Это явление объясняется возникновением оре- ола — распространением состояния возбуждения за пределы акти- вированной области Разрешающая способность растровых графи- ческих дисплеев чаще измеряется общим числом строк (имеются в виду строки растра), а не числом линий на единицу длины. Повторяемость характеризует способность отклоняющей сис- темы перемещать луч в одну и ту же точку экрана ЭЛТ при цикли- ческом приложении заданного отклоняющего сигнала, особенно когда луч движется в эту точку из различных начальных позиций. Повторяемость обычно измеряется как абсолютное расстояние и в современных высокоточных системах достигает 0,25 мм. Исполь- > зуется в основном при оценке векторных дисплеев. Дисплей линеен, если те линии, которые должны быть прямыми,^ действительно являются прямыми. Существуют две формы линей-] ности — абсолютная и относительная Под абсолютной линейностью} подразумевается максимальное расстояние между изображаемой.] линией и прямой линией, соединяющей те же конечные точки. Отно-} сительной линейностью называется отношение абсолютной линейЛ ности к длине линии, выраженное в процентах. На линиях длиной
Технические средства машинной графики 133 Рис. 3.17. Схема запоминающей трубки. во весь экран может быть достигнута относительная линейность, равная 1%. Скорость дисплея можно измерить несколькими способами. По мере углубления в детали функционирования дисплея мы сможем формировать все более точные определения скорости. Сейчас мы определим скорость как среднее время, необходимое для переме- щения луча в некоторую позицию экрана и изображения в ней точки. Объем информации, который можно изобразить на экране без мерцания, обратно пропорционален этому времени. ★ 3.2.2. Запоминающие трубки Запоминающая трубка аналогична обычной ЭЛТ, за исключением того, что она не требует регенерации изображения. Изображение хранится в запоминающей трубке в виде распределения потенциала на внутренней поверхности экрана. На рис. 3.17 показаны основные детали такой трубки. Записывающий электронный прожектор, фокусирующая и отклоняющая системы функционально идентичны аналогичным устройствам обычной ЭЛТ. Основное назначение фокусируемого луча — запись хранящегося изображения; воспро- изводящий пучок делает это изображение видимым. В исходном состоянии запоминающая поверхность имеет равно- мерно распределенный отрицательный заряд. Когда летящие с вы- сокой скоростью и обладающие большой кинетической энергией электроны бомбардируют запоминующую поверхность, они выбива- Ю1 из нее какое-то количество электронов, оседающих на положи- тельно заряженной сетке-коллекторе. Таким образом, в области, подвергнутой бомбардировке, создается недостаток электронов, а следовательно, относительный положительный заряд. Поскольку запоминающая поверхность не является проводником, электроны
134 Глава 3 не могут мигрировать и существующее распределение зарядов сох- раняется. Число выбитых электронов зависит от заряда запоминаю- щей поверхности и числа бомбардирующих электронов. В биста- бильных запоминающих трубках, используемых в хорошо извест- ных дисплеях фирмы Tektronix, число электронов, выбиваемых с единицы площади, постоянно. Таким образом, в этих трубках воз- можны только два уровня яркости изображения. Были созданы также запоминающие трубки с непрерывным уровнем тона, но они не получили широкого распространения. Скорость отклонения записывающего луча может достигать 200 м/с при сохранении эффекта запоминания изображения. Эти возможности были использованы в графическом устройстве ИБМ-3277. Темп переработки дисплейных команд в данном уст- ройстве позволяет рисовать изображение с такой скоростью [314]. Уменьшение энергии записывающего луча делает возможным «рисование поверх изображения»: луч возбуждает люминофор и создает изображение на экране, но не влияет на распределение заряда на запоминающей поверхности. Эта возможность позволяет рисовать на экране курсор, а также регенерировать литеры или векторы из буфера и, таким образом, динамически изменять часть картинки, в то время как остальные части хранятся в виде распре- деления заряда. Независимо от процесса создания требуемого распределения заряда воспроизводящий электронный прожектор испускает низко- скоростные электроны, также притягивающиеся к экрану. Воспро- изводящий пучок не фокусируется и не отклоняется: он «питает» (равномерно покрывает) весь экран электронами. Постоянное на- пряжение, приложенное к коллимационным пластинам, изгибает траектории электронов воспроизводящего пучка таким образом, чтобы они подходили к запоминающей поверхности под прямым углом. Те электроны, которые попадают на относительно положи- тельно заряженные участки запоминающей поверхности (где часть электронов была выбита записывающим лучом), проходят сквозь нее и бомбардируют люминофор, вызывая его свечение. Электроны, попадающие на другие участки, отражаются и не достигают люми- нофора. Таким образом, конфигурация заряда на запоминающей поверхности непосредственно воспроизводится в виде изображения на экране дисплея. Стирание конфигурации заряда, а следовательно, и изображения осуществляется в два этапа. Сначала на запоминающую поверх- ность подается положительное напряжение. Электроны из воспроиз- водящего пучка притягиваются к ней и «записывают» изображение на весь экран (при стирании изображения экран запоминающей трубки вспыхивает целиком). В этом состоянии на запоминающей поверхности не хватает части электронов. Для восполнения недо- статка электронов на поверхность подается отрицательное напря- жение, так что попавшие на нее электроны из воспроизводящего
Технические средства машинной графики 135 пучка удерживаются. После этого напряжение достигает рабочей величины и запоминающая поверхность готова к записи нового изображения. Запоминающие трубки обладают несколькими недостатками и некоторыми важными достоинствами. В них обычно невозможно про- вести выборочное стирание частей картины, кроме того, мал кон- траст между темными и светящимися частями экрана. Однако стои- мость дисплейных систем на запоминающих трубках довольно низкая. Они дешевле систем с произвольным сканированием (да и многих растровых систем), поскольку отсутствует буфер для регенерации изображения, а отклоняющая система может работать медленнее, чем в системах с регенерацией. Наиболее важным досто- инством дисплеев на запоминающих трубках является возможность генерировать изображения произвольной сложности с четкими ли- ниями и литерами без мерцания. Например, на трубке размером 47,5 см по диагонали, позволяющей адресовать 4096 точек по каж- дой оси, можно изобразить свыше 40 000 литер. 3.2.3. Двухслойные цветные ЭЛТ Двухслойные цветные ЭЛТ иногда используются в системах с произвольным сканированием для получения цветного изображе- ния. Внутренняя поверхность экрана такой трубки покрыта слоями двух различных видов люминофора (обычно красного и зеленого), каждый с определенным уровнем энергии возбуждения. Таким образом, величина ускоряющего напряжения определяет, какой именно люминофор возбуждается, т. е. какого цвета будет изобра- жение. Смесь красного и зеленого цветов получается при промежу- точном значении ускоряющего напряжения. Недостатком этого типа ЭЛТ является большое время, которое требуется для изменения ускоряющего напряжения (обычно от 20 до 200 мкс). Большое число изменений цвета (а следовательно, на- пряжения) в течение цикла регенерации, занимающего 1/30 с, мо- жет существенно ограничить объем информации, выводимой на эк- ран без мерцания, и повредить источник питания. В таких ЭЛТ не- обходимо сортировать выводимые на экран примитивы по цвету, так чтобы линии, точки и литеры одного цвета выводились на экран последовательно. Качество и цветовой диапазон (не более четырех цветов — обыч- но красный, оранжевый, желтый и зеленый) двухслойных ЭЛТ огра- ничены, однако в настоящее время это самый дешевый способ полу- чения цветного изображения в дисплеях с произвольным сканиро- ванием. В последнее время появились дисплеи с произвольным сканированием на базе описываемой в следующем разделе ЭЛТ с те- невой маской. Однако использование ЭЛТ с теневой маской в таком
J 36 Глава 3 Теневая маска Экран с сине- красно- зелеными триадами Рис. 3.18. Цветная ЭЛТ с теневой маской. R (red) — красный; G (green) — зеленый; В (blue) — синий. режиме обходится по крайней мере в два раза дороже, чем исполь- зование двухслойных ЭЛТ. Кроме того, ЭЛТ с теневой маской дают линии большой ширины. 3.2.4. Цветные ЭЛТ с теневой маской ЭЛТ этого типа применяются в бытовых телеприемниках. Внут- ренняя поверхность экрана такой трубки покрыта точками люмино- фора, сгруппированными в треугольники. Каждая группа из трех точек, называемая триадой, содержит по одной точке с люминофо- ром, испускающим при возбуждении соответственно красный, си- ний и зеленый свет. Триады так малы, что при наблюдении с доста- точного большого расстояния свечение их точек воспринимается наблюдателем не как отдельные красные, синие и зеленые точки, а как свечение, полученное при смешении этих трех цветов. Изменяя степень возбуждения каждой точки, можно в каждой триаде полу- чить широкий спектр цветов. Более подробно проблема цветного изображения рассмотрена в гл. 17. Как возбуждаются отдельные точки люминофора? Для этого используются три электронных прожектора, сгруппированные в та- кой же треугольник, как и точки триады (рис. 3.18). Испускаемые прожекторами электронные лучи синхронно отклоняются и фоку- сируются в одну и ту же точку экрана. Непосредственно перед эк- раном находится маска, в которой каждой триаде соответствует одно маленькое отверстие. Эти отверстия располагаются таким об- разом по отношению к триадам и электронным прожекторам, что каждая точка триады доступна электронам только одного луча. , Следовательно, количество электронов в каждом луче управляет ’ интенсивностью красного, зеленого и голубого свечения триад. ! Маска и триады накладывают ограничение на разрешающую спо- собность этих ЭЛТ, не существующее в случае одноцветных ЭЛТ. ; В трубках с очень высоким разрешением триады размещаются на , расстоянии 0,35 мм одна от другой, в то время как в бытовых теле-1 приемниках — па расстоянии 0,60 мм. I
Технические средства машинной графики 137, 3.2.5. Дисплеи на плазменных панелях Не во всех интерактивных дисплеях используются ЭЛТ. Напри- мер, в плазменных дисплеях роль экрана играет панель крошечных неоновых лампочек. Каждая лампочка может быть включена или выключена и остается в таком состоянии до тех пор, пока это со- стояние не будет явным образом изменено. Наиболее распростра- ненная плазменная панель содержит по 25 ячеек (лампочек) на 1 см и имеет вид квадрата со стороной 20 см. В такой панели содержится 250 000 ячеек. Были изготовлены панели со стороной 100 см. Таким сбразом, плазменная панель является по существу «запоминающим» дисплеем со средней разрешающей способностью без регенерации изображения. Лампочки представляют собой не отдельные устройства, а яв- ляются частью одной интегральной панели, изготовленной из трех слоев стекла (рис. 3.19). На внутреннюю поверхность первого слоя нанесены тонкие вертикальные полоски проводника. Центральный слой имеет некоторое число отверстий (лампочек), а на внутренней поверхности третьего слоя нанесены тонкие горизонтальные поло- ски проводника. Для включения лампочки (2, а) (рис. 3.19) необ- ходимо, чтобы разность напряжений на шинах 2 и а оказалась до- статочно большой для активации свечения неона в данной ячейке. Свечение возникает, когда напряжение так велико, что способно вырывать электроны из молекул неона (тем самым создаются усло- вия для прохождения электрического тока). После того как возник- ло свечение, напряжение понижается до уровня, достаточного для Рис. 3.19. Плазменная панель.
f38 Глава 3 его поддержания. Для выключения той же лампочки достаточно на мгновение уменьшить разность потенциалов на шинах 2 и а др зна- чения, меньшего, чем поддерживающее напряжение. Время вклю- чения или выключения лампочки составляет ~20 мкс. В некоторых конструкциях индивидуальные лампочки заменяются открытой по- лостью, поскольку свечение неона можно локализовать. В этом слу- чае центральный слой стекла отсутствует, а первый и третий слои разделены простыми перемычками. Плазменная панель представляет собой плоское, прозрачное и надежное устройство, не нуждающееся в процессе регенерации. Известны примеры использования ее вместе с проекционной систе- мой, что позволяет накладывать динамическую картинку, генери- руемую ЭВМ, на изображение, даваемое диапозитивами. Однако стоимость плазменных панелей пока остается слишком большой для той разрешающей способности, которую они обеспечивают. Плазменным панелям посвящены две работы [428, 456]. 3.2.6. Другие технические решения В настоящее время разработаны по крайней мере два типа приборов, которые могут быть использованы в дисплеях будущего: светодиоды и жидкие кристаллы. Оба типа приборов уже применены в наручных часах и индикаторах калькуляторов. Индивидуальные ячейки, созданные на базе одного из этих приборов, можно скомпо- новать в плотноупакованный массив точек, каждую из которых можно выборочно включать и выключать. Массив из миллиона ячеек, упакованный в квадрат со стороной 254 мм, был бы очень привлекательным для машинной графики устройством. Жидкие кристаллы особенно пригодны для портативных дисплеев, посколь- ку устройства на базе этих приборов не являются активными излу- чателями, а работают в отраженном свете и потребляют мало энер- гии. Лазеры использовались в нескольких типах дисплеев. Лазерный луч можно отклонять электромеханически с помощью зеркал, уста- новленных на чувствительных гальванометрах, или пропуская луч через материал, коэффициент преломления которого зависит от электрического потенциала. Однако этими методами можно обеспе- чить регенерацию только небольшого количества графической ин- формации. В одной коммерческой системе проблема регенерации решается следующим образом: лазерный луч наносит изображение на пленку светочувствительного материала, темнеющего при экспо- нировании светом с длиной волны, совпадающей с длиной волны лазерного излучения. С помощью света другой длины волны это изображение проецируется с пленки на большой (90x67,5 см) эк- ран. За несколько секунд можно нарисовать очень сложное изобра- жение. Светочувствительный материал не допускает выборочного
Технические средства машинной графики 139 Рис. 3.20. Точечный дисплей. ЦАП — цифроаналоговый преобразователь. стирания изображения, поэтому для удаления некоторых его частей оставшееся изображение нужно нарисовать снова так же, как в слу- чае запоминающих трубок [512]. 3.3. ДИСПЛЕЙНЫЙ ПРОЦЕССОР С ПРОИЗВОЛЬНЫМ СКАНИРОВАНИЕМ Дисплейный процессор (ДП) можно считать специализирован- ным процессором. Он декодирует коды операций и данные, имеет счетчик команд и регистры. В этом разделе мы начнем с тривиаль- ного ДП, имеющего всего два регистра, а затем будем добавлять к нему новые функции до тех пор, пока он не станет типичным пред- ставителем современных ДП с произвольным сканированием. Одно- временно мы постараемся разобраться в тех принципах, которые положены в основу многих из имеющихся в продаже ДП. 3.3.1. Точечный дисплей Простейший ДП рисует в произвольном порядке под управле- нием ЭВМ отдельные точки. Представим себе поверхность (экран ЭЛТ) в виде сетки из 1024Х 1024 позиций, отсчитываемых от левого нижнего угла экрана. Допустим, нам надо нарисовать точку в про- извольной позиции сетки. Для этого необходимо, чтобы в ДП посту- пали 10-разрядные значения х и у. Система, схема которой приве- дена на рис. 3.20, позволяет решить эту задачу. Центральный про- цессор ЭВМ с помощью команд ввода-вывода записывает в X- и Y-регистры значения координат. Аналоговые эквиваленты значений координат (в виде напряжения) подаются на отклоняющую систему. Усилители тока (в случае магнитной отклоняющей катушки) или усилители напряжения (в случае отклоняющих пластин) выдают ток или напряжение соответствующей величины, и после завершения процесса стабилизации этой величины на несколько микросекунд включается электронный луч. Затем луч опять выключается и дан- ную- процедуру можно повторить для следующей точки. Вся про- цедура рисования одной точки занимает 5—20 мкс при быстрой от-
J 140 Глава 3 repeat T 1CK_W AlT(.O333); for i := 1 to n do begin j repeat until dpu_ready, DPU _XREG(x[i]); DPU _YREG(y[i]) end until terminate _ flag {цикл регенерации} {ожидание следующего импульса 30 Гц таймера} {ожидание окончания регенерации} {процедура для загрузки Х-регистра ДП} {процедура для загрузки /-регистра ДП} {конец цикла регенерации} {флаг, устанавливаемый операционной системой для остановки регенерации} Рис. 3.21. Фрагмент программы, которая осуществляет рисование точек, хра- нящихся в массивах X и Y длиной п. клоняющей системе и до 50 мкс при медленной отклоняющей сис- теме. Для данного ДП интервал времени между появлениями на экране последовательно рисуемых точек примерно пропорционален расстоянию между точками. При частоте регенерации 30 Гц один цикл регенерации длится 33 000 мкс, что позволяет изображать от 660 (=33 000/50) до 6600 (=33 000/5) точек. Как управлять таким ДП? На рис. 3.21 приведена программа, рисующая п точек, координаты которых находятся в массивах X и Y. Если п таково, что мерцание еще отсутствует, то все хорошо. Действительно, в этом случае центральный процессор имеет время для выполнения другой работы. Если п близко к предельному зна- чению, центральный процессор должен тратить практически все свое время на регенерацию изображения. Если он стоит дорого или должен выполнять другую, более содержательную работу, то его использование только для регенерации изображения нерациональ- но. Кроме того, если поступит запрос на выполнение некоторых вы- числений, то центральный процессор должен будет прекратить процесс регенерации, оставив пользователя перед Пустым экраном. Работать с такой системой будет неудобно, а в некоторых случаях невозможно. Изображение прямых линий. Для изображения прямой линии, проходящей от точки (xl, yl) к точке (х2, у2), следует заполнить массивы X и У координатами точек, лежащих приблизительно на этой прямой. Мы говорим «приблизительно», потому что для какого- либо целого значения х соответствующее значение у, удовлетворяю- щее условию нахождения точки на прямой линии, может оказаться нецелым. Поэтому возникает необходимость в округлении или усе- чении значения у. На рис. 3.22 приведен основной алгоритм рисова- ния прямых линий DRAW; более сложные алгоритмы представлены в гл. 11. Все точки заданы в системе координат экрана дисплея; (0, 0) соответствует левому нижнему углу. В предположении, что хК.х2, алгоритм последовательно пробегает значения х-коорди- наты от xl до х2, для каждого х вычисляет значение у и округляет его до ближайшего целого. Выражение Для вычисления у основы- „
Технические средства машинной графики 141 procedure DRAW( xl, yl, {начальная точка отрезка} х2, у2: integer); {конечная точка отрезка} var т, b, dx, dy, х, у: real; begin {вычисление коэффициентов т и 6 в уравнении у — тх-\-Ь] dx.:= FLOAT (х2—xl); dy~FLOAT(y2—yl)-, (7 dx < >0 then {чтобы избежать деление на 0} begin m:=dy/dx {коэффициент наклона} b :=FLOAT(tyl)—т * FLOAT(xl); {пересечение оси у} х := xl repeat у := т * FLOAT(x)-\-b-, Шу := ROUND(y)-, PLOT(x, у)-, {заполнение выходных массивов значениями (х, (/)} х := х —1 until х > х2 end end {ДЯЛ№} Рис. 3.22. Программа для вычисления точек, лежащих на прямой. вается на уравнении прямой у—тх+Ь. Значение у не обрезается, а округляется с помощью функции ROUND. Поэтому точки, не по- падающие точно в узлы целочисленной сетки, могут оказаться как выше, так и ниже прямой линии. Алгоритм DRAW обладает недостатками. Во-первых, он хорошо работает для прямых, коэффициент наклона которых (т) меньше или равен 1. Для прямых с другим коэффициентом результат хуже, поскольку координаты у соседних точек могут различаться больше чем на 1. В предельном случае, когда коэффициент наклона беско- нечен (xl—х2~~0), возникает проблема деления на нуль, которая легко решается следующей модификацией алгоритма: независимой переменной считается х, если х2—х1>у2—yl, в противном случае переменной будет у. Во-вторых, если x2<Zxl, цикл не выполняется. Следовательно, надо добиться, чтобы выполнялось условие х2>х1 (т. е. поменять местами конечные точки, если это необходимо). Эти модификации алгоритма очевидны и здесь не приводятся. Возможна еще одна модификация алгоритма DRAW, которая позволяет ускорить вычисления. Для коэффициента наклона пря- мой т верно соотношение m^=dy!dx. Отсюда dy—m*dx, где dy — изменение значения у, соответствующее изменению значения х на dx. Пусть dx— 1, тогда dy=m есть изменение у, соответствующее единичному изменению х. Когда х является независимой перемен- ной, каждому увеличению х на 1 соответствует увеличение у на т. Таким образом, во внутреннем цикле DRAW мы имеем х=х+1 и у—у+т. Если независимой переменной является у, то dy=\, а dx—-\lm и в цикле пишется х—хЧ-1/m и у=у-\-\. Алгоритм DRA W
142 Глава 3 является алгоритмом развертки, более сложные алгоритмы рассмом! рены в гл. 11. 1 При изображении линий последовательностями точек на дис-1 плее с произвольным сканированием имеется одна общая проблема.] Предположим, что на 1 см прямой рису-1 Рется 40 точек и без мерцания можно изо-1 Ф бразить 6600 точек, тогда без мерцания | ф можно нарисовать только 165 см прямых! линий. В этих вычислениях для числа > точек использована максимальная оцен- ( Ф ка, поскольку почти все точки являют- 1.1,1 । 1 j ся ближайшими соседями предыдущих „ „ „„ „ точек и их можно рисовать с минималь- ' точками РеДОТаВЛеНИеЛИТеР ными задержками. Изображение кривых. Процедура , рисования прямых линий может быть i обобщена на случай рисования некоторой функции y=f(x). Ес- ли /(х) уже промасштабирована таким образом, что ее значения измеряются в координатах дисплея, то задача сводится к вы- , числению значений f(x) для последовательности значений х, увеличивающихся на 1. Как и в алгоритме DRAW, получаемые ве- личины должны быть округлены или обрезаны. Единственная труд- ность, как и в случае прямых линий, состоит в том, что когда наклон кривой (f'(x)) велик, расстояние между рисуемыми точками тоже будет большим. Если существует обратная функция х— g(y), то «/= =/(х) рисуется в областях, где f'(x)<_l, a x=g(y) — в остальных областях, т. е. имеет место прямая аналогия с рисованием прямых . линий. ’ Изображение литер. Как показано на рис. 3.23, каждая литера из тех, что будут изображаться на экране, определяется как неко- s торая конфигурация точек на маленькой сетке. Для того чтобы изоб- ц разить все прописные буквы, цифры и знаки препинания, необхо- дима сетка-размером не менее 5x7. Такая сетка содержит 35 точек, , поэтому любую литеру можно представить 35 битами. На рис. 3.24 приведен алгоритм, использующий такое представление литер для j заполнения массивов X и Y, которые в свою очередь используются j программой регенерации. Переменная code — это целый код изоб-1 ражаемой литеры, (x_org, y_org)— координаты точки экрана, в] которую надо поместить левый нижний угол сетки, character_defini-, tion — двумерный массив битов, указывающий, какие точки сетки: 5x7 необходимо «включить». Среднее число точек, требуемое для изображения литер типич-! ного текста, равно 20. Таким образом, без мерцания можно нарисо-^ вать на дисплее только около 6600/20=330 литер. Заключение. Простой точечный дисплей обладает следующими основными недостатками: 1) центральный процессор тратит большую часть своего времени на регенерацию изображения, что часто озна-
Технические средства машинной графики 143 procedure CHAjR( code, x_org, y-org\ integer character-definition: array [1. .5, 1..7] of boolean); {рисуется 5x7 матрица литеры, левый нижний угол в точке x-org, y-org] var i, j: integer; begin for i := 1 to 5 do for j=1 to 7 do if character-definition [t, j] then PLOT(x_org-{-i, y-org-}-j) {PLOT заносит координаты в массивы х и у для программы с рис. 3.21} end {СЯЛ7?}; Рис. 3.24. Программа для рисования литер. чает неэффективное использование ценного ресурса; 2) ограничен объем информации, который можно нарисовать без мерцания; 3) для хранения массивов X, Y и заполняющих их программ расходуется много памяти ЭВМ. Все эти недостатки можно устранить, расширив функциональные возможности дисплейного процессора. В следую- щем разделе описывается небольшая модификация, позволяющая устранить первый недостаток. 3.3.2. Счетчик команд дисплейного процессора Если процессор определяется как вычислительное устройство, имеющее собственный счетчик команд и управляющую логику и ра- ботающее по циклу: выборка команды — увеличение счетчика ко- манд — выполнение команды, то ДП, описанный в предыдущем раз- деле, фактически не является процессором. Это просто специальное устройство ввода-вывода, такое же, как печатающее устройство или перфоратор. Его можно преобразовать в независимый процессор, добавив счетчик команд и сопутствующую управляющую логику (рис. 3.25). Для использования этого дисплея центральный процес- сор создает дисплейную программу в своей памяти, загружает в счетчик команд ДП адрес начала программы и дает ему команду на выполнение программы. Когда ДП нужна очередная команда, он извлекает ее из памяти в режиме «занятия цикла». Это означает, что центральный процессор приостанавливается (посередине коман- ды, если нужно) на время, необходимое для одного цикла доступа к памяти. Результатом данной модификации является освобождение цент- рального процессора от задачи регенерации. Для работы с таким ДП центральному процессору необходимо иметь только две команды: 1. Загрузить счетчик команд ДП и запустить ДП. 2. Остановить ДП. ДП должен уметь выполнять две или три команды (в зависимо- сти от числа битов в команде). При числе битов, большем или рав- ном 21, достаточно двух команд. Первая команда {нарисовать точ-
144 Глава 3 к эвм Рис. 3.25. Дисплейный процессор со счетчиком команд. ку) содержит 1 бит кода операции, 10 бит х-координаты и 10 бит у-ко- ординаты. Вторая команда (переход) содержит 1 бит кода операции и адрес, который необходимо загрузить в счетчик команд. Переход используется главным образом для поддержания процесса регене- рации, последней командой программы ДП является переход на первую команду. Переход можно также использовать для связи нескольких частей дисплейной программы, находящихся в разных участках памяти. При числе битов, меньшем 21, необходимы три команды (что в свою очередь требует 2 бит для кода операции): 1. Загрузить Х-регистр. 2. Загрузить У-регистр и нарисовать точку (х, у). 3. Переход. 3.3.3. Векторный дисплей Превращение дисплея в автономный процессор освобождает центральный процессор от задачи регенерации, но не снимает дру- гих ограничений точечного дисплея, связанных с рисованием пря- мых линий и символов: большой размер дисплейной программы и небольшая емкость изображения. Устранить эти ограничения несложно. Следует включить в ДП аппаратуру, позволяющую определять только конечные точки пря- мой линии и фактически ее рисующую (рис. 3.26). Добавляемая аппаратура состоит из пары регистров (Хпред> У пред)- предназначен-
Технические средства машинной графики 145 Рис. 3.26. Дисплейный процессор с генератором векторов. пых для хранения конечной точки прямой, и генератора векторов, основная задача которого состоит в перемещении электронного луча строго по прямой линии от одной точки к другой. Устройство гене- ратора векторов описывается в следующем разделе. Здесь достаточ- но сказать, что время рисования отрезка прямой в таком дисплее составляет 2—50 мкс (в зависимости от скорости работы генератора векторов и длины отрезка) — слишком большой контраст с точеч- ным дисплеем, где рисование прямой в 1000 единиц может занять до 5000 мкс. Включение в состав дисплея генератора векторов означает, что необходимо расширить набор команд ДП. Функции, выполняемые ДП, помимо рисования точки и перехода теперь содержат переме- щение электронного луча в некоторую позицию (без рисования) и рисование прямой линии. Во всех командах манипулирования лучом координаты конечной его позиции записываются в X- и /-ре- гистры; после того как луч переместится в конечную позицию, уп- равляющая логика автоматически перешлет содержимое X и Y в регистры Хпред/ /пред- При наиболее часто встречающейся длине команды дисплея 16 бит требуется 5 команд: 1. Загрузить X. 2. Загрузить / и переместить луч в позицию (х, у). 3. Загрузить /, переместить луч в позицию (х, у) и нарисовать точку.
146 Глава 3 ' -------------------------------------------------------------- 4. Загрузить Y и нарисовать отрезок прямой от позиции (хпред, ^прад) до позиции (х, у). 5. Переход. Комбинируя эти команды различным образом, можно рисовать точки, связанные и несвязанные последовательности отрезков. С помощью генератора векторов можно также рисовать прямо- линейные участки символов и осуществлять кусочно-линейную ап- проксимацию кривых (это лучше, чем рисовать большое число от- дельных точек). При рисовании кривой необходимо учитывать одну особенность — в областях, где кривая имеет маленький радиус кривизны, отрезки прямых должны быть короче, чем в областях, где радиус кривизны относительно велик. ★ Генераторы векторов. При внимательном анализе задача, воз- лагаемая на генератор векторов, оказывается довольно сложной. Исходные требования формулируются следующим образом: 1. Перемещать электронный луч из позиции (хпред, #Пред) в пози- цию (х, у) по прямой линии или по крайней мере по линии, которая кажется наблюдателю прямой. 2. Рисовать все линии с одинаковой яркостью. Чем медленнее движется луч, тем больше электронов бомбардируют данный учас- ток люминофора, заставляя его светиться ярче. Постоянная яркость может быть достигнута либо перемещением луча с постоянной скоростью для всех векторов, либо изменением интенсивности луча для разных векторов, либо комбинацией этих двух способов. Задача состоит в том, чтобы обеспечить попадание в каждую точку прямой одного и того же числа электронов, учитывая при этом скорость пе- ремещения луча. 3. Включать луч точно в тот момент, когда он начинает переме- щаться из начальной точки, и выключать в момент прихода в конеч- ную точку — не раньше и не позже. 4. Выполнять все операции как можно быстрее. Генератор векторов должен управлять тремя параметрами: отклонением по х, отклонением по у и интенсивностью. Если ком- пенсация интенсивности не требуется (т. е. векторы рисуются с од- ной и той же скоростью), сигнал управления интенсивностью пре- вращается просто в сигнал его включения и выключения. На рис. 3.27 показаны сигналы, требуемые для рисования нескольких различных отрезков прямых с постоянной скоростью. Графики сиг- налов отклонения по х и у откалиброваны таким образом, что по вертикальной оси отложены единицы растра, а по горизонтальной — время. Отсчет времени ведется с момента начала генерации вектора, Т’макс — максимальное время, необходимое для рисования самого длинного вектора. Из анализа графиков следует, что фактическое время, необходимое для рисования вектора, пропорционально боль- шему из приращений его координат. Для генерации сигналов отклонения используются два способа. В первом способе аналоговые генераторы векторов с помощью анало-
Технические средства машинной графики 147 Рис. 3.27. Пять векторов и соответствующие им управляющие сигналы-
148 Глава 3 гового интегратора вырабатывают опорное пилообразное напряже- ние, меняющееся линейно от нуля до максимума за время Тмакс (в некоторых системах Тмакс зависит от длины вектора, в других оно постоянно). Сигналы отклонения по х и у создаются путем ум- ножения опорного пилообразного напряжения на сигнал, получен- ный из приращения координат х и у. В результате получается плав- ный сигнал для управления усилителями отклоняющей системы и плавная прямая линия. Современные высокопроизводительные системы, использующие этот метод, могут нарисовать короткий вектор за 1—2 мкс, а вектор во весь экран — за 15—20 мкс. Второй способ (цифровое генерирование векторов) состоит в по- шаговом увеличении (или уменьшении в зависимости от ситуации) регистров Лпред и /?Пред с частотой, пропорциональной требуемому приращению г и у. Тот регистр, приращение которого больше, уве- личивается с постоянной частотой г единиц в 1 с. Второй регистр увеличивается с меньшей частотой г', пропорциональной отношению меньшего приращения к большему. (Отметим, что этот метод яв- ляется по существу аппаратной реализацией пошагового алгоритма рисования прямых, рассмотренного в разд. 3.3.1.) Содержимое ре- гистров непрерывно пропускается через цифроаналоговый преоб- разователь и затем подается на усилители отклоняющей системы. Отметим, однако, что при этом сигналы, управляющие усилителя- ми, уже не являются гладкими, а представляют собой ступенчатые функции и генерируют слегка «зазубренный» вектор, поскольку электронный луч перемещается только в адресуемые точки экрана. Эта проблема не возникает в случае аналогового генератора векто- ров. При современной технологии частота приращений г может до- стигать 30 млн. единиц в 1 с. Вектор во весь экран на дисплее, адре- суемом 10-битовыми регистрами, требует 1024 приращений и, сле- довательно, рисуется за 30 мкс, что несколько медленнее, чем в слу- чае аналогового генератора векторов. С другой стороны, современ- ные высокопроизводительные дисплеи, использующие цифровое генерирование векторов, могут рисовать короткие векторы за 0,1 мкс, т. е. значительно быстрее, чем аналоговые генераторы. Цифровые генераторы легче калибруются и дешевле, чем аналого- вые. Поскольку быстродействие цифровой логики продолжает уве- личиваться, их производительность в скором времени будет сопоста- вима с производительностью аналоговых генераторов. ★ Критерии оценки. О качестве генераторов векторов судят по их линейности, скорости, постоянству яркости и точности совпаде- ния с граничными точками. Линейность определена в предыдущем разделе. Скорость обычно равна константе или некоторой функции длины вектора. В последнем случае время рисования коротких векторов постоянно, поскольку основную его часть будет составлять время загрузки регистров. Многие генераторы векторов не обеспечивают постоянства яркости: нередко один конец отрезка
Технические средства машинной графики 149 ЦИКЛ: ЗАГРУЗКА X 100 ЗАГРУЗКА У + ПЕРЕМЕЩЕНИЕ 100 ЗАГРУЗКА X 300 ЗАГРУЗКА У + РИСОВАНИЕ 0 ЗАГРУЗКА X 400 ЗАГРУЗКА У + РИСОВАНИЕ 350 ЗАГРУЗКА X 100 ЗАГРУЗКА У+РИСОВАНИЕ 100 ПЕРЕХОД ЦИКЛ Рис. 3.28. Рисование треугольника в абсолютных координатах. а иногда и оба оказываются более яркими. Это объясняется тем, что в этих местах скорость луча меньше нормальной и в единицу време- ни люминофор бомбардируется большим числом электронов. Точ- ность совпадения с граничными точками характеризует точность включения луча в начальной точке вектора и выключения в конеч- ной точке. Один из тестов проверки совпадения заключается в ри- совании точки в позиции В, отрезка из позиции А в позицию В и точ- ки в позиции А. Точки и концы отрезка при этом должны хорошо совпадать. Другой тест состоит в рисовании нескольких отрезков из различных начальных позиций в один общий центр Р: все линии должны закончиться точно в точке Р. 3.3.4. Относительные координаты Сконструированный нами ДП может работать самостоятельно, асинхронно от центрального процессора, однако он не обладает одной важной и обычной для процессоров функцией. Рассмотрим рис. 3.28, на котором приведены изображение треугольника и дис- плейная программа, рисующая его. Все идет хорошо до тех пор, пока в прикладной программе (под управлением пользователя) не возникнет необходимость переместить треугольник в какое-либо другое место экрана, например на 50 единиц влево и на 100 единиц вверх от текущего положения. Существуют два основных способа решения этой задачи. По первому способу прикладная программа может найти описание треугольника в прикладной структуре дан- ных, изменить требуемым образом значения координат вершин и вызвать графический пакет для создания новой дисплейной про-
150 Глава 3 ЦИКЛ: ЗАГРУЗКА X АБСОЛ 100 ЗАГРУЗКА У АБСОЛ+ПЕРЕМЕЩЕНИЕ 100 ЗАГРУЗКА X ОТНОС 200 ЗАГРУЗКА У ОТНОС+РИСОВАНИЕ —100 ЗАГРУЗКА X ОТНОС 100 ЗАГРУЗКА У ОТНОС+РИСОВАНИЕ 350 ЗАГРУЗКА X ОТНОС -300 ЗАГРУЗКА У ОТНОС+РИСОВАНИЕ —250 ПЕРЕХОД ЦИКЛ Рис. 3.29. Рисование треугольника в относительных координатах. граммы. Другой, более эффективный подход состоит в том, что при- кладная программа выдает графическому пакету запрос на изме- . некие сегмента дисплейной программы, который генерирует тре- угольник. Изменение должно заключаться в вычитании 50 из всех х-координат и прибавлении 100 ко всем у-координатам. Для тре- угольника эта процедура может быть выполнена быстро, но для бо- лее сложных объектов она может оказаться более трудоемкой. Еще более просто реализуется перемещение объектов в случае, когда их координаты можно задавать как абсолютными величинами, так и относительными (относительно текущего содержимого Хпред, Упред). В дисплейной программе, приведенной на рис. 3.29, исполь- зуются абсолютные координаты для установки луча в одну вершину треугольника и относительные координаты для рисования самого треугольника. Таким образом, для перемещения треугольника до- статочно модифицировать значения начальных координат х и у, хранящихся в первых двух командах дисплейной программы. Но теперь коды команд ДП должны содержать дополнительный бит, позволяющий отличить абсолютную координату от относитель- ной. Если в текущей команде заданы относительные координаты, для добавления приращений к содержимому регистров X и У ис- пользуется сумматор (рис. 3.30). Для задания относительных координат требуется 11 бит, так чтобы можно было представить величины от —1024 до +1023. Такой диапазон необходим для того, чтобы из любой точки экрана одним позиционированием луча можно было добраться до любой другой точки. Если в текущей команде заданы абсолютные координаты, в сум- маторе открыт только вход А, так что его выход равен входу. При перемещении в приращениях открыты два входа — А и В, причем на вход В подается содержимое соответствующего регистра. В лю- бом случае выход сумматора направляется в регистр, указанный 5 в команде. Отметим, что для сумматора счетчик команд является i таким же регистром, как и все остальные. Переход — абсолютная загрузка счетчика команд, относительный переход — приращение к счетчику команд. Относительные переходы удобны для создания дисплейных программ, легко перемещаемых в основной памяти. Помимо удобств относительные координаты создают также по- тенциальную опасность. Обратимся к программе, приведенной на
Технические средства машинной графики 151 К ЭВМ Рис. 3.30. Дисплейный процессор с сумматором. рис. 3.29, и предположим, что треугольник следует переместить вправо на 720 единиц от текущей начальной точки, х-координата которой равна 100. Новая начальная точка треугольника будет иметь координаты (820, 100), а две другие вершины (1020, 0) и (1120, 350). Последняя вершина находится вне экрана, и изображе- ние, показываемое на экране, искажается, поскольку Х-регистр содержит не 1120, а 96 (десятичный эквивалент младших 10 бит двоичного представления числа 1120). Отрезок прямой из точки (1020, 0) идет не в точку (1120, 350), а в точку (96, 350). Этот непри- ятный эффект, названный в гл. 2 свертыванием, можно устранить двумя способами. Во-первых, поскольку разрядность X- и /-регист- ров составляет 10 бит, графический пакет должен допускать только такие перемещения треугольника по экрану, при которых коорди- наты вершин остаются в диапазоне 0—1023. Во-вторых, можно кон- струировать дисплейные процессоры, снимающие это ограничение и исключающие свертывание (гл. 10). Теперь, когда мы ввели относительные координаты, можно еще немного усовершенствовать ДП. Вспомним, что векторы могут использоваться для изображения символов и кривых. Для этого требуются очень короткие перемещения луча (с рисованием и без рисования), обычно не более 10—20 единиц по каждой оси. При
152 Глава 3 программировании в приращениях такие маленькие перемещения 1 можно закодировать 5 или 6 битами каждое, вместо обычных 111 (10 при абсолютных координатах). Такое неэффективное использо- ванне разрядной сетки примерно удваивает объем дисплейной про- граммы. Решение же довольно просто: необходимо ввести новую команду — загрузка короткого перемещения,— с помощью которой короткое перемещение, короткая точка (перемещение и засветка) или короткий вектор могут быть заданы в одной команде. Это решение имеет, однако, небольшой недостаток — необходимо вво- дить дополнительные коды операций. 3.3.5. Генератор символов В приложениях, требующих вывода значительного объема тек- стовой информации, дисплейные программы будут содержать много коротких перемещений луча. Эго, конечно, лучше, чем применение «длинных» перемещений, и намного лучше, чем применение отдель- ных точек, тем не менее и при таком подходе время ДП и память используются недостаточно эффективно. Обычно время является более важной характеристикой, поскольку оно определяет объем информации, выводимой на экран без мерцания. Аппаратный генератор символов уменьшает память, занимаемую символами, и время их рисования. В нашей системе на вход генера- тора подаются 8-битовые коды литер, а его выходами являются сиг- налы на системы отклонения по х и у, систему управления интенсив- ностью луча и регистры «текущей позиции» Хпред и Уиред. Операндом команды «нарисовать литеры» является цепочка литер, завершае- мая неизображаемым кодом-ограничителем. Рисование цепочки начинается с текущей позиции. После завершения рисования каж- дой литеры генератор увеличивает Хиред на величину, равную сум- ме ширины литеры и межлитерного промежутка. Когда Хпред ста- новится больше 1023 (т. е. достигает правого края экрана), он сбра- сывается в нуль, а У пред уменьшается на величину, равную сумме высоты литеры и расстояния между строками. Большинство коммерческих генераторов символов согласуются с общим функциональным описанием. Некоторые из них не увеличи- вают автоматически Уаред; для этого требуется явное задание в це- почке литер кодов, эквивалентных кодам «возврат каретки» и «пере- вод строки». Некоторые генераторы могут рисовать литеры различ- ного размера, а строки могут быть как горизонтальными, так и вер- тикальными. Быстрые генераторы символов рисуют литеру за 4— 5 мкс, более медленные — за 10—20 мкс. ★ Устройство генератора символов. Генератор символов, полу- чив код литеры, должен так направлять электронный луч и так модулировать его интенсивность, чтобы на экране появилась требуе- мая литера. Информация, необходимая для этого, хранится в по- стоянной или перезаписываемой памяти или в памяти центрального
Технические средства машинной графики 153 процессора. В двух последних случаях значения кодов можно изме- нять таким образом, чтобы определить специальные литеры и лите- ры малого размера. Простейший способ хранения определений литер состоит в хра- нении матрицы точек, описанной выше. Если литеры определены на сетке размером 5x7, то для каждого кода литеры необходимо хра- нить 35 бит. Для более качественного изображения литер необхо- димо использовать сетку размером 7x9 или даже большую. Другой способ хранения определений символов сложнее, но зато дает еще более высокое качество. Как и прежде, используется сетка разме- ром 5x7 (или более частая), но в каждом узле сетки задается чис- ло. Символ определяется как последовательность коротких линий (называемых штрихами) и коротких перемещений между узлами сетки. Таким образом, управление движением луча осуществляется так же, как и при рисовании прямых, но каждое перемещение коди- руется более эффективно: 6 бит указывают узел сетки, а 1 бит уп- равляет лучом (включен—выключен). Эта информация может хра- ниться в памяти с быстрым доступом и в любом случае не дубли- руется в дисплейной программе при каждом повторении литеры на экране. Фактически это дисплейные подпрограммы, с помощью ко- торых рисуются литеры, а генератор символов — механизм, орга- низующий их вызов. 3.3.6. Набор команд дисплейного процессора В предыдущих разделах описан ДП с произвольным сканирова- нием, по функциям и архитектуре аналогичный простым системам, имеющимся в продаже. В данном разделе мы определим формат команд данного ДП в предположении, что длина слова равна 16 бит. На рис. 3.31 приведен набор команд и мнемоник, а на рис. 3.32 — простая дисплейная программа, использующая многие из этих команд. Последняя команда передает управление назад, на начало дисплейной программы. Поскольку в команде установлен бит син- хронизации, ее выполнение будет задержано до следующего импуль- са таймера, работающего с частотой 30 Гц. Такой механизм дает возможность регенерировать изображение с частотой 30 Гц и пред- отвращает более частую регенерацию коротких дисплейных про- грамм, которая могла бы привести к повреждению люминофора. Отметим, что при данном наборе команд для рисования или пере- мещения вдоль вертикальной или горизонтальной оси достаточно одной команды загрузки, поскольку другая координата сохраняет- ся постоянной. Однако смешанные перемещения требуют двух команд загрузки. Эти две загрузки могут следовать в любом по- рядке: х, затем у или у, затем х, но втордя загрузка всегда задает либо операцию перемещения, либо рисование точки, либо рисование вектора. За кодом операции CHAR следует цепочка литер, заклю-
154 Глава 3 Мнемоника. Значение LD(X/Y} (R/A)М Загрузка + перемещение LD(X/Y){R/A] Р Загрузка + точка. LD{X/Y)(R/A}L Загрузка* вектор LD(X/Y){R/A} Загрузка. SM Короткое перемещение SP Короткая точка SL Короткий вектор CHAR Литеры 0MP(R/A)U ПерехоЭ Формат команды l^-l I I I I -l-H..........tH 1-Ну1 | 0 0 0 /'у/5\Ь----Хили Уили I О О 1 /у%|«------х или Уили [ О 1 О -----Хили уили |о 1 1 -----Хили Уили [ 1 О О —| ДХ | I1 О 1 —| ДХ | 11 1 о —| дх | 1 1 1 о--------------1 Char 2 И т 8 до кода-ограничителя 1 1 1 1 % L I------------------------------- Абсолютный или относительный адрес или ДУ ДУ ДУ Char 1 Char 3 ДХили ДУ ДХили ДУ Рис. 3.31. Набор команд дисплейного процессора. X/Y: О->загрузка X, 1->загрузка Y R/A: 0->11 бит ДХ или ДУ, 1->10 бит X или Y { }: выбрать одну из возможных альтернатив L: бит синхронизации, L= 1->задержка перехода до следующего импульса таймера I: бит прерываний; 1= 1->прервать центральный процессор ченная в одиночные кавычки; последней литерой является код-огра- ничитель, останавливающий генератор символов. Имеются два основных отличия между наборами команд дисплей- ного процессора и универсальной ЭВМ. Во-первых, за исключением команды перехода, все команды ДП довольно специализированны: в регистр можно загрузить новое содержимое или добавить к нему некоторое значение, но его нельзя сохранить в памяти, регистр толь- ко управляет лучом. Во-вторых, опять-таки за исключением коман- ды перехода, все данные, с которыми оперируют команды, являют- ся их частью. LDXA 100 означает «загрузить величину 100 в ре- гистр X», а не «загрузить содержимое ячейки с адресом 100 в ре- гистр X», как в случае команды ЭВМ. В некоторых из наиболее со- временных ДП, описанных в гл. 10, это ограничение снимается. 3.3.7. Организация дисплейного процессора на базе запоминающей трубки Запоминающая трубка используется в некоторых изделиях фир- мы Tektronix, таких, как дисплей 4054 (рис. 3.33). В этом устрой- стве имеется собственный буфер для регенерации изображения,
Технические средства машинной графики 155 DEMONSTRATION к КВАДРАТ: LDXA 100 подготовка к рисованию квадрата LDYAM 100 перемещение в (100, 100) LDXRL 800 отрезок в (900, 100) LDYRL 700 отрезок в (900, 800) LDXRL -800 отрезок в (100, 800) LDYRL LDXA —700 отрезок в (100, 100) в на- чальную точку квадрата ТОЧКА: 300 LDYAP 450 точка в (300, 450) РОМБ: LDXA 100 LDYAM 450 перемещение в (100, 450) LDXR 400 LDYRL —350 отрезок в (500, 100) LDXR 400 LDYRL 350 отрезок в (900, 450) LDYR 350 LDXRL —400 отрезок в (500, 800) LDXR —400 LDYRL —350 отрезок в (100, 450) в на- чальную точку ромба ТЕКСТ: LDXA 200 LDYAM 900 перемещение в (200, 900) CHAR * DEMONSTRATION t‘ t — код-ограничитель JMPRL КВАДРАТ регенерация картинки и син- хронизация Рис. 3.32. Дисплейная программа. рисуемого поверх обычного изображения, хранящегося на самой трубке. ДП, описанный в предыдущих разделах, после некоторой модификации мог бы работать в таком же режиме. Для этого до- статочно добавить две команды: «включить режим рисования» (либо с запоминанием, либо поверх запомненного изображения) и «сте- реть». Для того чтобы приспособить наш дисплейный процессор к ис- пользованию запоминающей трубки, следует внести несколько из- менений. Необходимо добавить команду стирания. Можно исклю- чить счетчик команд и команду перехода, поскольку они были вве- дены в состав процессора для того, чтобы сделать возможной авто- номную регенерацию. Исключение регенерации подразумевает так-
156 Глава 3 Рис. 3.33. Дисплей па запоминающей трубке. (С разрешения фирмы Tektronix, Inc.) ; же, что ЭВМ целесообразно выдавать команды в ДП под управле- ’ нием программы по одной, дожидаясь каждый раз, пока ДП устано- вит флаг «готово». Генератор векторов и генератор символов могут быть относительно медленными и, следовательно, менее дорогими, поскольку быстрая регенерация теперь не нужна. 3.4. УСТРОЙСТВА ВВОДА ДЛЯ ДИАЛОГА С ОПЕРАТОРОМ До сих пор ДП описывался только как устройство вывода. Как ) пользователь может взаимодействовать с прикладной программой для того, чтобы удалить линию, добавить новую линию, передви- | нуть линию или проанализировать объект, изображение которого ] показывается на экране? В данном разделе коротко говорится об 1 устройствах ввода, введенных в гл. 2: опрашиваемые валюатор и ло- < катор и вызывающие появление событий алфавитно-цифровая и кно- 1 почная клавиатуры и селектор (световое перо) Эти и другие устрой- | ства подробно описаны в гл. 5. Предположим, что описанный в пре- |
Технические средства машинной графики 157 дыдущих разделах ДП содержит некоторое число регистров, куда устройства ввода помещают соответствующие значения. Устройства, генерирующие события (прерывания), заполняют свои регистры и прерывают центральный процессор, после чего он читает эту ин- формацию. Опрашиваемые устройства заносят данные в свои реги- стры каждый раз, как они опрашиваются центральным процессо- ром. Многим из опрашиваемых устройств требуются услуги анало- гово-цифровых преобразователей, прежде чем они смогут занести в регистры цифровые данные. 3.4.1. Клавиатуры С помощью алфавитно-цифровой клавиатуры вводятся команды, текст и значения параметров. Каждое нажатие клавиши вызывает занесение в регистр литеры 7-битового кода и прерывание централь- ного процессора. Смысл литеры зависит от того, как она интерпрети- руется программой центрального процессора. Программа может накапливать литеры в буфере до тех пор, пока не будет введен код- ограничитель, и тогда алфавитно-цифровая клавиатура является для прикладной программы устройством ввода строки литер (так делается, например, в Простом Графическом Пакете). Кнопочное устройство часто реализуется в виде так называемой программируемой функциональной клавиатуры, имеющей обычно 16—32 кнопки. Нажатие каждой кнопки генерирует индивидуаль- ный 4- или 5-битовый код, заносимый в регистр кнопки. После этого следует прерывание центрального процессора. Другой способ состоит в занесении в специальный регистр 16 или 32 бит, характе- ризующих состояние всех кнопок. При этом появляется возмож- ность нажимать сразу несколько кнопок. В некоторых функцио- нальных клавиатурах в каждую кнопку встроена лампочка, управ- ляемая центральным процессором. Эти лампочки полезны для орга- низации обратной связи с оператором и для указания, какие кнопки можно нажимать в данный момент. 3.4.2. Использование планшета в качестве локатора Планшет, показанный на рис. 1.14, является для пользователя удобным средством ввода координат х и у. Стержень—указатель (ка- рандаш) планшета можно держать в руке как карандаш и водить им по поверхности планшета. В некоторых планшетах для определения координат карандаша используется электрическая связь между ка- рандашом и двумерной сеткой проводов в планшете. Для большин- ства планшетов положение карандаша можег быть определено, если от карандаша до поверхности планшета не более 12 мм. Нажатие карандашом на поверхность вызывает срабатывание микропере- ключателя и прерывание ЭВМ. Таким образом, планшет может слу- жить как локатор с одной кнопкой, вызывающей появление собы- тия.
158 Глава 3 3.4.3. Световое перо как селектор Световое перо (рис. 1.14) является по существу устройством вы- бора элементов или устройством-селектором. Название световое перо на самом деле неверно — перо не испускает свет, с помощью кото- рого рисуются картинки, подобно тому, как авторучка выделяет чернила. На самом деле это чувствительный элемент (детектор), воспринимающий свет от элементов картинки (линий, точек, литер), рисуемых на экране. По-видимому, такое название возникло пото- му, что световое перо все же имеет узкосфокусированный источник света (поисковый луч), направленный к экрану и подсказывающий пользователю, какой элемент изображения находится в данный мо- мент в поле зрения пера. Перо воспринимает резкую вспышку флуоресценции в тот мо- мент, когда электронный луч возбуждает люминофор, т. е. свет, из- лучаемый в тот короткий промежуток времени, когда дисплейный процессор рисует данный элемент картинки. Перо не срабатывает от более продолжительной фосфоресценции или от внешнего ком- натного освещения. Выход пера обычно подключен к управляющей логике ДП таким образом, что процессор прекращает выполнение дисплейных команд при поступлении сигнала от пера. Когда ДП останавливается, счетчик команд содержит адрес, на единицу больший адреса команды, нарисовавшей отмеченный эле- мент (счетчик увеличивается сразу же после выборки команды). Как показано в гл. 4, графический пакет может использовать этот адрес для того, чтобы сообщить прикладной программе имя сегмен- та, содержащего отмеченный элемент. Прикладная программа мо- жет затем выполнить какие-либо операции над сегментом (удалить его или переместить) или над объектом в прикладной структуре данных, соответствующим отмеченному элементу. Для того чтобы графический пакет мог использовать световое перо, счетчик команд ДП должен быть доступен центральному процессору. Ниже подробно говорится о том, что с растровым дисплеем световое перо может работать как локатор, останавливая генера- цию растра в отмеченном пикселе. Координаты (х, у) пиксела дают положение отмеченной точки. 3.4.4. Валюатор Ручки для ввода скалярных величин (рис. 1.14), рукоятки и скользящие потенциометры являются опрашиваемыми устройст- вами, выдающими аналоговые сигналы. При опросе из центрального процессора эти сигналы преобразуются в цифровой вид и записы- ваются в соответствующие регистры. Прежде чем использовать в прикладной программе прочитанные с регистров значения, их надо Преобразовать в формат с плавающей точкой.
Технические средства машинной графики 15? 3.5. ДИСПЛЕЙНЫЙ ПРОЦЕССОР С РАСТРОВЫМ СКАНИРОВАНИЕМ В системе с произвольным сканированием примитивы, состав- ляющие изображение, кодируются командами, в которых исполь- зуются координаты конечных точек векторов. В системах с раст- ровым сканированием кодирование намного проще: рисуемые на экране примитивы разбиваются на составляющие их точки. Основное различие между простым точечным дисплеем с произ- вольным сканированием (который также хранит в памяти для реге- нерации точки) и растровым дисплеем состоит в организации памя- ти, хранящей точки. В точечном дисплее точки, составляющие- каждый примитив, хранятся в памяти последовательно и рисуются в этом же порядке, примитив за примитивом, поскольку луч может двигаться по экрану произвольным образом. В растровом же дис- плее память регенерации организована в виде двумерного массива. Элемент, находящийся на пересечении конкретных строки и столб- ца, хранит значение яркости и/или цвета соответствующей точки экрана. Механизм этого простого взаимнооднозначного соответствия иллюстрируется рис. 3.34 — позиция экрана и элемент в памяти ад- ресуются х-координатой (изменяющейся от 0 до М—1) и «/-коорди- натой (изменяющейся от 0 до М—1). Верхняя строка массива соот- ветствует верхней строке растра и т. д. Регенерация изображения осуществляется последовательным сканированием буфера по стро- кам растра (а не по примитивам, как при произвольном сканиро- вании). Поскольку каждый элемент памяти определяет один элемент изображения (или картинки) размером с точку, каждая точка эк- рана (и соответствующий ей элемент памяти) часто обозначается термином пиксел. В этой книге мы будем использовать термин пик- сел для обозначения точек на экране растрового дисплея, а термины элементы картинки и примитивы вывода — для примитивов более высокого уровня, таких, как линии, точки и литеры. Простой буфер N— 1 f 000011100111110010110 •— • •• У 0 0 X —► м- Буцэер регенерации -1 ЭЛТ Рис. 3.34. Соответствие между строкой в буфере регенерации и строкой растра на ЭЛТ. «1» в буфере отображается в пятно на экране.
160 Глава 3 Рис. 3.35. Система регенерации изображения. Циклически просматривается буфер | регенерации и его содержимое выводится на экран ЭЛТ. ,5 Система вывода, изображения Рис. 3.36. Буфер регенерации и система вывода изображения. регенерации содержит по одному биту на пиксел и, таким образом, определяет двухцветное (обычно черно-белое) изображение. В со- временных' системах буфер регенерации, называемый также буфе- ром кадра или битовой картой, реализуется на твердотельной полу- проводниковой памяти с произвольным доступом. Более ранние растровые дисплеи использовали для хранения изображения меха- нические барабаны, линии задержки или твердотельные сдвиговые регистры. Задача системы вывода изображения (рис. 3.35) состоит в цикли- ческом просмотре буфера регенерации по строкам (следовательно, по строкам растра) обычно 30 или 60 раз в 1 с. Адреса памяти генерируются синхронно с координатами растра, и содержимое вы- бранных элементов памяти используется для управления интенсив- ностью электронного луча. Общая организация системы вывода изображения приведена на рис. 3.36. Генератор растровой разверт- ки формирует сигналы отклонения и управляет адресными X- и У- регистрами, определяющими следующий элемент буфера регене- рации. В начале цикла регенерации в Х-регистр записывается 0, а в У-регистр — X—1 (верхняя строка растра). По мере того как гене- рируется первая строка растра, х-адрес увеличивается до М.—1, при этом значение каждого пиксела извлекается из памяти и ис- пользуется для управления интенсивностью электронного луча После генерации первой строки растра х-адрес опять записывается 0, а т/-адрес уменьшается на 1. Этот процесс продолжается до генера ции последней строки растра (г/=0).
Технические средства машинной графики 161 Иногда система регенерации изображения устроена так, что по окончании растра она вырабатывает для ЭВМ сигнал прерывания. ЭВМ может произвести изменения в хранящемся в памяти изобра- жении. Для этого у нее есть 1,3 мс — время обратного хода, в те- чение которого электронный луч перемещается из правого нижнего в левый верхний угол экрана. Если изменения требуют большего времени, ЭВМ может остановить систему регенерации. Изменения можно также производить и во время процесса регенерации, но при этом наблюдатель будет видеть частично измененное изображение, что иногда нежелательно. Часто система регенерации выполняет перемежающееся скани- рование двух полей, как это происходит в бытовых телевизионных приемниках. Цикл регенерации разбивается на две фазы по 1/60 с каждая, так что полный цикл по-прежнему занимает 1/30 с. В пер- вой фазе регенерируются все нечетные строки растра (первое поле), во второй фазе — все четные строки (второе поле). Цель чересстроч- ного сканирования состоит в том, чтобы поместить новую информа- цию во все области экрана за 1/60 с и тем самым предотвратить мерцание изображения, формируемого при растровом сканировании с периодом регенерации, равным 1/30 с. Эффективная частота реге- нерации результирующей картинки ближе к 60 Гц, чем к 30 Гц. Все это верно до тех пор, пока смежные строки растра изображают аналогичную информацию. В некоторых растровых дисплеях используется развертка с пов- торяющимся полем: все изображение рисуется 60 раз в 1 с. Это не- сложно сделать, когда экран содержит 512x512 точек; с ростом же разрешающей способности трудности также возрастают. При числе точек 512x512 и частоте регенерации 30 Гц на каждую строку ра- стра должно тратиться ~60 мкс, т. е. на один пиксел тратится ~ 100 нс. При повторяющемся поле эта цифра уменьшается до 50 нс. В системах с высокой разрешающей способностью, содержащих 1280X1024 точек, на строку растра должно тратиться ~30 мкс, т. е. на пиксел выделяется 25 нс. Уменьшение этого времени в 2 ра- за для дисплеев с повторяющимся полем означает, что один пиксел должен отрабатываться за 12 нс. Это означает, что усилители от- клоняющей системы и усилитель, управляющий интенсивностью луча, должны быть очень широкополосными, а скорость передачи данных между буфером регенерации и системой формирования изображения должна быть увеличена. Причина низкой стоимости простых растровых дисплеев очевид- на: их основные компоненты представляют собой полупроводнико- вую память, некоторые логические схемы, генератор развертки и телевизионный монитор. Поскольку мы отказались от произволь- ного рисования векторов, то отпала необходимость в быстрых, линейных, точных генераторах векторов и связанных сними высоко- точных усилителях отклоняющей системы. Для дисплеев со средней разрешающей способностью (256X256) можно использовать хорошо
162 Глава 3 отработанные и недорогие системы отклонения и управления интенЯ сивностью луча бытовых телевизионных приемников. Кроме тогоя в случае растровых дисплеев имеется хорошая база для созданиет систем, формирующих изображение с непрерывным уровнем тонет или цвета, и систем, накладывающих изображение из буфера регене-1 рации на стандартное телевизионное изображение, поступающее от! телевизионной камеры, видеомагнитофона и видеодиска Наконец,! для растровых дисплеев не существует проблемы мерцания изобра-1 жения независимо от его сложности. За исключением приложений,! требующих произвольных перемещений луча, растровая техноло-1 гия с ее возможностью быстрого изменения изображения и с высо-1 кой разрешающей способностью в настоящее время имеет больше ’ преимуществ перед векторной (по соотношению стоимости и произ- водительности). 3.5.1. Цветные и тоновые растровые дисплеи Изображения с двумя уровнями яркости пригодны для многих приложений, но имеются приложения, в которых это ограничение оказывается достаточно сильным. Дополнительные возможности управления яркостью можно получить, храня в каждом пикселе не- сколько битов (два бита — четыре яркости и т. д.) Эти биты можно использовать для управления не только яркостью, но и цветом. Возникает вопрос: сколько битов должен содержать пиксел, чтобы изображение воспринималось наблюдателем как имеющее непрерывные уровни тона? Часто оказывается достаточно 5 или 6 бит, но может потребоваться и 8 бит. Для цветных дисплеев требует- ся примерно в три раза больше битов — по восемь на каждый из > трех основных цветов: красный, синий и зеленый (гл. 17). Несмотря на значительное снижение стоимости твердотельной памяти с произвольным доступом, системы с 24 бит на пиксел все же относительно дороги. Кроме того, во многих приложениях не требуется, чтобы в одной картинке (обычно от 214 до 220 пикселов) фигурировало до 224 различных цветовых оттенков. С другой сто- роны, часто необходимо иметь относительно небольшое число цве- j товых оттенков в одном приложении или в одной картинке и иметь < возможность изменять цвета от приложения к приложению или от * картинки к картинке. Кроме того, во многих приложениях, связан- 1 ных с анализом и улучшением изображений, желательна возмож- s носгь изменения изображения визуально без изменения данных, ’’ определяющих его. Например, пользователю может потребоваться • изобразить все пикселы со значениями, меньшими некоторого по- рога, как пустые, расширить границы изменения яркости или соз- } да!Ь из одноцветного изображения псевдоцветное. 9 Поэтому разработчики часто включают в состав системы регене- 1 рации растровых дисплеев так называемую таблицу цветов (назы- 1 ваемую также картой цветов). Значение пиксела не направляется”!
Технические средства машинной графики 163 сразу на цифро-аналоговый преобразователь схемы управления яркостью, а используется как индекс в таблице цветов. Для управ- ления яркостью или цветом используется значение, извлеченное из таблицы по этому индексу. Например, значение пиксела 67 привело бы к извлечению из таблицы элемента с номером 67 и ис- пользованию его для управления электронным лучом. Эта операция поиска в таблице выполняется для каждого пиксела в каждом цикле рисования, поэтому доступ к таблице должен быть очень быстрым. При изображении, содержащем 512x512 точек, на обработку каж- дого пиксела выделяется ~100 нс. Управляющая дисплеем ЭВМ должна иметь возможность формировать и изменять таблицу по команде от программы. Число элементов в таблице равно числу возможных значений пиксела. Буфер регенерации Экран ЭЛТ Рис. 3.37. Таблица цветов. Изображен пиксел со значением 67. На рис. 3.37 приведена система, в которой каждый пиксел содер- жит N битов, а элемент таблицы цветов — W битов. Тем самым для одноцветных ЭЛТ определены 2W уровней яркости. В случае цвет- ной ЭЛТ с теневой маской W битов обычно разбиваются на три рав- ные группы, управляющие красным, синим и зеленым электронны- ми прожекторами. Иногда прикладная программа использует дру- гое, кажущееся более естественным представление цветов (такое, как интенсивность и сила цвета) и хранит его в буфере регенерации. Данное представление преобразуется в сигналы управления крас- ным, синим и зеленым цветом с помощью таблицы с фиксированным содержанием, определяющей связь интенсивности/силы цвета с крас- ным/зеленым/синим цветами. Это и другие представления цветов обсуждаются в гл. 17. 3.5.2. Создание изображения Как создается изображение? Изображения реальных объектов поступают прямо или косвенно со сканирующего устройства того или иного вида: сканер кино- или фотопленки, телевизионный ска- нер, ультразвуковой сканер и т. д. Однако здесь обсуждаются во-
164 Глава 3 устройство. Рис. 3.38. Полная растровая дисплейная система. просы, связанные с созданием искусственных изображений: изобра- жений объектов, существующих как абстрактные совокупности прямых линий, точек, кривых, областей и т. д. в памяти ЭВМ — что прежде всего характерно для интерактивной машинной графики. Существует фундаментальное несоответствие между двумерным массивом значений пикселов, используемым для управления раст- ровой системой, и представлением объектов, с которыми имеет дело прикладная программа в виде линий, точек и областей. Впервые мы столкнулись с этим несоответствием, когда обсуждали возможности использования печатающих устройств как графических устройств с растровым сканированием, с помощью которых можно получать твердые копии (разд. 3.1.1). Процесс преобразования представления в виде линий, точек и областей в массив пикселов в буфере регене- рации называется процессом развертки. На рис. 3.22 представлен простой алгоритм развертки Другие алгоритмы для преобразова- ния линий, а также областей и окружностей обсуждаются в гл. 11. Пока нам достаточно знать, что такие алгоритмы существуют и их необходимо выполнять каждый раз, когда некоторая часть или все изображение изменяется Поэтому процесс развертки может ока- заться основным узким местом при обновлении картинки. Поскольку алгоритмы развертки требуются во всех системах растрового сканирования, предназначенных для интерактивной графики, их часто встраивают в растровые дисплеи в виде еще одного функционального блока системы создания изображения (рис. 3.38). Получаемая в результате совокупная растровая система очень близка по своим возможностям к дисплейному процессору с произвольным сканированием. Эта система управляется дисплей- ной программой, общая форма которой обсуждалась в разд. 3.3.6. В данном случае дисплейные команды не используются непосредст- венно для управления ЭЛТ, а преобразуются в более простое пред- ставление — буфер регенерации. Конечно, такое преобразование осуществляется для данной картинки только один раз. Набор команд растрового дисплея обычно содержит команды для построения точек, отрезков прямой, конических сечений, сплош- ных областей и текста. Можно управлять различными атрибутами этих примитивов, такими, как цвет или яркость, вид линии (сплош- ная, штриховая, штрихпунктирная и т. д.), местоположение текста, его ориентация, шрифт и размер символов. Координаты обычно за-
Технические средства машинной графики 165 даются в системе координат буфера регенерации: если буфер имеет размеры 512X512, то и координаты изменяются от 0 до 511 по каж- дой оси. Обычно система создания изображения может воспринимать изображения, которые уже имеют форму массива пикселов — изоб- ражения реальных объектов или изображения искусственных объ- ектов, уже прошедшие преобразование развертки. В буфере можно перемещать часть описания изображения, имеющую форму прямо- угольной области. Обычно система создания изображения может формировать таблицу цветов, запускать и останавливать регенера- цию изображения и взаимодействовать с диалоговыми устройст- вами в значительной мере так же, как и векторные дисплеи. Хотя между растровыми и векторными дисплеями, конечно, су- ществуют непростые различия (обсуждаемые в гл. 10 и 12), в не- скольких следующих главах они будут рассматриваться как прак- тически эквивалентные для пользователя и прикладного програм- миста. Таким образом, до определенного времени мы не будем ис- пользовать возможность растрового дисплея изображать сплошные области. УПРАЖНЕНИЯ 3.1. Модифицируйте алгоритм рисования прямых, приведенный на рис. 3.22, таким образом, чтобы он мог рисовать прямые с любыми углами наклона. Реали- зуйте алгоритм и проверьте его, наблюдая результаты его работы для прямых с раз- ными углами наклона. 3.2. Постройте набор команд дисплейного процессора, где в каждую команду (перемещение, точка, вектор) входят х- и у-координаты, возможно, что для этого потребуются команды из нескольких слов. Сделайте это для слова длиной 16 бит и 24 бит. 3.3. Расширьте набор команд дисплейного процессора из разд. 3.3.6 таким образом, чтобы можно было задавать два вида линии (например, сплошная и пунк- тирная) и четыре уровня яркости. Сделайте это двумя различными способами: 1) включите указатели вида линии и яркости в каждую дисплейную команду; 2) сконструируйте команды для загрузки регистров вида линии и яркости. Значе- ния регистров определяют режим рисования всех последующих примитивов до тех пор, пока эти значения не будут изменены. 3.4. Составьте список достоинств и недостатков регенерируемых дисплеев с произвольным сканированием, дисплеев с произвольным сканированием на за- поминающих трубках и регенерируемых растровых дисплеев. 3.5. В некоторых растровых системах буфер регенерации является частью памяти системы создания изображения, в то время как в других он выделен в от- дельную память. Опишите возможные достоинства и недостатки каждой конфигу- рации. 3.6. Подготовьте доклад по методам создания дисплеев с большим экраном. 3.7. Перекомпонуйте простой набор команд дисплейного процессора с рис. 3.31 для 16-битового слова в предположении, что все команды имеют одина- ковую длину. 3.8. Измените программу рисования литер (рис. 3.24) таким образом, чтобы она могла рисовать литеры разного размера и различной ориентации. 3.9. Если люминофоры с длительным послесвечением уменьшают частоту слияния, почему нельзя использовать их повсеместно?
166 Глава 3 3.10. Если мы имеем электростатический графопостроитель с шириной бу- маги 22,5 см, разрешающей способностью 80 точек на 1 см и скоростью движения бумаги 7,5 см/с, то сколько битов в 1 с надо выдавать из ЭВМ для того, чтобы бу- мага могла двигаться с максимальной скоростью? 3.11. Какими средствами можно реализовать устройство для выбора линий на экране растрового дисплея (аналогично световому перу), если аппаратно может быть зафиксирован только один пиксел? 3.12. Для растрового дисплея с буфером регенерации 1024X1280 вычислите число пикселов, доступ к которым осуществляется за 1 с, и наоборот, время, вы- деляемое на доступ к одному пикселу. 3.13. Сколько времени займет заполнение буфера регенерации размером 512X512 бит, если пикселы упакованы по 8 в 1 байт, а скорость передачи и рас- паковки байтов может достигать 100 000 в 1 с? 3.14. Сколько времени в вашем микропроцессоре займет преобразование развертки для 1000 отрезков, каждый из которых имеет длину 512 пикселов?
Глава 4 Реализация простого графического пакета 4.1. ОБЩЕЕ ОПИСАНИЕ ПРОСТОГО ГРАФИЧЕСКОГО ПАКЕТА 4.1.1. Введение В гл. 2 показано, как можно писать высокоуровневые, не при- вязанные к конкретным ЭВМ и устройству графические прикладные программы, используя независимый от устройства пакет подпро- грамм — простой графический пакет [ПГП1. Этот пакет позволяет изображать двумерные объекты и организует связь прикладной программы с диалоговыми устройствами, что создает предпосылки для интерактивного режима работы. В гл. 3 описана архитектура простых векторных и растровых дисплеев с регенерацией изображе- ния. В данной главе показано, как реализовать ПГП на базе таких устройств. При изучении интерактивной графики обсуждение вну- тренней организации и структуры независимых от устройств графи- ческих пакетов является важной темой. Ниже рассмотрены струк- туры программ и данных, типичные для хорошо известных незави- симых от устройства пакетов, таких, как GINO-F [101], GPGS [475] и Core [2031. Дополнительные, более сложные функции графиче- ских пакетов, такие, как изображение трехмерных объектов и обес- печение работы с более сложными устройствами отображения, об- суждаются в последующих главах. Принципы реализации, рассмотренные в данной главе, приме- нимы и к векторным, и к растровым дисплеям с регенерацией изоб- ражения, если не указано противное. Это объясняется тем, что, как показано в разд. 2.19, растровые дисплеи можно программировать по существу так же, как если бы они были векторными, с дополни- тельной возможностью изображения сплошных областей из много- угольников. Более полное использование возможностей растровых дисплеев обсуждается в гл. II и 12. Поскольку обычно растровые дисплеи сами осуществляют развертку примитивов в свое внутрен- нее представление в виде битовой карты, при реализации ПГП этот процесс не рассматривается. Функциональные возможности ПГП (и большинства других пакетов), доступные прикладному программисту, могут быть раз- делены на шесть классов, краткая характеристика которых приве- дена ниже, а полный состав определен в табл. 4.1. 1. Графические примитивы—подпрограммы, формирующие команды дисплейного процессора, которые либо рисуют изображе-
168 Глава 4 Таблица 4.1. Подпрограммы ПГП. Общий формат 1. Графические примитивы вывода Функция M0VE_ABS-2(x, у) Перемещает текущую позицию (ТП) в точку (х, у) M0VE-REL_2(dx, dy) Перемещает ТП в (ТП^-f-dx, ТП„ -|- + dy) POINT-ABS-2(x, у) Определяет точку в (х, у) POI NT - REL-2(dx, dy) Определяет точку в (ТПх + йх, ТП!.-|- + dy) L1NE_ABS_ 2(x, y) Определяет отрезок прямой от ТП до (х, у) LINE-REL-2(dx, dy) Определяет отрезок от ТП до (ТПХ -ф- + dx, ТП^-j-dz/) POLY GO N(x-array, у-array, n) Определяет замкнутую ломаную с п вершинами, начинающуюся в (х-аггау [1], y-array [1]) TEXT (string) Определяет начинающуюся в ТП це- почку литер string 2. Установка атрибутов SET-LI NEST YLE (style) Устанавливает вид линии для всех последующих примитивов (до следу- ющей установки) SET .COLOR(color) i Устанавливает цвет для всех после- дующих примитивов (до следующей установки) 3. Управление сегментами CREATESEGMENT (segment-na- Начинает новый сегмент с целочислен- me) ным именем segment-пате CLOSE-SEGMENT Закрывает открытый в данный момент сегмент DELETE - SE GMENT (segment _ na- me) Удаляет сегмент segment-пате REN AME-SEGMENT .old-name, Переименовывает сегмент old-name в new-name) new ~ пате SET -VISIB1L1TY (segment _ name, Делает сегмент segment-пате видимым on/off) или невидимым TRANSLATE-IMAGE_2(seg- Сдвигает изображение сегмента seg- ment-name, dx, dy) ment_name на dx, dy в нормирован- ных координатах 4. Видовая операция 1 WINDOW(x-tnin, x_max, y-tnin, Определяет окно в мировых коорди- у-max) натах V1EWP0RT-2(x-tnin, x-max. Определяет поле вывода в нормиро- У-min, y-max) 5. Ввод ванных координатах READ-LOCATOR(x, у) Опрашивает положение локатора на экране; выдает в х, у его координаты в нормированных координатах
Реализация простого графического пакета 169 Продолжение табл. 4.1 READ_VALUAT()R(n, value) W AIT-BUTTON (time, bul ton „na- me) 1 W AIT _P ICK(time, segment-na- me) 1 WAlT_REYBOARD(time, text, length) 1 INVE RSE-2(x-ndc, y„ndc, x„wc, У-wc) 6. Управление INITIALIZE TERMINATE IN QU I RE-COLOR Опрашивает л-й валюатор; выдает в value его значение в виде дроби от О до 1 Выдает 0 или имя нажатой кнопки в button „пате Выдает 0 или имя сегмента, содержа- щего выбранные примитивы в seg- ment-name Читает вводимые пользователем лите- ры в text, выдает 0 или число введен- ных литер в length Преобразует х, у из нормированных координат x-ndc, y„ndc (обычно по- лучены от локатора) в мировые коор- динаты x_wc, y-wc в соответствии с текущими определениями окна и поля вывода Очищает экран; устанавливает стан- дартные параметры окна и поля вы- вода; курсор помещается в точку х, у, заданную локатором Очищает экран и закрывает графиче- ское устройство Возвращает текущее значение атрибу- та' цвета 1 Каждая из подпрограмм WAIT ожидает либо истечения указанного интервала вре- мени (в этом случае она возвращает 0), либо событий, активированных пользователем (в этом случае возвращает связанные с событием данные). ние на видовой поверхности, либо помогают ПГП управлять гене- рацией и структурой дисплейной программы. 2. Установка атрибутов — подпрограммы, определяющие вид всех последующих линий и цвет всех последующих примитивов. 3. Управление сегментами — подпрограммы, группирующие ло- гически связанные примитивы в сегменты (минимальная единица дисплейной программы, доступная выборочному изменению). Име- ются подпрограммы для удаления, переименования или изменения видимости сегментов и перемещения на экране изображения, созда- ваемого сегментом. 4. Видовая операция — две функции, в совокупности определяю- щие изображаемую область в мировой системе координат и часть экрана, в которую она будет отображаться. 5. Ввод — подпрограммы, управляющие взаимодействием поль- зователя с прикладной программой. 6. Управление — подпрограмма INITIALIZE (инициализация)
170 Глава 4 помогает пакету инициализировать его таблицы, состояние дисплей- ного процессора и признаки/регистры режимов. Устанавливаются также стандартные размеры окна (единичный квадрат) и поля вы- вода (весь экран). Подпрограмма TERMI NATE (завершить) (ис- пользуется в CLEANUP, описанной в гл. 2) очищает экран и «за- крывает» графическое устройство для того, чтобы обеспечить пра- вильное завершение работы. Подпрограмма INQUIRE_COLOR (опросить, цвет) используется для запоминания и восстановления значения цвета. (Другие подпрограммы типа INQUIRE в таблице не приводятся.) В последующих главах к ПГП добавляются новые возможности главным образом для работы с трехмерными объектами и для ис- пользования особенностей растровых графических систем. 4.1.2. Блок-схема графической системы На рис. 4.1 приведена в расширенном виде блок-схема графиче- ской системы, показанной на рис. 2.1; она дает общее представление об основных компонентах типичной графической системы: аппарат- ных, программных и информационных модулях. Двумя наиболее Рис. 4.1. Основные аппаратные, программные и информационные модули графи- ческой системы важными аппаратными компонентами являются основная (базовая) ЭВМ и дисплейный процессор (ДП). Процессор основной ЭВМ (центральный процессор) и память, совместно используемая им и ДП, на рисунке для простоты не показаны. В этой разделяемой па- мяти размещаются два важных информационных модуля, приве- денные на рисунке. Первым модулем является выполняемая ДП дисплейная программа (называемая также дисплейным файлом). Она формируется графическим пакетом и читается ДП во время
Реализация простого графического пакета 171 Мировые коорЗинаты Примитивы вывоза •у ГГ Процессор 1 видовой операции Нормированные координаты “* Прикладная программа Задание'1 видовой ________операции Остановка атрибутов Физические координаты .Генератор | . Сегментированная: дисплейных —— команд 3 вЭисплейная ggjjn ' = программам Физические координаты Управление сегментами reao valuator R£AD_IOCATOR WAIT_BUTTON WAlT.PICK WAlT.KfYSOARD I Интерфейс I между прикладной j программой и ПГП Изменение дисплейной программы для обеспечения эхо _ Программа, обслуживающая устройства ввода г Канал ввода | Простой графический пакет ПГП дСпоавочник= в сегментоац Вводимые данные Интерфейс между ПГП и дисплейным процессором Дисплейный Интерфейс между дисплейным процессором и пользо- вателем Рис. 4.2. Блок-схема графического пакета. Канал вывода: прикладная структура данных изображение. Канал ввода: действия пользователя -♦ . . . при- кладная структура данных. регенерации изображения на экране. Вторым модулем является прикладная структура данных (или для краткости, структура данных), которая содержит наряду с другой информацией описание объектов, изображения которых должны показываться на экране. Эту структуру называют также моделью объектов. На рис. 4.2 часть схемы, приведенной на рис. 4.1, показана бб- лее подробно. Три основных процесса ПГП с номерами 2, 3 и 5 на рисунке изображены как чисто программные модули, хотя в более сложных системах части этих процессов могут на самом деле реали- зовываться аппаратным или микропрограммным способом. Взаимо- действие между всеми пятью процессами лучше всего понять, если изучить два основных потока данных в графической системе, имею- щие противоположные направления: от описания объекта в струк- туре данных к его изображению на экране и от активируемых поль- зователем устройств ввода к структуре данных и/или дисплейной программе. Существуют несколько подходов к описанию последовательности преобразований данных «объект — изображение». Один из них со- стоит в использовании понятия канала: четырехэтапный канал вывода последовательно преобразует описание объекта во все более машинно-зависимые представления и в конце концов получается
172 Глава 4 изображение на экране. На первом этапе, реализуемом прикладной программой, происходит преобразование части структуры данных, моделирующей геометрию (расположение) и топологию (связность) объекта (такого, как электрический контур), в последовательность вызовов подпрограмм ПГП с параметрами, извлеченными из струк- туры данных. Как показано в гл. 2, эти вызовы описывают объект в терминах точек, линий и текста (примитивов вывода). Другие вызовы специфицируют деление объекта на логические единицы, т. е. сегменты, и определяют желаемый вид объекта. Определение видовой операции можно представить как настройку воображаемой фотокамеры. На втором этапе в канале вывода работает процессор видовой операции, который, используя параметры, заданные на первом этапе, осуществляет отсечение примитивов объекта, выходящих за границы заданного пользователем или стандартного окна, и затем отображает видимую часть объекта в текущее поле вывода. На третьем этапе генератор команд дисплейного процессора преобра- зует независимые от устройства спецификации примитивов (после отсечения) в нормированных координатах в команды данного кон- кретного дисплейного процессора. Соответствующие подпрограммы ПГП управляют сегментацией этого «машинного кода» и указывают генератору команд, какие сегменты необходимо добавить к дисплей- ной программе, какие сделать видимыми или невидимыми, какие передвинуть или удалить. Четвертый этап в канале относится к ДП, который преобразует примитивы вывода в световое излучение экрана, чернила или краситель на листе бумаги. (В растровых сис- темах это преобразование обычно содержит дополнительное преоб- разование развертки, за которым следует регенерация изображения по полученной битовой карте.) На основании материала, изложенного в предыдущем разделе, можно дать другую интерпретацию канала вывода: «дисплейный компилятор» осуществляет трансляцию дисплейной программы с машинно-независимого представления на языке высокого уровня (графическая программа в виде вызовов подпрограмм ПГП) в ма- шинно-зависимый код низкого уровня для конкретного ДП. Тогда сегменты примерно соответствуют загрузочным модулям объектного кода, которые можно подключать к программе, отключать и уда- лять во время ее выполнения. В разд. 4.3 показано, что для управ- ления этой динамически меняющейся структурой в ПГП может использоваться дополнительная структура данных — справочник сегментов. Компиляция дисплейной программы в отличие от обычной ком- пиляции осуществляется во время выполнения прикладной про- граммы, когда состояние, логика работы или параметры вызовов в «исходной» программе, имеющей вид обращений к подпрограммам ПГП, изменяются в результате ее взаимодействия с пользователем. Повторная компиляция измененных сегментов в какой-то степени
Реализация простого графического пакета 173 аналогична пошаговой компиляции. Другое существенное отличие от обычной компиляции состоит в том, что «исходный» ПГП-код может быть уменьшен в результате отсечения до некоторого подмно- жества, прежде чем будет произведена компиляция в «конечный» код ДП; при обычной компиляции исходный код компилируется целиком 1). Отметим, что взаимосвязь выполнения процессора видовой опе- рации и генератора дисплейных команд нами не определяется. Здесь возможны две альтернативные стратегии: 1) примитив, за- данный в нормированных координатах, после операции отсечения отображается из окна в поле вывода и сразу же преобразуется в код дисплейного процессора; 2) эти два процессора взаимодейст- вуют через промежуточную структуру данных, которая содержит примитивы, заданные в нормированных координатах после опера- ции отсечения. Можно провести аналогию между таким промежу- точным представлением и используемым в процессе компиляции промежуточным кодом. В любом случае декомпозиция дисплейного компилятора на два независимых модуля (видовая операция и гене- рация команд) полезна, поскольку позволяет легко добавлять к ком- пилятору генераторы команд для новых дисплейных устройств. Как показано ниже (в разд. 4.8), эти генераторы могут совместно использовать независимый от устройства процессор видовой опе- рации. В канале ввода этапов меньше да и аналогия с процессом компи- ляции не годится. ДП регистрирует факт использования устройства ввода и либо прерывает центральный процессор (для устройств, вызывающих события, таких, как селектор, кнопка, клавиатура), ^ибо передает данные по запросу (для опрашиваемых устройств, таких, как локатор, валюатор). Ввод данных от ДП осуществляет специальная программа ввода, которая обычно передает их приклад- ной программе. Эги данные изменяют состояние или логику при- кладной программы. Они могут также побудить прикладную про- грамму модифицировать структуру данных (и, возможно, соответ- ствующие параметры в обращениях к подпрограммам ПГП) или из- менить параметры видовой операции. Введенные данные могут так- же непосредственно использоваться генератором команд для выпол- нения операций манипулирования сегментами. Как уже говорилось в гл. 2, в настоящее время эффективность труда программиста имеет большее значение, чем эффективность программы. Тем не менее создатели графических пакетов и при- кладных программ должны делать каналы ввода-вывода как можно более эффективными, поскольку заметные задержки ответа (превы- шающие доли секунды), разрывающие цикл взаимодействия поль- 11 На самом деле в оптимизирующих «обычных» компиляторах выполняется преобразование, в результате которого исключаются изолированные (недоступ- ные) участки — так называемые «мертвые вычисления».— Прим. ред.
174 Глава 4 Отображение содержимого окна, на экран Примитивы вывода в мировых координатах ~ (из прикладной программы; Отсечение по окну Отображение содержимого окна в поле Вывода в нормированных координатах Преобразование в физические координаты Видовая операция Генерация команд дисплейного процессора Рис. 4.3. Отображение мировых координат в координаты устройства. зователя с ЭВМ, фактически снижают производительность пользо- вателя, работающего с терминалом (слежение за курсором должно, конечно, осуществляться вообще без видимых задержек). Короче говоря, реакция на действие пользователя должна быть почти немедленной, т. е. обратная связь не должна приводить к наруше- ниям в координации глаз и рук человека. Управляемое пользова- телем движение и генерация динамического изображения на век- торных дисплеях с регенерацией изображения являются хорошими примерами задач, где необходимо соблюдать этот принцип. Даже если такая динамика нереализуема, можно попытаться путем тща- тельного проектирования минимизировать неприятные разрывы в изображении, вызываемые мерцанием или скачкообразным перехо- дом от одного изображения к другому, и обеспечить немедленную обратную связь на любое действие пользователя, и таким образом показать последнему, что его запрос обрабатывается. 4.2. ВИДОВАЯ ОПЕРАЦИЯ Процессы 2 и 3 в канале вывода (рис. 4.2) служат для преобра- зования независимого от устройства описания объеко в дисплейную программу конкретного устройства, которая генерирует изображе- ние, являющееся частным видом объекта. На рис. 4.3 более подроб- но показаны три шага, выполняемые этими двумя процессами: отсечение, отображение окна в поле вывода и генерация дисплейных команд в физических координатах экрана конкрегного устройства Первые два шага обычно считаются частью видовой операции, в то время как третий входит в процесс генерации команд ДП. (Видо- вая операция также может преобразовать примитивы непосредст- венно в физические координаты; см. разд. 4.2.2.) В этом разделе рассмотрены первые два шага.' отсечение и преобразование «окно — поле вывода», которое отображает оставшиеся после отсечения при- митивы, заданные в мировых координатах, в примитивы, заданные в нормированных координатах.
Реализация простого графического пакета 175 Рис. 4.4. Двумерное отсечение. Некоторые отрезки и границы окна продолжены (штриховые линии) для нахождения точек пересечения. 4.2.1. Отсечение примитивов вывода Рис. 4.4 иллюстрирует операцию отсечения точек, линий и це- почек литер для типичного вертикального прямоугольного окна. Точка А находится внутри окна и поэтому она изображается внутри ноля вывода на видовой поверхности. Точка В находится вне окна и поэтому она не изображается. Отрезок прямой EF изображается полностью, отрезки GH и IJ изображаются частично (отсекаются), a CD и KL не изображаются совсем. Текстовая строка YES не изоб- ражается, строка HELLO изображается, а строка WAIT отсекается и затем изображается. Работа с текстом (поворот и отсечение) по- казана здесь на уровне отдельных литер. Ниже мы увидим, что ап- паратура и даже программное обеспечение могут не обеспечивать такую точность. Отметим, что отрезки, пересекающие прямоуголь- ное окно (или любой выпуклый многоугольник), в результате от- сечения всегда превращаются в один отрезок, такой, как ГJ' часть IJ. Точки и отрезки, находящиеся на границе окна, считаются вну- тренними и как следствие изображаются. Сначала мы рассмотрим отсечение точек и отрезков прямых, а затем отсечение текста. В гл. 8 и 11 рассматриваются соответст- венно отсечение в трехмерном пространстве и отсечение по много- угольному окну.
176 Глава 4 Точки. Отсечение точек осуществляется довольно просто. Если! xmin и хтах — х-координаты границ окна, a z/min и z/max — у-коор-1 динаты, то, для того чтобы точка (х, у) была видимой, должны' удовлетворяться четыре неравенства: . -^min % -^тах, Ут1п У Утах- Если хотя бы одно из этих неравенств неверно, точка не изобра- жается. Отрезки. Отсечение отрезков прямых в общем случае требует большего числа проверок и вычислений, чем отсечение точек. К счастью, достаточно рассмотреть только конечные точки отрезка, не принимая во внимание бесконечное множество внутренних точек. Прежде всего можно быстро разобраться с классом отрезков (при- мером является отрезок EF на рис. 4.4), обе конечные точки кото- рых лежат внутри окна. Такие отрезки целиком находятся внутри прямоугольного окна и, следовательно, могут быть приняты цели- ком. Отрезки, одна конечная точка которых находится внутри окна, а другая вне его, требуют операции отсечения (отрезок GH на рис. 4.4). Отрезки, обе конечные точки которых находятся вне окна, необходимо проверить по границам окна, чтобы выявить возможное пересечение с окном; при обнаружении пересечения необходимо отсечение. (На рис. 4.4 отрезки CD и KL не попада- ют в окно, в то время как IJ должен отсекаться.) Один из очевидных способов отсечения отрезков, которые нельзя принять целиком, состоит в определении точек пересечения прямой, содержащей отрезок, с каждой из четырех прямых, на которых ле- жат границы окна, и проверки, не лежит ли хотя бы одна точка пере- сечения на границе; если лежит, то отрезок частично находится в окне. Таким образом, для каждого отрезка и для каждой стороны окна необходимо взять две математически бесконечные прямые линии, содержащие их, и найти точку пересечения. Затем необхо- димо проверить, не является ли точка пересечения внутренней, т. е. лежащей одновременно и на отрезке, и на стороне окна. Если да, то имеет место пересечение отрезка с окном (на рис. 4.4 точки Г и G'— внутренние точки, а С и К' нет). К сожалению, при таком подходе для каждой пары (сторона — отрезок) необходимо решать систему двух уравнений, используя операции умножения и деления. При этом удобно параметрическое задание прямых: Х = X±-\-t (Х2—Xj), У = У1 + Цу2 — У1)- Для t из диапазона (0, 11 эти уравнения определяют точки (х, у), находящиеся на ориентированном отрезке прямой, начинающемся в точке (xi, У1) и заканчивающемся в точке (ха, уг). При использова- нии параметрической формы задания прямых для нахождения точки пересечения необходимо решить систему уравнений относительно
Реализация простого графического пакета 17? /сторона и /отрезок Если найденные значения /сторона и /отреэок лежат в диапазоне [О, П, точка пересечения находится внутри проверяемого отрезка и внутри стороны окна и, следовательно, отрезок пересекается с окном. До решения системы уравнений специальной проверкой необходимо исключить случай, когда пря- мая параллельна стороне окна. В заключение можно сказать, что описанный способ не очень эффективен, поскольку содержит много вычислений и проверок. Эффективность операции отсечения приобретает особое значение в интерактивной графике, поскольку типичное изображение состо- ит из сотен или даже тысяч отрезков, которые должны обрабаты- ваться с максимально возможной скоростью, если требуется обес- печить плавный переход от одного вида объекта к следующему. Бо- лее эффективный алгоритм мог бы произвести сначала некоторые дополнительные проверки, чтобы выяснить, действительно ли необ- ходимы вычисления для нахождения точки пересечения. Во-первых,, можно проверить, не находятся ли обе конечные точки отрезка в ок- не; в этом случае отрезок принимается целиком. Во-вторых, можно было бы проверить, в какой области находится отрезок. Например, два простых сравнения координат у показывают, что обе конечные точки отрезка CD на рис. 4.4 имеют координату у, большую i/max, А это означает, что отрезок CD находится выше окна и его можно, отбросить целиком. Аналогичным образом можно отвергнуть це- ликом отрезки, обе конечные точки которых находятся ниже z/min, левее xmin или правее хтах. а) Алгоритм отсечения Коэна — Сазерленда. Алгоритм отсече- ния Коэна — Сазерленда позволяет быстро выявить отрезки, ко- торые могут быть отвергнуты или приняты целиком; при этом ис- пользуются проверки области расположения отрезков. Вычисления для определения точки пересечения требуются в тех случаях, когда отрезки не попадают ни в один из этих классов. Этот алгоритм особен- но эффективен в двух крайних случаях: 1) большое окно, содержа- щее большинство примитивов; 2) относительно маленькое окно и обширное, насыщенное изображение, в котором большинство при- митивов лежит вне окна. В обоих случаях большинство отрезков можно принять или отбросить целиком. Работа алгоритма начинается с приписывания конечным точкам отрезков 4-битового кода «.вне!внутри» по правилу, иллюстрируе- мому рис. 4.5. Каждому биту присваивается значение 1 (истина), если выполняется соответствующее данному биту условие, характе- ризующее взаимное расположение точки и окна (биты нумеруются слева направо): бит 1 — точка выше окна; бит 2 — точка ниже окна; бит 3 — точка справа от окна; бит 4 — точка слева от окна. В противном случае биту присваивается значение 0 (ложь),.
173 Глава 4 I 1001 I 1000 1010 I 0001 0000 0010 0110 Рис. 4.5. Формирование кодов для конечных то- чек. Рис. 4.6. Пример выполнения операции отсечения. Для языков, позволяющих работать с битами, существует осо- бенно эффективный способ вычисления этого кода, вытекающий из того факта, что бит 1 является знаковым битом разности (утм—у), бит 2 — знаковым битом для (у—ут\п), бит 3 — для (хтах—х), бит 4 — для (х—xmin). Точка находится внутри окна (код «вне/вну- три» равен 0000), если все эти разности неотрицательны. Отрезок можно принять целиком, если оба ею конца находятся внутри окна (оба кода 0000). Отрезок отбрасывается без вычислений, если оба его конца находятся выше, ниже, левее или правее окна. В этих случаях соответствующие биты в обоих кодах равняются 1, и это легко выявить, применив к кодам логическую операцию И и прове- рив результат на отличие от 0000. Если результат логической операции И равняется 0000, отрезок нельзя ни принять, ни отбросить целиком, так как он может пере- секаться с окном. (На рис. 4.6 отрезки AD и ЕН попадают в этот класс, но только отрезок ЕН действительно пересекается с окном.) Для определения пересечения в алгоритме не используется очевид- ный метод проверки на параллельность, решение системы двух уравнений и проверка, не является ли точка пересечения внутрен- ней для обоих отрезков. Вместо него применяется итеративная стратегия «разделяй и властвуй», требующая небольшого объема вычислений. В этом случае используется горизонтальность либо вертикальность сторон окна, что дает возможность определить ко- ординату х или у точки пересечения без вычислений. Кроме того, используется тот факт, что часть отрезка, находящаяся с внешней стороны от границы окна, может быть отброшена. Оставшийся отре- зок проверяется на возможность его принятия или отбрасывания целиком. Если это невозможно, процесс повторяется для другой стороны окна. На каждой итерации конечная точка отрезка с нену- левым кодом «вне/внутри» заменяется на точку, лежащую на сторо- не окна или на прямой, содержащей сторону. Порядок перебора сторон окна абсолютно произволен: незави- симо от порядка отсечение некоторых отрезков потребует четырех
Реализация простого графического пакета 179 итераций, определяющих пересечения со всеми четырьмя сторонами окна. В книге принят порядок, соответствующий расположению битов в коде: 1. верхняя часть — отбросить часть отрезка, расположенную над окном; 2. нижняя часть — отбросить часть отрезка, расположенную под окном; 3. правая сторона — отбросить часть отрезка, расположенную справа; 4. левая сторона — отбросить часть отрезка, расположенную слева. В качестве примера рассмотрим два отрезка прямых, приве- денных на рис. 4.6, и разделим их на части. Для отрезка DA итера- ционная последовательность была бы следующей: 1. Проверка кодов для А и D и результата применения к ним операции И; нельзя принять или отбросить целиком. 2. Вычисление точки пересечения В; ВА — новый отрезок, BD — отбрасывается, поскольку находится над окном. 3. Проверка кодов для А и В; отрезок отбрасывается целиком. Для отрезка ЕН последовательность немного длиннее: 1. Проверка кодов для Е, Н; нельзя принять или отбросить це- ликом. 2. Вычисление точки пересечения G; отбрасывание отрезка GH. 3. Проверка для отрезка EG; нельзя принять или отбросить це- ликом. 4. Вычисление точки пересечения F; отбрасывание отрезка ЕЕ. 5. Проверка для отрезка FG; принимается целиком. Полный алгоритм приведен ниже. procedure CL1 PPERjxl, yl, х2, у2, xmin, хтах, ymin, утах; real); {алгоритм отсечения Коэна—Сазерленда для отрезка от Р1 = (х/, у!) до Р2 = (х2, у2)} type оиtcode = array [1..4] of boolean; var accept, reject, done: boolean; outcodel, outcode2: outcode; {коды «вне/внутри» для Pl и P2} {Здесь размещаются определения SUMP, REJЕСТ-CHECK, АССЕРТ-СНЕСК и OUTCODES. OUTCODES по параметрам окна и координатам точки вычисляет 4-битовый код «вне/внутрн» (см. также упр. 4.2) } begin acceptfalse; reject false; done := false; repeat OUTCODESjxl, yl, outcodel}; 0UTC0DES(x2, y2, outcode2); rejectREJECT_CHECK(outcodel, outcode2); {проверка на отбрасывание- целиком} if reject then done := true else begin {возможно принятие целиком} accept := ACCEPT-CHECKiputcodel, outcode2); {проверка на принятие. , целиком}
180 Глава 4 1 if accept then done := true else >. begin {разделить отрезок, поскольку по крайней мере одна ко»1 нечная точка находится внутри} 1 {Если Р1 внутри окна, перестановка местами с помощью SWMP ‘ точек Р1 и Р2 и их кодов, чтобы Р1 была вне окна} if not {(outcodel [1]) or [outcodel [2]) or (outcodel [3]) or (outcodel [4])) then SHMP; {Теперь выполняется разделение, Pl перемещается в точку пересечения; используются формулы у = у! + наклон * (х — х 1), х= xl (1/наклон) * (у—у 1).} if outcodel [1] then begin {отбросить верхнюю часть} xl :=xl-\-(x2—xl) -*(утах—у1)!(у2—yl); yl := утах end; else if outcodel [2] then begin {отбросить нижнюю часть} xl := xl-\-(x2—xl) *(ymin—yl)!(y2—yl); yl : = у mln end; else if outcodel [3] then begin {отбросить правую часть} yl := yl-(-(y2—yl)*(xmax—xl)/(x2— xl); xl xmax; end; else if outcodel [4] then begin {отбросить левую часть} yl := yl-\-[y2—yl)*(xmin— xl)!(x2— xl); xl ;= xtnin; end end {процесса разделения} end {возможно принятие} until done; if accept then DRAW(xl, yl, x2, y2) end; {CLIPPER} После его изучения становится видна настоящая роль кодов «вне/внутри»: они используются в проверках на принятие и отбра- сывание отрезков целиком и в качестве простого механизма для за- поминания местоположений последовательных конечных точек раз- деляемых на части отрезков, чтобы избежать повторных проверок точек в цикле перебора по всем четырем сторонам окна. Коды управ- ляют также замещением конечных точек. б) Последовательное определение средних точек в отсекающем делителе. В алгоритме отсечения Коэна — Сазерленда одна коор- дината определяется тривиально, но для вычисления другой коор- динаты все же необходимы умножение и деление (с плавающей точ- кой). Если в наборе команд машины отсутствуют такие операции (как, например, во многих современных микропроцессорах), это может привести к большим затратам машинного времени. Описывае- мый ниже алгоритм последовательного определения средних точек исключает необходимость в таких операциях, но за счет дополни-
Реализация простого графического пакета 181 Рис. 4.7. Эквивалентность двух последовательностей выполнения видовой опе- рации: отсечение — отображение (а) и отображение — отсечение (б). тельных итераций. На первом шаге алгоритма предполагается, что точка пересечения отрезка (который нельзя принять или отбросить целиком) с окном лежит посередине отрезка; если это предположе- ние ошибочно, то алгоритм делит отрезок пополам и проверяет обе половины. Координаты средней точки отрезка (х2+х1)/2, (у2-\-у1)!2 легко находятся для целых координат с помощью двух сложений и двух сдвигов. Этот алгоритм первоначально был разработан для аппаратного устройства — отсекающего делителя [437], в котором вместо медленных операций умножения и деления использовались быстрые целочисленные (или дробные) арифметические операции и сдвиги (двоичное деление). Алгоритм деления отрезка пополам сначала отображает все примитивы в координаты устройства и затем отсекает их по грани- цам поля вывода в противоположность процедуре отсечения, при- нятой в ПГП, в которой прежде выполняется отсечение в мировых координатах и затем отображение отсеченных примитивов в поле вывода в нормированных (или даже физических) координатах. Од- нако, как показано на рис. 4.7, результат получается один и тот же. При программном отсечении обычно разумно уменьшить число отображаемых примитивов предварительным отсечением всех неви- димых элементов, но при наличии быстрых аппаратных устройств имеет смысл либо непосредственно использовать координаты уст- ройства в качестве мировых координат, либо переводить каждую координату из представления с плавающей точкой в представление с фиксированной точкой, прежде чем передавать примитив аппарат- ному отсекателю. (Разрабатываемое в настоящее время на базе СБИС поколение аппаратных отсекателей, способных работать с вещественными числами [98], сделает алгоритм Коэна — Сазер- ленда особенно эффективным.) В алгоритме деления отрезка пополам коды «вне/внутри» ис- пользуются так же, как и в алгоритме Коэна — Сазерленда. Если отрезок нельзя ни принять, ни отбросить целиком, он делится на две равные части. Общая стратегия состоит в повторении этого про- цесса (подобно процедуре двоичного поиска) до тех пор, пока один сегмент исходного отрезка не будет принят целиком (если сущест- вует пересечение), а другой — целиком отброшен. На каждом шаге
182 Глава 4 обычно можно принять и/или отбросить половину отрезка. Напри! мер, на рис. 4.8 половина отрезка.GI принимается, а половина от! резка KL отбрасывается. 1 Имеется только одна небольшая сложность. При отсечении от«1 резков, подобных АС и DF (рис. 4.8), необходимо найти либо два! пересечения, либо ни одного. Какой именно случай имеет место! легко определить в процессе деления. На некотором шаге либо обе* половины отбрасываются (как АВ и ВС), либо нет (как DE и EF).5 Рис. 4.8. Отсечение методом деления отрезка пополам W' Рис. 4.9. Вертикальное окно, охватывающее повернутое. В последнем случае рассмотрение одного отрезка (например, DE) временно откладывается, а другой отрезок (EF) делится дальше до нахождения пересечения. После этого найденные координаты запоминаются, и процесс повторяется для отложенного отрезка (DE). Так же как двоичный поиск заканчивается в худшем случае за log3Af шагов (где N — длина массива, в котором осуществляется поиск), данный алгоритм завершает свою работу, когда средняя точка отрезка совпадает с одной из конечных точек, тоже за log2 (V шагов (здесь (V — длина большей из проекций отрезка на горизон- тальную и вертикальную оси, измеряемая в единицах устройства). Таким образом, операция отсечения для отрезка максимальной длины с одной видимой конечной точкой будет выполнена нашим ДП в худшем случае за 10 шагов (log31024). В машинной графике использовались и другие алгоритмы от- сечения (176, 238]; их оценка дана в работе [238]. В основе этих алгоритмов лежит стремление выполнить большее число проверок над отрезком и его конечными точками, чем в алгоритме Коэна — Сазерленда, для того чтобы сэкономить время за счет уменьшения числа ситуаций, требующих вычислений. в) Повернутые окна. Во всех описанных алгоритмах предпола- гается, что стороны окна параллельны осям координат. Как быть в случае повернутого окна (допустимого в некоторых графических пакетах)?
Реализация простого графического пакета 183 text тьг ст тех т Окно Рис. 4.10. Отсечение индивиду- альных отрезков в каждой ли- тере. Можно снова вычислять непосредственно все четыре точки пере- сечения отрезка со сторонами окна. Однако возможно некоторое предварительное отсечение. Как показано на рис. 4.9, повернутое окно W можно заключить в окно W, стороны которого параллель- ны осям, и вычислить коды конечных точек отрезка по отношению к W". Все отрезки, отбрасываемые це- ликом по окну W', можно отбросить и по окну W. Очевидно, что с отрез- ками, принимаемыми целиком, ситуа- ция не так проста, и все отрезки, которые нельзя отбросить целиком по окну W, нуждаются в отсечении по окну W с помощью систем урав- нений. В том случае, когда поле вы- вода ориентировано по осям коорди- нат, более эффективным может ока- заться альтернативный подход: пре- образование всех примитивов в ко- ординаты устройства и отсечение по полю вывода с помощью либо алгоритма Коэна — Сазерленда, либо алгоритма деления от- резка пополам. Влияние взаимного порядка отсечения и отображе- ния на эффективность работы ДП более подробно изучается в гл. 9. Текст. Текст можно отсекать одним из нескольких способов, описываемых ниже в порядке уменьшения точности отсечения и увеличения вычислительной эффективности алгоритма. Если каж- дую литеру представлять в виде набора коротких отрезков прямых линий (штрихов), то можно подвергнуть операции отсечения каж- дый отрезок. Такой способ дает хорошее изображение (рис. 4.10), по он слишком медленен и несовместим с обычными аппаратными ге- нераторами литер. (Растровые устройства обычно рисуют литеры с помощью небольших битовых карт, а не штрихов (гл. 11).) Можно считать литеры неделимыми объектами и отсекать стро- ку литер с точностью до литеры. Каждая литера мысленно заклю- чается в прямоугольник, известный как ячейка литеры, и некото- рая точка этой ячейки — центр или один из углов — сопоставляет- ся с окном: если точка внутри, литера рисуется. Можно сопостав- лять с окном всю ячейку литеры или ее диагональ; если ячейка или ее диагональ целиком входят в окно, литера рисуется, в противном случае нет. На рис. 4.11 показаны результаты работы этих двух методов; отсечение по угловой точке и ячейке/диагонали дает оди- наковый результат только тогда, когда ячейка не пересекается с окном. Более того, отсечение по ячейке литеры и отсечение по ее диагонали эквивалентны только тогда, когда стороны ячейки па- раллельны сторонам окна. В противном случае при отсечении не- обходимо учитывать всю ячейку литеры (диагонали недостаточно). Третий, наиболее простой способ отсечения текста состоит в том, чго вся строка литер считается неделимым объектом и либо вся по-
184 Глава 4 Рис. 4.11. Отсеченйе литер целиком. а — по левому нижнему углу ячейки литеры; б — по ячейке литеры. называется, либо вся не показывается. При этом подходе необходим мо сопоставлять с окном либо некоторую точку прямоугольника/? охватывающего строку, либо диагональ этого прямоугольника, либо? весь прямоугольник (рис. 4.12). В нашем простом графическом пакете и простом дисплейном-: процессоре используются литеры только одного размера (обеспе-- чиваемого аппаратным генератором литер) и реализуется операция' отсечения текста в простейшем ви- ____________________]_ де: строка изображается только ,ГВГГТ170Ы"1 тогда, когда весь охватывающий и~ т’-----' ее прямоугольник целиком попа- дает в окно. При этом подразуме- _____________ вается, что литеры в отличие от ' [PROMPT] отрезков прямых не становятся больше или меньше при изменении Рис. 4.12. Отсечение строк по ох- прикладной программой соотноше- ватывающему прямоугольнику. ния размеров окна и поля выво- да — строка либо появляется на экране, либо не появляется, но ее размеры постоянны и определяются аппаратурой, генерирующей литеры.‘Более совершенные и более гибкие возможности генерато- ров литер обычно не удается использовать (особенно в трехмерном пространстве), поскольку в большинстве ДП средства для обработки векторов и литер разделены (гл. 10). Если пользователь ПГП хочет, чтобы текст изображался более качественно, он может либо вос- пользоваться средствами системы Core, либо реализовать на базе ПГП программную генерацию литер в виде набора подпрограмм, рисующих литеры отрезками прямых линий. 4.2.2. Отображение окна на поле вывода После отсечения примитива по границам окна процессор ви- довой операции отображает его на поле вывода (рис. 4.7, а). На рис. 4.13 точка (xw, yw) отображается в точку (xv, yv) с сохра- нением пропорций, т. е. с сохранением ее относительного положе- ния внутри замкнутого прямоугольника. Более точно это условие
Реализация простого графического пакета 185 Окно Л». СП|Р • ' W. (ТЦЛ vv.max • ' w,. max 1.1 Мировая система коорЭинага Рис. 4.13. Сохранение пропорций при Система коорЗинат устройства отображении «окно — поле вывода». V формулируется следующим образом: отношение расстояния от точ- ки до 1/-границы к длине х-границы и отношение расстояния от точки до х-границы к длине 1/-границы должны бйть одинаковыми для окна и поля вывода. Используя обозначения рис. 4.13, это усло- вие можно записать следующим образом: ^w.dist _ xw ^w.min _ xn ’^v.min •^v.dist И A'w.max ^w.min Ч.тах *v.min *v.leng У w. d i st У™ f/w.min Уу f/v.min . . Уу. diet Отсюда ^/w.lcng МОЖНО £/w,max f/w.min £/v.max f/v.min вывести уравнения отображения £/v. leng v __ v I Xv.max Xy.min /„ ________v \ Av Av.min *T Y _______у Aw.min/’ zw.max «*w.min — ,, I Уу max —f/y.min / __ . \ Un izv.min”/, ________,, \£7w tzw.mln/ vw.max vw.min ИЛИ *v $x (^w -^w.min) 4" A-.min, Уу $у (Уу/ i/w.mln) 4* i/v.min• Здесь sx и sy — параметры масштабирования, согласующие раз- меры окна и поля, a xv-min и t/v.min — параметры переноса, привя- зывающие промасштабированные (относительные) координаты окна (xw—xw>min, t/w—t/w.min) к левому нижнему углу поля вывода. Эти уравнения можно упростить и написать в виде xv = sxxw4-a и y4 = s„y^ + b, где для каждой координаты имеется одно умножение на заранее известный коэффициент и одно сложение с заранее известным чис- лом, Геометрические преобразования масштабирования и переноса более подробно рассматриваются в гл. 7.
186 Глава 4 С помощью этих уравнений получаются либо дробные нормиД ванные координаты, либо после соответствующего масштабироаИ ния (умножения на 1024) физические координаты, с которыми можЯ работать ДП. Для графических пакетов, обеспечивающих работе только с одним ДП, наиболее эффективно, конечно, прямое преоЯ разование мировых координат в физические координаты. Для пакя тов, ориентированных на работу с многими дисплеями, удобно ввет сти промежуточное представление изображения невысокого уроет ня, не привязанное ни к какому конкретному устройству, в норм™ рованных координатах. Это промежуточное представление перево- дится затем различными генераторами команд ДП в представление в физических координатах. Низкоуровневое, независимое от уст- ройства представление изображения в нормированных координа- тах можно легко записать в файл или передать по линиям связи® Более подробно эти возможности обсуждаются в разд. 4.8. 4.3. ГЕНЕРАЦИЯ ПРОГРАММЫ ДИСПЛЕЙНОГО ПРОЦЕССОРА 4.3.1. Введение \ Выполнив над примитивами операцию отсечения и отобразив? их в нормированное пространство, ПГП должен затем осуществить- преобразование примитивов из машинно-независимого представле-; ния в реальные команды ДП, состоящие из кода операции, указа- телей режима и полей, задающих отклонение луча в физических координатах. Сюда входят три процессора: 1. Преобразование нормированных координат в физические (це- лые) координаты (возможно, это преобразование уже выполнено’ при осуществлении отображения окна в поле вывода). ‘ 2. Генерация команд конкретного ДП. | 3. Сегментация программы ДП. ' Первый подпроцесс представляет собой тривиальное масштаби-1 рование. Второй — генерация команд ДП — зависит от конкрет- J ного устройства, но довольно прост и практически не нуждается 1 в пояснениях (см. упражнения 4.9 и 4.10) Необходимо лишь упо- мянуть о независимом от устройства преобразовании абсолютных, и относительных примитивов, заданных в прикладной программе,’ в относительные примитивы ДП, которым предшествует в начале каждого сегмента абсолютная установка луча. Тем самым подготав- ливается операция буксировки, выполняемая подпрограммой TRANSLATE _I MAGE _2 (перенос двумерного изображения); для того чтобы переместить изображение, ПГП просто изменяет координаты в команде установки луча. ; Третий подпроцесс — сегментация — касается организации за- висящей от устройства программы ДП, однако его можно пре дета-
Реализация простого графическое пакета 187 — " """ "" ' вить в виде совокупности методов, в основном не зависимых от уст- ройства. Поскольку эти методы могут быть очень сложными и реа- лизовать их можно разными способами, мы рассмотрим ниже эти вопросы более подробно. 4.3.2. Сегментация В гл. 2 обсуждалось объединение логически связанных прими- тивов вывода в сегменты. Сегментация обеспечивает удобную во многих случаях модульность дисплейной программы, выборочную идентификацию и модификацию изображения. Быстрая выбороч- ная модификация является основой высококачественной интерак- тивной графики, поскольку быстрый отклик системы — необходи- мое условие полноценной обратной связи. Сегментация легко реа- лизуется в дисплейном процессоре с регенерацией изображения (рассмотренным в гл. 3), поскольку, как показано ниже, буфер ре- 1еперации и команда ‘переход’ дисплейного процессора позволяют организовать хранение сегментов в буфере и манипулирование ими. Для других устройств формирование и хранение сегментированной дисплейной программы несущественно, но, как показано в разд. 4.6, полезно. Таким образом, сегментация полезна всегда. Например, выборочную модификацию хранимых в памяти сег- ментов можно использовать для плазменных панелей и растровых дисплеев, поскольку в отличие от дисплеев на запоминающих труб- ках, не имеющих режима рисования поверх хранимого изображе- ния, эти устройства допускают выборочное стирание: сегмент уда- ляется путем повторного прорисовывания его примитивов с фоно- вой интенсивностью луча п. Даже для дисплеев на запоминающих трубках, связанных с машиной низкоскоростными телефонными линиями, часто оказывается более предпочтительным удаление хранящегося сегмента путем перечеркивания «стираемых» прими- тивов пунктирными крестиками, чем стирание всего экрана и пере- дача видимых примитивов. Для того чтобы сконструировать структуры данных, позволяю- щие эффективно работать с сегментами, необходимо выяснить, что требуется для манипулирования ими. В общем случае программист должен иметь в ПГП средства, позволяющие создавать сегмент (инициализировать и затем наращивать, добавляя примитивы), удалять отдельные сегменты, показывать на экране только видимые, идентифицировать сегменты, указанные (выбранные) пользовате- 1) На самом деле этот метод позволяет получить только приблизительно правильные результаты, поскольку стираются пересечения стираемых примитивов с нестираемыми и в нестираемых примитивах образуются дыры. (Когда картинка становится непонятной, ее можно сформировать заново по правильной и соответ- ствующей данному моменту дисплейной программе, воспользовавшись операцией ПГП NEW-FRAME (новый кадр), описанной в разд. 4.6.) В гл. 11 эта проблема обсуждается более подробно.
188 Глава 4 лем, и эффективно манипулировать ими. Сегмент — это и опреде ленный программистом блок прикладной программы, описывающи! объект (его часть), и некоторая структура дисплейной программы состоящая из логически непрерывной последовательности дисплей ных примитивов (она не обязательно физически непрерывна в буфе- ре или на экране). К видимым сегментам должен быть обеспечен последовательный и циклический доступ дисплейному процессору для регенерации изображения и произвольный доступ центральному процессору для их обновления. В ПГП сегменты могут содержать произвольное число примитивов вывода, следовательно, в этом от- ношении прикладной программист не испытывает каких-либо огра- ничений. Аналогично нет ограничений и на число сегментов (иск- лючая объем доступной памяти и представимость в имеющейся раз- рядной сетке целочисленного имени сегмента). В ПГП разрешены следующие явно задаваемые программистом операции над сегментами: CREATESEGMENT (создать сегмент), CLOSE-SEGMENT (закрыть сегмент), DELETE.SEGMENT (удалить сегмент), RENAME-SEGMENT (переименовать сег- мент), SET-VISIBILITY (установить видимость) и TRANSLA ТЕ_ -IMAGE-2 (переместить двумерное изображение). Не разрешают- ся ни внутренняя модификация (редактирование) примитивов вы- вода в сегменте, ни добавление новых примитивов к уже закрытому сегменту. В общем случае эти операции обычно трудно реализуемы и требуют больших расходов, поскольку необходимо сохранять большой объем информации о внутренней, зависящей от устройства структуре сегмента, статусах атрибутов и глобальных переменных и т. д. (более детально эти трудности обсуждены в упражнении 4.12 и работе [3201). Кроме того, они не нужны для реализации базово- го, но функционально полного набора операций над сегментами. В ПГП отсутствует даже операция REPLACE-SEGMENT (за- менить сегмент), поскольку программист (или пакет более высокого уровня, надстроенный над ПГП) может легко реализовать эту функ- цию комбинаций операций CREATE_SEGMENT/DELETE_ -SEGMENT/RENАМЕ-SEGMENT (создать сегмент/удалить сег- мент/переименовать сегмент). Неявными операциями над сегментами называются операции, которые вызываются программистом косвенно: добавление нового примитива к открытому в данный момент сегменту, определение сегмента, который содержит примитив, указанный пользователем, и поиск заданного сегмента (проверка, существует ли сегмент с именем, указанным прикладной программой, и если да, то органи- зация доступа к нему). Операция поиска сегмента должна быть как можно более эффективной, поскольку она выполняется при каж- дой явно заданной операции — даже при создании сегмента необ- ходимо сначала проверить, не существует ли уже сегмент с таким именем. Сформулировав требования к набору операций, которые необ-
Реализация простого графического пакета 189 ходимо уметь выполнять над сегментами, мы должны организовать программу дисплейного процессора в виде структуры данных, удов- летворяющей этим требованиям некоторым «оптимальным» образом. Здесь не существует одного «правильного» или наилучшего спосо- ба — имеется много возможностей и компромиссов, выбор среди которых зависит от относительной частоты использования и прио- ритетов функций, участвующих в типичном диалоге с пользовате- лем. Принимаемые решения зависят также от операционной обста- новки, в которой осуществляется реализация — от языка програм- мирования и услуг, предоставляемых во время выполнения про- граммы операционной системой. Ниже рассмотрены две возможные структуры — непрерывная и списочная — и обсуждены их досто- инства и недостатки. 4.3.3. Явные операции Массив непрерывных сегментов. В отсутствие аппарата динами- ческого распределения памяти (например, при программировании на Фортране) ПГП может зарезервировать большой (целый) массив для хранения сегментов. Этот массив разбивается на два участка: область активных сегментов, где хранятся все определенные к дан- ному моменту сегменты, и свободная область. На рис. 4.14 показано, что происходит при выполнении операции CREATESEGMENT (создать сегмент): ПГП начинает формиро- вать новый сегмент/ в конце области активных сегментов и последо- вательно добавляет к этому сегменту примитивы вывода. Новый сегмент становится текущим сегментом. Последней командой те- кущего сегмента, «проталкиваемой» вниз при каждом добавлении примитива к сегменту, является команда перехода вверх на первый активный сегмент, с которого начинается следующий цикл регенера- ции. Отметим, что для предотвращения прожигания люминофора (классическая проблема векторных дисплеев с регенерацией изоб- ражения) в команде перехода установлен бит синхронизации. Для растровых дисплеев ПГП может не формировать команду перехода, поскольку такие дисплеи используют список дисплейных команд только для развертки изображения в битовую карту, по которой происходит регенерация изображения. После вызова операции CLOSE-SEGMENT (закрыть сегмент) изменять сегмент уже нель- зя; следующая операция CREATE-SEGMENT (создать сегмент) начинает новый текущий сегмент ниже только что закрытого. Для выполнения операции TRANSLATE_IMAGE_2 (перемес- тить двумерное изображение) ПГП просто изменяет команду абсо- лютного позиционирования, предшествующую остальным прими- тивам сегмента, в которых используются относительные координаты. В каждом сегменте примитивам вывода предшествует заголовок, содержащий команду относительного перехода (JMPR), имя сег- мента и его длину. Для выполнения операции SET_VISIBILITY
190 Глава 4 Рис. 4.14. Сегмент, хранящийся в массиве с названием DPU^PROG. (установить видимость) ПГП формирует команду JMPR (рис. 4.15) таким образом, чтобы обойти остаток заголовка и начать выполне- ние первого примитива сегмента (сделать сегмент видимым), либо обойти весь сегмент и перейти к заголовку следующего сегмента (сделать данный сегмент невидимым). ПГП может сначала опросить текущее состояние видимости, проверив, не является ли первая команда сегмента командой JMPR 3. Таким образом, сегменты раз- делены командами JMPR, находящимися в заголовках. Для выпол- нения операции RENAME-SEGMENT (переименовать сегмент) ПГП, продвигаясь по командам JMPR, переходит от сегмента к сегменту в поисках старого имени и, найдя его, заменяет на но- вое. Для выявления возможных ошибок ПГП должен просмотреть все сегменты и удостовериться в том, что нового имени нет среди существующих. Операцию DELETE-SEGMENT (удалить сегмент) ПГП может выполнять одним из двух способов. При первом способе каждое удаление сегмента сопровождается попутным уплотнением массива, т. е. остальная часть области сегментов перемещается вверх на ме- сто удаленного сегмента. При втором способе сегмент остается на месте, но помечается, чтобы это место можно было использовать пов-
Реализация простого графического пакета 191 ВиВимыц сегмент Рис. 4.15. Упакованный массив непрерывных сегментов с командами относитель- ного перехода, регулирующими видимость/невидимость. торно, как в программе LAYOUT (гл. 2). Второй способ требует более сложного механизма распределения памяти, связанного с об- работкой списков, и обсуждается в следующем разделе. Насколько неэффективно удаление с попутным уплотнением? Затраты времени на линейный поиск удаляемого сегмента и другие вспомогательные операции обычно малы по сравнению с самим процессом уплотнения. Например, для больших дисплейных про- грамм объемом до 32К 16-разрядных слов удаление самого верхнего сегмента (нетипичный наихудший случай) заняло бы 1/3 с (при оценке предполагалось, что цикл пересылки одного слова зани- мает 10 мкс). Эта оценка довольно высока для мини- и микро-ЭВМ, широко применяемых в настоящее время в машинной графике.
192 Глава 4 Среднее время удаления сегмента в большой дисплейной програм-. ме составило бы менее 1/6 с. Эти цифры вполне приемлемы; если учесть, что человека обычно устраивает время реакции на типичные действия, лежащее в диапа- зоне 0,1—0,5 с (гл. 6). Однако для векторных дисплеев более важ- ную роль играет временной критерий— необходимость предотвра- щения мерцания. Как показано в разд. 4.4, ДП должен прекра- тить выполнение дисплейной программы на все время изменения ее центральным процессором, поскольку в это время программа в целом некорректна и изображение может исказиться. Поэтому во время выполнения уплотнения при удалении сегмента ДП не будет функционировать. В среднем удаление сегмента займет V, с, т. е. пропадет приблизительно пять циклов регенерации (при частоте 30 Гц), что вызовет кратковременное, но заметное мерцание изоб- ражения. Если надо последовательно удалить несколько сегментов, зада- ча усложняется. Однако такие множественные удаления встречают- ся во время сеанса не часто, они происходят почти исключительно при изменении пользователем режима работы программы или смене картинки. Прикладной программист может легко справиться с та- кими ситуациями либо двойной буферизацией (создание новой дис- плейной программы до удаления старой), если для этого есть место, либо высвечиванием специального оповещения «идет работа». Мно- жественные удаления могут затруднить работу с программой LAYOUT (гл. 2) при каждом изменении окна и каждой регенерации структуры данных. На самом деле подпрограмма D!SPLAY_D_ STR заменяет сегменты по одному путем их удаления и повторного создания; таким образом, операции удаления и создания сегментов перемежаются. При наличии соответствующей памяти путем мини- мальных изменений можно организовать двойную буферизацию, храня два полных изображения; смена изображения будет при этом выглядеть более естественно (упр. 2.14). Сколько времени занимают эти последовательности операций? Предположим, что мебель в комнате размещена довольно сложным образом, и сегменты, соответствующие символам (150 символов — 150 сегментов), состоят в среднем из 10 примитивов, каждый из ко- торых занимает 2 слова. Тогда при удалении всех символов объем уплотняемой памяти составляет 3000 слов, что соответствует 30 мс. Эта цифра приблизительно равна продолжительности одного цикла регенерации и, следовательно, вполне приемлема. С точки зрения времени реакции системы на действия пользователя эта цифра так- же допустима, поскольку она скорее всего будет мала по сравнению со временем, необходимым для пропуска всех примитивов всех за- меняемых сегментов через весь канал вывода. Канал вывода функ- ционирует параллельно с процессом регенерации и поэтому не вы- зывает мерцаний. Если ПГП реализован на быстрой ЭВМ, то время обработки одного примитива в канале может колебаться от несколь-
Реализация простого графического пакета 193 ких сотен до 1000 мкс. Это время тратится на организацию внутренней работы с подпро- граммами, выявление ошибочных ситуаций и операцию отсечения. (Для более полных па- кетов, обеспечивающих работу с трехмерными объектами, эти цифры могут возрасти на по- рядок.) Таким образом, можно избежать мерца- ния, если при уплотнении пересылается не более 3000 слов, а пересылка одного слова занимает в среднем 10 мкс. При таком ограни- чении теряется только один цикл регенерации. Списочная структура. Способ хранения дис- плейной программы в виде массива непре- рывных сегментов обладает достоинствами: он прост и удовлетворяет требованиям не- больших приложений. Однако этот способ имеет два недостатка. Во-первых, исключается из обращения значительный объем памяти (столько, сколько нужно для хранения мак- симально допустимой дисплейной программы), а память и в наши дни является дорогим ресурсом. Во-вторых, в случае векторных дисплеев для больших дисплейных программ, состоящих из многих сотен сегментов, может Сегмент 5СвобоЭная областью Сегмент = СвобоЭная областью Сегмент Сегмент = СеобоВная областью Рис. 4.16a. Память с активными и удален- ными сегментами. оказаться заметным мерцание, вызываемое уплотнением памяти при удалении сегмента. ДЛя устранения этих недостатков может быть применена стандарт- ная схема управления памятью, заключающаяся в выделении и ос- вобождении блоков памяти по запросам; в этой схеме используются связанные списки. ПГП может либо управлять своей собственной Рис. 4.166. Циклический список сегментов, произвольно расположенных в памяти.
194 Глава 4 динамически расширяемой областью памяти, либо использовати стандартный механизм управления динамической памятью опера-Л ционной системы. Вместо замещения удаленного сегмента оставши-^ мися путем их сдвига по памяти он помечается специальным обра- зом, если ПГП сам осуществляет управление памятью, или его ад- j рес передается механизму управления памятью операционной си- > стемы. После нескольких удалений память приобретает хорошо знакомый читателю вид (рис. 4.16а), и для связи оставшихся сег- ментов потребуется списочная структура (рис. 4.166). Команда пе- рехода в конце каждого сегмента используется дисплейным процес- сором для перехода от сегмента к сегменту, в то время как ее ад- ресное поле может использоваться центральным процессором как указатель в списочной структуре. Циклический список обеспечи- вает циклическую регенерацию. Команда перехода, находящаяся в начале каждого сегмента, либо обходит заголовок сегмента JMPR 3 (cei мент видим), либо весь сегмент (сегмент невидим). Для удаления сегмента осуществляется линейный поиск по списку с сохранением на каждом шаге адреса сегмента-предшест- венника. Когда нужный сегмент найден, он исключается из списка путем изменения указателя в предшественнике — указатель уста- навливается на сегмент, следующий за удаляемым. Если требуется место для нового сегмента, создаваемого опера- цией CREATESEGMENT (создать сегмент), можно использовать одну из двух стратегий в зависимости от того, где находится аппарат управления памятью — в ПГП или в операционной системе. В по- следнем случае ПГП просто запрашивает блок нужного размера. Если же ПГП сам управляет памятью, он просматривает удаленные сегменты в поисках сегмента нужного размера. Но в любом из этих двух случаев возникает вопрос: какой же именно размер нужен? В момент создания сегмента ПГП не может знать его размеров. ПГП может начать формирование сегмента в любом свободном бло- ке, а когда возникнет угроза его переполнения, он может запро- сить блок большего размера, скопировать в него сформированную часть сегмента и вернуть переполнившийся блок в список свобод- ных. Этот процесс будет продолжаться до вызова операции CLOSE- SEGMENT (закрыть сегмент). Но как быть с неиспользуемым про- странством в последнем, самом большом блоке? Можно запросить блок нужного размера в момент выполнения операции CLOSE- SEGMENT и скопировать в него сформированный сегмент. Но сво- бодный блок, размер которого близок к требуемому размеру, может оказаться все же больше, чем нужно, и часть памяти окажется не- использованной. Существует два способа: можно либо использо- вать слишком большой блок и возвращать его целиком в список свободных при удалении сегмента, либо выделять неиспользуемый подблок и вносить его в список свободных. В первом случае может не хватить памяти, поскольку каждый сегмент занимает больше мес- та, чем ему в действительности нужно. Во втором случае неисполь-
Реализация простого графического пакета 195 зуемый подблок может оказаться слишком маленьким для того, чтобы вместить какой-либо сегмент, и поэтому остаться неисполь- зованным, При создании графических пакетов чаще выбирают пер- вый способ, поскольку его проще реализовать и разработчики предполагают, что сегменты будут достаточно часто удаляться, а занятые ими блоки возвращаться в список свободных, который, сле- довательно, никогда не станет пустым. В любом случае после некоторого числа добавлений и удалений сегментов область памяти, отведенная для хранения дисплейной программы, будет заполнена несмежными подблоками свободной памяти, которые не используются в данный момент или не могут быть использованы. Такая ситуация, называемая фрагментацией, типична для динамического распределения памяти. Если в какой-то момент времени не окажется свободного блока, достаточного для размещения вновь формируемого сегмента, и если ПГП сам управ- ляет памятью, он должен будет выполнить сборку мусора — пере- писать все занятые блоки в один сплошной массив так, чтобы между ними не оставалось свободного пространства. Если фаза удаления в общем алгоритме сборки мусора сводится всего лишь к пометке каждого удаляемого сегмента, фаза уплотнения требует большого сбъема пересылок данных, и пользователь наверняка заметит, что программа иногда почему-то слишком занята и медленно отзывает- ся на его действия. Фактически использование связанных списков приводит к эпизодическим уплотнениям памяти с большими разо- выми затратами времени, тогда как при последовательном распре- делении в непрерывном массиве одно уплотнение занимает сущест- венно меньше времени, но осуществляется при каждом удалении1*. ' Если ПГП использует системный аппарат управления памятью, проблема фрагментации существенно усложняется, поскольку систе- ма не может уплотнять пространство прикладной программы — там могут находиться неперемещаемые адреса. Когда свободное прост- ранство отсутствует, прикладная программа должна информиро- вать пользователя о том, что ему необходимо либо удалить какие-то сегменты, либо повторно инициализировать программу. Ни одна из этих альтернатив не является приятной для пользователя. (Со- временные системы виртуальной памяти снимают многие из этих проблем.) Третий способ управления памятью, который может использо- вать ПГП, состоит в том, чтобы выделять память блоками фиксиро- ванной длины. Тогда формирование сегмента может начаться в любом свободном блоке, при его переполнении происходит пере- ключение на следующий свободный блок и т. д. Использование бло- 1> Исчерпывающий анализ последовательного, связанного и динамического распределения памяти имеется в книге Д. Кнута «Искусство программирования для ЭВМ»,— М.: Мир, 1976, т. 1, гл. 2.— Прим. ред.
196 Глава 4 ков фиксированной длины позволяет избежать фрагментации пайя мяти [270], но платой за это является фрагментация сегмента, раз-» бросанного по нескольким блокам, и введение дополнительных ко-1 манд перехода, соединяющих части сегмента. Это замедляет выпол-1 нение большинства операций над сегментами, а для векторных дис-1 плеев с регенерацией изображения замедляет процесс регенерации. - Кроме того, необходимо тратить дополнительные ресурсы на хра- нение и обработку адреса следующего сегмента; это необходимо.для формирования команды перехода, обеспечивающей видимость (не- видимость) каждого сегмента. Не полностью решается также и проблема фрагментации памяти, поскольку в последнем блоке име- ется неиспользуемое свободное пространство. Поэтому данную схе- му управления памятью можно рекомендовать лишь для дисплеев на запоминающих трубках и для растровых дисплеев. Заключение. Каково же примерное соотношение достоинств и недостатков двух схем хранения сегментов? За счет использования стандартных программ поиска первого подходящего по размерам блока в списке свободной памяти, неизбежной фрагментации па- мяти и введения дополнительных команд перехода для организации списочной структуры можно обеспечить практически мгновенную реакцию на операции удаления сегментов. Реализация в ПГП соб- ственного механизма управления памятью означает, что необходи- мо потратить время на написание соответствующих программ и от- вести пространство для их хранения, однако при этом ПГП имеет возможность решать проблему фрагментации путем уплотнения па- мяти. Конечно, общее время, затрачиваемое на эпизодические «груп- повые» уплотнения при исчерпании свободной памяти меньше, чем общее время попутных уплотнений, выполняемых при каждом уда- лении сегмента. Важным и трудным вопросом, на который нужно дать ответ, является ожидаемая частота возникновения фатальных фрагментаций. Предсказать ее заранее очень трудно, поскольку она зависит от объема доступной памяти, от типов запросов, поступаю- щих в систему из прикладной программы, и распределения их по частоте появления. Какие же общие правила можно вывести из изложенного выше? В общем случае, если имеется некоторый излишек памяти, т. е. ее немного больше, чем нужно для хранения дисплейной програм- мы, предпочитают более простую схему последовательного распреде- ления памяти, поскольку ее проще реализовать, а получаемые про- граммы занимают меньше места. В классическом выборе между па- мятью и временем выполнения эта схема отдает предпочтение жест- ко ограниченному ресурсу (память) в ущерб более гибкому (время). Если имеется дополнителБная память, ПГП может взять на себя управление памятью и решение задачи фрагментации, но за счет усложнения реализации и дополнительного пространства. Наконец, если память достаточно велика, а в операционной системе есть ап- парат динамического управления памятью, ПГП может использовать
Реализация простого графического пакета 197 этот аппарат в предположении, что большинство сеансов работы пользователя с пакетом закончатся прежде, чем .в процессе фраг- ментации окажется занятой вся память. 4.3.4. Неявные операции Поиск сегмента. Обсудив две альтернативные стратегии выпол- нения явных операций с сегментами, рассмотрим более подробно процесс нахождения сегмента в этих операциях. Выше было ска- зано, что сегменты идентифицируются именами и для удобства в ПГП хранится также длина каждого сегмента. Эту управляющую информацию можно хранить либо в заголовке самого сегмента (рис. 4.15 и 4.166), либо создать для нее отдельную таблицу — спра- вочник (рис. 4.17). Оба метода могут применяться как при последо- вательном, так и при связанном распределении памяти. В случае Рис. 4.17. Справочник сегментов. справочника поле видимости, хранящееся в нем для каждого сег- мента, позволяет быстро определить, видим ли данный сегмент. При использовании заголовка для определения видимости можно проверить команду перехода, находящуюся в начале сегмента. Если управляющая информация хранится в заголовке сегмента, поиск сегмента с заданным именем сводится к простому линейному поиску по списку. В случае неупорядоченных сегментов среднее число просмотренных сегментов равняется п/2, если сегмент най- ден, и п, если сегмент не найден. В этом линейном поиске для опре- деления начала следующего сегмента используется длина сегмента при последовательном распределении памяти или команда перехода к следующему сегменту при связанном распределении. Для уменьшения среднего времени поиска сегменты могут быть упорядочены по именам как при последовательном, так и при свя- занном распределении памяти: это позволяет прекратить процесс поиска, как только искомое имя окажется меньше имени очередного сегмента. При равномерном распределении имен эта мера не затра- гивает среднее время поиска существующего сегмента — все равно нужно просмотреть в среднем п/2 сегментов. Однако для несущест- вующих сегментов среднее время поиска уменьшится вдвое, по- скольку надо просмотреть в среднем Йе и, а п/2 сегментов. С Другой
198 Глава 4 стороны, при упорядоченном хранении сегментов возникает необ- ходимость поиска надлежащего места при включении в дисплейную программу нового сегмента. А при последовательном распределе- нии памяти необходимо также переместить в памяти сегменты, на- ходящиеся ниже точки, в которую вставляется новый сегмент. Уве- личение эффективности поиска не оправдывается, и прежде всего потому, что во многих приложениях число сегментов не превышает 100, и большинство поисков заканчиваются успешно. Для прикладных программ, работающих с многими сотнями сегментов, эффективность поиска можно повысить путем хранения управляющей информации в отдельном справочнике. В то время как сами сегменты могут храниться в произвольном порядке (обыч- но в порядке их создания), справочник можно упорядочить по име- нам и тем самым облегчить поиск. Поскольку элементы справочни- ка имеют фиксированную длину, можно использовать алгоритм двоичного поиска; среднее время поиска для такого алгоритма про- порционально log2n. Каковы затраты на содержание отдельного справочника? Для управления видимостью по-прежнему нужна команда перехода в начале каждого сегмента (JMPR — относительный переход или JUMP — абсолютный переход к следующему сегменту), в то же время в справочнике в каждом элементе должно храниться поле ви- димости и дополнительный указатель на сегмент для его быстрого нахождения. ПГП уже не требуется длина для определения адреса следующего сегмента, но ее лучше сохранить для удобства управле- ния памятью. Добавление сегмента требует больше работы, чем раньше: по-прежнему нужен поиск для проверки, нет ли одинако- вых имен, и сверх того, необходимо включение элемента в спра- вочник. Если справочник хранится в виде таблицы, перемещаются элементы, находящиеся ниже вставляемого. Если справочник хранит- ся в виде двоичного дерева, включение нового элемента сводится к настройке указателей, но эти указатели должны храниться вместе со справочником. Сам сегмент вставляется либо в конец области сегментов (при последовательном распределении памяти), либо в начало циклического списка. Удаление требует удаления сегмента и сдвига элементов таблицы, расположенных ниже удаляемого, на три слова, чтобы уплотнить таблицу. (При хранении справочника в виде двоичного дерева требуется только реорганизация указате- лей.) Отсюда ясно, что в большинстве случаев хранение отдельного справочника сегментов не оправданно: повышение сложности про- граммы и увеличенный расход памяти окупятся только при сравнительно большом числе поисков без последующего перемеще- ния данных в области сегментов и в справочнике (это имеет место только в операциях RENAME „SEGMENT, SET „VISIBILITY, TRANSLATE„IMAGE_2) и продолжительном времени линей- ного поиска, обусловленном большим числом сегментов. Распреде-
Реализация простого графического пакета 199 ление управляющей информации по заголовкам сегментов вполне достаточно для большинства типичных случаев. Идентификация сегмента. Каким образом ПГП идентифици- рует сегмент, выбранный пользователем с помощью селектора? Если дисплейный процессор обеспечивает работу со световым пе- ром, он обычно имеет либо регистр имени, либо счетчик дисплей- ных команд, которые ПГП может опросить после прерывания от светового пера. Наличие регистра имени — самый хороший вари- ант. В этом случае первой дисплейной командой видимого сегмента является не абсолютное позиционирование луча, а команда за- грузки регистра имени, причем имя сегмента содержится непосред- ственно в команде (рис. 4.18). Ког- да световое перо срабатывает и ДП останавливается, программа обработки прерывания в централь- ном процессоре пересылает содер- жимое регистра имени в процеду- ру WAIT .PICK (ожидание выбо- ра), которая в свою очередь пере- дает его прикладной программе в Рис. 4.18. Структура заголовка и сегмента при наличии регистра имени. возвращаемом параметре segment, пате (имя сегмента). Если ДП не имеет регистра имени, можно использовать один из нескольких эквивалентных методов для отображения (корреляции) адреса, прочитанного из счетчика команд ДП, на сегмент, прими- тивы которого заполняют область буфера, где остановился ДП. Например, адрес указанного пользователем примитива может срав- ниваться с начальным адресом и конечным адресом (начальный ад- рес плюс длина) каждого сегмента: выбранным является тот сег- мент, начальный и конечный адреса которого охватывают адрес примитива. Если ПГП распределяет управляющую информацию по заголовкам сегментов (т. е. справочник сегментов отсутствует), необходимо последовательно проверять сегменты; время поиска в этом случае пропорционально п/2. Если ПГП хранит от- дельный справочник сегментов, его можно упорядочить по адресам сегментов, а не по их именам, и использовать двоичный поиск, что уменьшает время поиска до log2n. Такой справочник, используе- мый для отображения адресов примитивов на сегменты, часто назы- вают картой корреляции (рис. 4.19). Поскольку операции выбора, особенно для больших меню, состоящих из многих элементов, часто доминируют над другими операциями, для быстрого выбора нуж- ной альтернативы может оказаться разумным организовать такой двойственный объект — карта корреляции/ справочник сегментов. Если отсутствуют регистры имени и команд, как, например, в слу- чае локатора планшета, применяемого для моделирования селек- тора, можно использовать Х-, У-регистры ДП, содержащие зна-
200 Глава 4 Память сегментов Рис. 4.19. Линейная карта корреляции, применяемая в отсутствие регистра имени. чения координат курсора. В этом случае для выявления указанного сегмента требуется последовательное сканирование примитивов ви- димых сегментов до тех пор, пока не будет найден примитив, х-, «/-координаты которого отличаются от координат курсора на вели- чину, меньшую заданной. Когда программный поищу увенчается успехом, ПГП возвращает в прикладную программу имя соот- ветствующего сегмента (оно сохраняется ПГП все время, пока про- сматривается данный сегмент). За счет снижения точности корреляции можно упростить вы- числения, выполняемые при просмотре всех видимых примитивов. Для каждого сегмента ПГП может вычислить в нормированном пространстве размеры и местонахождение вертикального прямо- угольника, охватывающего образ сегмента на видовой поверхности. Назовем этот прямоугольник экранной оболочкой сегмента. ПГП хранит упорядоченный список (по возрастанию площади) этих пря- моугольников. Таким образом, сегменты с малой площадью нахо- дятся ближе к началу списка. Для корреляции точки на видовой поверхности с сегментом необходимо просмотреть список до пер- вого сегмента, экранная оболочка которого содержит данную точку. Данный метод пригоден и в случаях, когда сегменты попадают на экране «внутрь» других сегментов, но при этом возникают не- которые проблемы. В частности, поскольку каждый сегмент ап-
Реализация простого графического пакета 201 Точка Выбранный сегмрнт А В С 1 1 2 Рис. 4.20. Экранные оболочки сегментов (штриховые прямоугольники). проксимируется на экране прямоугольной областью, могут возник- нуть трудности с сегментами, для которых аппроксимация неадек- ватна. Наихудший случай приведен на рис. 4.20. Точка А коррели- рует с сегментом 1, но то же самое верно и для точки В, хотя В лежит непосредственно на отрезке прямой, образующем сегмент 21 Для того чтобы выбрать сегмент 2, пользователь должен был бы указать точку, подобную С, т. е. лежащую вне экранной оболочки сегмента 1. Поскольку сами экранные оболочки на экране не по- являются, ситуации, подобные приведенной на рисунке, могут при- водить пользователя в замешательство (упр. 4.17). Несмотря на возможные трудности, данный метод корреляции во многих случаях удивительно эффективен, а сравнительно не- большой объем вычислений повышает его привлекательность. ПГП может минимизировать возможные последствия неправильной кор- реляции, мгновенно повысив яркость выбранного сегмента. Такая обратная связь дает пользователю возможность подтвердить пра- вильность корреляции. В разд. 5.3.2 описаны другие методы, а в гл. 9 — аналогичное применение экранных оболочек в пространст- ве мировых координат. 4.4. СИНХРОНИЗАЦИЯ ЦЕНТРАЛЬНОГО И ДИСПЛЕЙНОГО ПРОЦЕССОРОВ В предыдущем разделе были рассмотрены несколько альтерна- тивных способов реализации операций с сегментами; они ориенти- рованы как на быструю обработку ДП всех видимых сегментов, так и на быстрый поиск и модификацию сегментов центральным про- цессором. В данном разделе рассмотрена классическая проблема синхронизации работы этих двух процессоров с общим буфером*
202 Глава 4 содержащим сегментированную дисплейную программу х. Эта прсб-I лема впервые возникла при обсуждении уплотнения памяти после 1 удаления сегментов. Наша цель состоит в том, чтобы центральный 1 и дисплейный процессоры задерживали один другого как можно меньше; при этом должно соблюдаться ограничение •— последова- ; тельность дисплейных команд, выполняемых ДП, должна быть по ! крайней мере корректной, а может быть и полностью правильной, учитывающей последние изменения. Требование минимальной задержки означает, например, что при создании нового сегмента нельзя останавливать ДП и ждать, пока ПГП проведет весь сегмент через видовую операцию и процесс ге- нерации дисплейных команд. Нельзя также откладывать включе- ние нового сегмента в список регенерации до тех пор, когда он бу- дет полностью определен. Поскольку программист обычно предпо- лагает, что примитивы вывода сразу становятся видимыми (стан- дартный режим в ПГП), каждый новый примитив, генерируемый ПГП, должен быстро включаться в дисплейную программу. Как же предотвратить выполнение ДП той части дисплейной программы, которая модифицируется центральным процессором? Это очень важный вопрос. Предположим, например, что ЦП толь- ко что записал на место команды загрузки регистра команду пере- хода, но еще не успел записать правильный адрес перехода. Если ДП в этот момент выполнит данную команду, он перейдет в непра- вильное место и начнет интерпретировать данные, не являющиеся дисплейными командами. Очевидно, что для предотвращения таких ситуаций необходима какая-то форма синхронизации. В нашей простой графической системе синхронизация осуществ- ляется следующим образом: ПГП, изменяющий содержимое па- мяти, управляет ДП, читающим из этой памяти, с помощью аппарат- ных возможностей интерфейса «центральный процессор — дисплей- ный процессор». После того как ПГП закончил все приготовления к модификации сегмента или справочника, он выдает команду СТОП ДП и ждет, пока ДП пришлет сигнал, что он действительно остановился. Прежде чем остановиться, ДП завершает выполнение текущей команды (это может быть команда, состоящая из несколь- ких слов, например команда вывода текста или команда перехода). После получения сигнала об остановке центральной процессор де- лает необходимые изменения в дисплейной программе и-'запускает ДП. Эта процедура необходима, например, при добавлении прими- тивов к сегменту. После генерации кода каждого нового примитива центральный процессор останавливает ДП, добавляет слова, со- держащие код примитива, к растущему сегменту (смещая команду перехода, находящуюся в конце сегмента) и запускает ДП. 1 Здесь предполагается совместное использование одной и той же памяти. Когда ДП имеет собственную память, он может иметь и микропроцессор, занимаю- щийся связью с центральным процессором и вопросами синхронизации централь- ного и дисплейного процессоров.
Реализация простого графического пакета 203 Для того чтобы такая синхронизация осуществлялась соответст- вующим образом, часть ПГП, выполняемая после остановки ДП, должна быть неделимой операцией, т. е. иметь достаточно высокий приоритет, чтобы дойти до заверщения, прежде чем в операционной системе может произойти какое-либо переключение с задачи на за- дачу. Если генератор команд не является неделимым, ДП может остановиться на неопределенное время. Если происходит изменение небольшого числа слов, как, например, при добавлении примити- вов к сегменту или открытии нового сегмента, проблемы не возни- кает. Но, если удаление сегментов осуществляется путем уплотне- ния памяти, операция DELETE-SEGMENT должна выполнять- ся с наивысшим приоритетом, чтобы она завершилась без прерыва- ний. При однословных изменениях, таких, как установка нового адреса в команде перехода (изменение видимости или списочной структуры), неделимость операции записи в память обеспечивается аппаратно, при этом не требуется даже останавливать ДП — схема доступа к памяти предотвратит попытку одновременного использо- вания одной и той же ячейки центральным и дисплейным процес- сорами. Каковы затраты на синхронизацию при добавлении примитивов к текущему сегменту (наиболее частая операция в ПГП)? К счастью, затраты здесь не слишком велики. Каждый примитив должен прой- ти сначала через видовую операцию и процесс генерации дисплей- ных команд. На все это может быть затрачено от нескольких сотен до тысячи и более микросекунд, тогда как последовательность команд «остановить ДП, вставить несколько слов, запустить ДП» за- нимает лишь десятки микросекунд (за это время можно нарисовать небольшое число векторов). Таким образом, в каждом кадре проис- ходит сравнительно немного очень коротких и незаметных прерыва- ний. (Для дисплеев на запоминающих трубках и для растровых дис- плеев мгновенные задержки в работе ДП не представляют проблемы.) При связанном распределении памяти для дисплейной про- граммы— когда какой-либо сегмент удаляется, а занимаемый им блок возвращается в список свободных — требуется другой тип синхронизации. Если ДП в данный момент интерпретировал именно этот сегмент, то возможно, что оказавшийся свободным блок будет немедленно использован вновь, и ПГП или какой-то другой про- цесс начнет изменять его содержимое. В результате ДП может на- чать выполнять неправильные команды. ПГП предотвращает подоб- ные ситуации, освобождая ненужные сегменты в конце цикла реге- нерации (отмеченном операцией ожидания WAIT), а не тогда, когда вызываются команды удаления сегментов. Для этого необходимо, чтобы ДП прерывал центральный процессор, если ЦП находится в режиме ожидания. Когда центральный процессор закончит рабо- ту, связанную с удалением сегментов, он запустит вновь ДП, кото- рый, однако, должен сначала дождаться окончания интервала вре- мени, заданного в команде WAIT.
204 Глава 4 4.5. ОБРАБОТКА ПРЕРЫВАНИЙ Поскольку опрашиваемые устройства и устройства, вызывающие прерывания, существенно различаются, ПГП должен по-разному организовать работу с ними. Подпрограмма READ-LOCATOR (опросить локатор) просто опрашивает Х-, Y- регистры локатора, находящиеся в ДП, и возвращает вызывающей программе через параметры х и у их значения, выраженные в нормированных коор- динатах. С помощью INVERSE-2 (преобразователь 2) можно по- лучить эквивалентные значения в мировых координатах. ПГП дол- жен также самостоятельно опрашивать локатор от 10 до 30 раз в 1 с, чтобы обеспечить «эхо» на экране — обычно в виде курсора. Как правило, курсор изображается с помощью специального сег- мента и перемещение его по экрану сводится к изменению команды абсолютного позиционирования в этом сегменте. Некоторые ДП выполняют эту задачу автоматически, как только ПГП разрешает работу с локатором. Аналогичным образом READ-VALUATOR (опросить валюатор) опрашивает соответствующий регистр ДП и возвращает прикладной программе его значение в виде дробного числа. Как и в случае ло- катора, ПГП должен обеспечивать «эхо» — отображение текущего значения показаний валюатора. Поскольку в системе обычно име- ется несколько валюаторов (от 8 до 16), для пользователя было бы желательно подавить отображение значений валюаторов, не ис- пользуемых в его программе. ПГП может следить за тем, какие ва- люаторы используются в программе, и включать «эхо» только для них. В более развитых пакетах, таких, как Core, пользователь мо- жет явно включать и выключать индивидуальные устройства, та- кие, как отдельный валюатор. Вид эха также может регулироваться во время выполнения программы. Подпрограммы WAIT-PICK (ждать выбора), WAIT-KEY- BOARD (ждать клавиатуры) и WAIT-BUTTON (ждать кнопки) построены более сложным образом: они неявно разрешают работу с соответствующими устройствами (генерирующими прерывания), переводят прикладную программу в состояние ожидания и пере- дают управление операционной системе. Тем временем ДП осущест- вляет, как обычно, процесс регенерации изображения. Когда дейст- вия пользователя вызовут появление события (или когда истечет контрольный интервал времени), ДП с помощью прерывания сооб- - щит об этом центральному процессору. Программа обработки пре- рывания вернет управление соответствующей подпрограмме ПГП и предоставит ей информацию, описывающую событие. Эта ин- формация преобразуется подпрограммой ПГП в соответствующий вид и через возвращаемые параметры передается прикладной про- грамме. Например, когда пользователь нажмет кнопку, программа об- работки прерывания передает ее номер, полученный от ДП, под-
Реализация простого графического пакета 205 программе WAIT-BUTTON, a WAIT-BUTTON через параметр button_name передает его прикладной программе. На самом деле программа обработки прерывания должна сначала сообщить пла- нировщику операционной системы, что прикладная программа го- това к выполнению. Ее выполнение возобновится в подпрограмме WAIT.BUTTON с инструкции, следующей за инструкцией об- ращения к операционной системе с запросом WAIT (перевод про- граммы в режим ожидания). Подпрограмма WAIT-BUTTON ко- пирует номер кнопки из системной переменной, находящейся в операционной системе, в параметр button_name и возвращает управление прикладной программе на инструкцию, следующую за вызовом WA IT -BUTTON. Таким образом, имеет место передача данных и управления от ДП к операционной системе, затем к под- программе ПГП WAIT-BUTTON и, наконец, к прикладной про- грамме. Аналогично, когда оператор нажимает на клавиатуре клавишу «возврат каретки» (или логически эквивалентную ей), возникшее прерывание приводит к тому, что WAIT .KEYBOARD возвра- щает прикладной программе цепочку литер, введенную пользова- телем, и число литер в ней через параметры text и lenght соответст- венно. Наконец, указание оператора на какой-либо элемент изоб- ражения генерирует прерывание, которое реактивирует под- программу WAIT_Р1СК. Подпрограмма WAIT.PICK выпол- няет процесс корреляции, описанный в разд. 4.3.4. (он состоит в определении имени указанного сегмента) и возвращает имя сег- мента прикладной программе в параметре segment_name. Все программы ПГП, работающие с событиями, должны следить за контрольным интервалом времени и по его истечении возвращать прикладной программе зарезервированное значение 0 в качестве номера кнопки, длины цепочки литер и имени сегмента соответст- венно. В прикладной программе в каждой инструкции ветвления по данным, описывающим событие, такая возможность должна пре- дусматриваться (программа LAYOUT в гл. 2). Все подпрограммы, работающие с событиями, должны обеспе- чивать пользователю соответствующую обратную связь («эхо»). Подпрограмма WAIT-BUTTON может включать подсветку физи- ческой кнопки, добавляя к дисплейной программе соответствующую команду «загрузить маску в регистр кнопок». Для кнопок, модели- руемых алфавитно-цифровой клавиатурой (и для самой подпрогро- граммы WAIT -KEYBOARD), ПГП мог бы обеспечивать соответ- ствующее «эхо», высвечивая вводимые литеры в зарезервированной системой области экрана, недоступной прикладной программе, ра- ботающей с нормированными координатами. Такой метод удобен для прямоугольных экранов, где единичный квадрат (в нормиро- ванных координатах) оставляет неиспользуемой некоторую часть экрана. Однако в случае квадратных экранов пространство норми- рованных координат либо должно совместно использоваться при-
206 Глава 4 кладкой программой и системой, либо быть меньше всей адресуе- мой площади экрана — остающиеся поля тогда можно использовать в качестве зарезервированной области. Литеры, введеннные пользователем в подпрограмме WAIT- KEYBOARD, передаются в эту подпрограмму по одной из програм- мы обработки прерываний, и подпрограмма WAIT-KEYBOARD обычно обеспечивает «эхо» в некоторой зарезервированной области, как в случае моделирования функциональных кнопок. Кроме того, когда нажимается клавиша, логически эквивалентная «возврату ка- ретки», прикладная программа может поместить всю введенную строку (без «возврата каретки») в подходящую точку пространства нормированных координат, что обеспечивает пользователю допол- нительную обратную связь. Чтобы выводить литеры по мере их ввода в позицию курсора или в текущую позицию, в ПГП можно добавить операцию SET_ECHO_POSITION (установить позицию для «эха»). Тогда ПГП мог бы создать специальный сегмент, рисую- щий вводимые литеры; заданная операцией позиция использовалась бы в начальных командах абсолютного позиционирования луча в этом сегменте. Для кнопок, моделируемых с помощью меню световых кнопок, и для самой подпрограммы WAIT-PICK организуется мерцание выбранных сегментов или другое их световое выделение; например, они могут переходить из состояния видимости в состояние невиди- мости 10 раз в 1 с (это несложно сделать с помощью простого тай- мера). Выделение выбранных сегментов либо осуществляется авто- матически самим ПГП, либо это делает прикладная программа, используя атрибут яркости изображения выбранного сегмента (упр. 2.18). В заключение можно сказать, что обеспечение удобного диалога пользователя с ЭВМ требует тщательного проектирования органи- зации работы с устройствами ввода и аккуратной реализации. В частности, непросто реализовать адекватную обратную связь («эхо») на действия пользователя. 4.6. СЕГМЕНТИРОВАНИЕ ДИСПЛЕЙНЫХ ПРОГРАММ ДЛЯ ДРУГИХ УСТРОЙСТВ Сегментирование дисплейных программ осуществляется в ос- новном для векторных дисплеев с регенерацией изображения, по- скольку оно обеспечивает легкость редактирования изображения и оперативность показа измененного изображения на экране. Од- нако этот способ организации дисплейной программы нашел широ- кое применение и для дисплеев с запоминанием изображения, таких, как дисплеи на запоминающих трубках и растровые дисплеи. Он не только повышает совместимость между пакетами, ориентированны-
Реализация простого графического пакета 207 ми на дисплеи с регенерацией изображения и дисплеи с запомина- нием изображения, но значительно улучшает производительность, поскольку за счет дополнительных затрат памяти на организа- цию сегментирования уменьшается время модификации изобра- жения. Основная идея сегментирования состоит в том, чтобы не прохо- дить весь канал генерации изображения (от структуры данных до дисплейных команд) при каждом действии пользователя, требую- щем выборочной модификации изображения, включая удаление его части. Например, в дисплее на запоминающей трубке, не имеющем режима рисования поверх изображения, легко добавлять новые примитивы, но практически неприемлемо (а точнее, слишком расто- чительно по времени) полностью очищать экран, а затем формиро- вать изображение заново в модифицированном виде, поскольку для этого необходимо каждый раз обрабатывать полное описание изоб- ражаемого объекта. Естественно, хотелось бы воспользоваться ре- зультатами работы по отсечению и отображению, проделанной ра- нее над неизменившейся частью изображения. Храня программу дисплея на запоминающей трубке в сегмен- тированном виде, можно повторно нарисовать все изображение, кроме удаленных и невидимых сегментов, непосредственно по по- лученным ранее дисплейным командам, не повторяя вновь путь от описаний более высокого уровня к дисплейным командам. Для дис- плеев на плазменных панелях и растровых дисплеев использование сегментированной дисплейной программы дает более ощутимый вы- игрыш в скорости модификации изображения, поскольку графичес- кий пакет может выполнить команды удаляемого сегмента в режи- ме стирания и затем удалить его. Таким образом, все дисплейные системы независимо от того, имеют ли они встроенную память или нет, могут использоваться более эффективно, если дисплейная программа имеет сегментированный вид. В случае векторных дис- плеев с регенерацией изображения сегментированная программа ис- пользуется и для ускорения модификации изображения, и для его регенерации, в то время как для дисплеев с запоминанием изобра- жения она используется только для его модификации. Отметим, что, если дисплейная программа не используется для регенерации изображения, отсутствует проблема синхронизации центрального и дисплейного процессоров и не требуется останавливать последний на время освобождения памяти от удаленных сегментов. Для того чтобы еще более увеличить эффективность процесса модификации изображения для дисплеев с памятью, введем опера- цию пакетирования последовательных модификаций. В результате этой операции ПГП освобождается от автоматического стирания и повторной генерации изображения при каждом удалении сег- мента. Например, для дисплея на запоминающей трубке было бы жела- тельно сгруппировать серию удалений сегментов в пакет, а нетра-
208 Глава 4 тить время на очистку экрана и повторное рисование изображения при каждом последующем удалении. После вызова подпрограммы BEGIN-BATCH (начало пакета) все операции над дисплейной про- граммой протекают как обычно, но изменения на экране выполня- ются только после того, как вызвана подпрограмма END-BATCH (конец пакета). Последняя вызывается обычно перед обращениями к подпрограммам WAIT_PICK, -KEYBOARD или -BUTTON, запрашивающим информацию от пользователей; для того чтобы пользователь действовал правильно, ему необходимо показать от- корректированное изображение. В ПГП добавляется также новая функция NEW-FRAME (новый кадр), позволяющая в любой мо- мент вне пакета стереть экран и нарисовать текущее изображение. В устройствах, рисующих изображение на бумаге или другом твер- дом носителе, функция NEW-FRAME используется для продви- жения носителя к следующему кадру и рисования текущего изоб- ражения. Для дисплеев с регенерацией изображения команды BATCH и NEW-FRAME могут игнорироваться, так как в дан- ном случае изображение всегда соответствует текущему состоянию дисплейной программы. Процесс пакетной модификации можно сделать еще более эф- фективным, если в пакетном режиме регистрировать операции пе- реноса, удаления и выключения видимости. Если хотя бы одна та- кая операция зарегистрирована, экран очищается и ДП выполняет откорректированную программу. Если таких операций не было, т. е. только добавлялись новые сегменты, то экран не очищается и ДП лишь рисует добавленные сегменты. Для каждого сегмента можно ввести дополнительный управляющий бит, который указы- вает, нужно ли рисовать данный сегмент. Бит устанавливается для новых сегментов и для сегментов, переводимых из состояния неви- димости в состояние видимости; после того как сегмент нарисован, бит сбрасывается. Наконец, рассмотрим приложения, не требующие интенсивного диалога между пользователем и ЭВМ, но использующие возмож- ности дисплея с памятью для вывода произвольно большого числа примитивов без мерцания. Примером такого приложения является интерактивный вывод рисунков на устройство для получения твер- дых копий, при котором перед выдачей рисунка на устройство он предъявляется пользователю на экране дисплея на запоминающей трубке или на экране растрового дисплея. Другим примером явля- ется изображение динамически меняющихся объектов, которые ри- суются на экране запоминающей трубки поверх неизменного фона (такого, как карта, текст или стандартный бланк), выведенного в режиме запоминания. В первом приложении использование дис- плейной программы в качестве промежуточной структуры данных неоправданно, поскольку каждый рисунок будет скорее всего отли- чаться от предыдущего. Во втором приложении можно было бы хранить только дисплейную программу для повторяющегося фона,
Реализация простого графического пакета 209 а изменяющиеся элементы рисовать прямо на экране. Естественно* что при достаточно насыщенном фоне затраты памяти могут ока- заться довольно большими. Система Core имеет средство для «разо- вого» рисования, называемое временными сегментами. Эти сегмен- ты не сохраняются в основной сегментированной дисплейной про- грамме. 4.7. ОБРАБОТКА ОШИБОК В гл. 2 коротко говорилось об ошибочных ситуациях, которые могут возникать при использовании ПГП, и были намечены спосо- бы обработки в ПГП таких ситуаций. Лексические и синтаксические ошибки (такие, как пропущенные или лишние скобки или параметры, либо задание в качестве параметров данных неправильного типа) обычно обрабатываются компилятором. Другие синтаксические или семантические ошибки, являющиеся следствием неправильной по- следовательности обращений к подпрограммам ПГП, следует обра- батывать в самом ПГП. При проектировании пакета возникает вопрос: насколько стро- гим должно быть понятие семантической ошибки? Является ли, на- пример, ошибкой задание операции над несуществующим сегментом? По нашему мнению, хороший проект должен исходить из того, что подпрограммы пакета делают только то, что они должны делать, не имеют побочных эффектов (неявных дополнительных операций над данными) и генерируют предупредительные сообщения для поль- зователя при попытке неправильного их использования. Другими словами, мы не одобряем стратегию автоматического «исправления ошибок», культивируемую в некоторых (студенческих) языках программирования. Такая стратегия оставляет в стороне вопросы «фиксации ошибок» и, как показывает практика, лишь в редких случаях дает результаты, совпадающие с ожиданиями программи- ста. Кроме того, может оказаться, что операции будут заканчи- ваться с разными результатами в зависимости от контекста обра- щения к ним. При всех ошибках после обхода неправильно вызываемой под- программы ПГП должен, конечно, пытаться сохранить работо- способность, чтобы дать пользователю максимум полезной ин- формации. Следует помнить одно простое правило, которое можно кратко- сформулировать следующим образом: каждая правильно спроек- тированная подпрограмма ПГП может выполнять только одну функцию стандартным, заранее определенным способом; любые от- клонения — это ошибочные ситуации. Так, в гл. 2 было показано, что ПГП выдает сообщение об ошибке, если программист попытается удалить несуществующий сегмент. Аналогична реакция ПГП на применение к несуществующему сегменту операций SET_VISI~
210 Глава 4 BILITY, TRANSLATE _I MAGE _2 и RENAMESEGMENTA Программист не может создать сегмент с уже существующим име-1 нем и не может создать новый сегмент, не закрыв явным образом текущий (В некоторых других пакетах подпрограмма CREATE_ SEGMENT может иметь побочный эффект — вызов подпрограммы CLOSE-SEGMENT для открытого сегмента.) Прежде чем форми- ровать примитивы вывода для какого-либо сегмента, его необходимо явным образом открыть подпрограммой CREATESEGMENT. Семантической ошибкой считается также изменение параметров видовой операции путем обращения к подпрограммам WINDOW и/или VIEWPORT в середине определения сегмента (между обра- щениями к GREATESEGMENT и CLOSE-SEGMENT). Такое изменение противоречит тому принципу, что объект (или подобъект) определяется в сегменте целиком после соответствующей настройки видовой операции — никто не меняет настройку фотокамеры во вре- мя выполнения снимка! В то же время операции ввода считаются «ортогональными» к операциям над сегментами и операциям фор- мирования примитивов, поэтому обращения к подпрограммам ввода могут размещаться в любом месте программы. Каждая подпрограмма ПГП после входа в нее сама осуществ- ляет контроль за ошибками; если ошибка найдена, она регистри- руется на выделенном для этой цели логическом устройстве. Для назначения логического устройства можно использовать соответст- вующий механизм операционной системы (процессор языка управ- ления заданиями или интерпретатор языка команд операционной системы). С его помощью логическое устройство связывается с фай- лом на диске, печатающим устройством, алфавитно-цифровым дис- плеем, используемым для общения с операционной системой, или даже со специальной областью для системных сообщений на самом экране. При отладке программы полезно сразу же видеть сообще- ния об ошибке; в «производственном» режиме будет, по-видимому, достаточно фоновой печати. Можно также включить в ПГП про- грамму обработки ошибок, опрашивающую коды ответа/флаги оши- бок, устанавливаемые каждой подпрограммой ПГП. Для реализации контроля за ошибками в операциях над сег- ментами достаточно вставить в операцию поиска проверку правиль- ности имен сегментов. Контекстно-зависимые ошибки (генерация примитивов при отсутствии открытого сегмента, неправильный по- рядок вызовов CREATESEGMENT и CLOSE-SEGMENT или изменение параметров видовой операции там, где этого нельзя де- лать) можно легко контролировать с помощью небольшого числа глобальных переменных. Отметим, что срёди этих ошибок нет фатальных; имеется только одна ситуация, в которой ПГП прекра- щает работу: когда исчерпано пространство, отведенное под дис- плейную программу, и ПГП не может продолжать генерацию прими- тивов. Останов происходит также при некоторых других системных ошибках.
Реализация простого графического пакета 211 4.8. НЕЗАВИСИМОСТЬ ПАКЕТА ОТ ГРАФИЧЕСКИХ УСТРОЙСТВ В данной главе затронуты многие аспекты проблемы обеспечения максимально возможной независимости графических пакетов от видовой поверхности и устройств ввода. Показано, например, что ПГП можно расщепить на две части: независимый от устройства процессор видовой операции и зависимые от устройств генераторы дисплейных команд, формирующие специализированные сегменти- рованные дисплейные программы для 'каждого дисплейного процес- сора (рис. 4.21). Можно сделать еще один шаг в этом направлении — создать промежуточную независимую от устройства дисплейную псевдопрограмму для абстрактного дисплейного псевдопроцессора (рис. 4.22). Этот метод аналогичен P-коду, используемому в незави- симом от устройства, но низкоуровневом промежуточном представ- лении программ Паскаля. В нормированных координатах псевдо- программа может использоваться для модификации изображения на любых графических устройствах, кроме векторного дисплея с ре- генерацией изображения, которому для обеспечения нормальной частоты регенерации необходима высокая скорость обработки дис- плейной программы, возможная только при ее ориентации на кон- кретный дисплейный процессор. (Растровый дисплей со встроенным Рис. 4.21. Канал вывода ПГП, состоящий из независимой от устройства общей части и генераторов команд для конкретных устройств. ФК — физические коор- динаты.
212 Глава 4 Рис. 4.22. Канал вывода ПГП, генерирующий общую псевдодисплейную програм- му и более простую, ориентированную па конкретное устройство дисплейную про- грамму для дисплея с регенерацией изображения. буфером регенерации, хранящим битовую карту, считается здесь, как и выше, запоминающим дисплеем.) Возможность применения дисплейной псевдопрограммы зависит в основном от числа устройств, которые будут использовать одно описание картинки. Оно оправ- дано, например, если несколько запоминающих дисплеев, перье- вой графопостроитель и устройство микрофильмирования одновре- менно копируют одни и те же изображения. Короче говоря, псевдо- программы обеспечивают более высокую независимость от устройст- ва, но за счет дополнительного представления программы и двух последовательных фаз генерации дисплейных команд. Дисплейная псевдопрограмма, являющаяся замкнутым, низко- уровневым, но независимым от устройства описанием картинки,
Реализация простого графического пакета 213 Драйвер логического устройства, генераторы команд и программы, обслуживающие устройства ввойа. Зависимые от устройства и операционной системы драйверы Рис. 4.23. Три части графической системы: общая, независимая от устройства часть ПГП, ориентированные на ПГП драйверы логических устройств и низкоуров- невые драйверы физических устройств ввода-вывода (дисплейные программы не показаны). называется метафайлом. Графический пакет, который записывает и читает метафайлы, может использовать их для сохранения «от- компилированного кода» между сеансами и для переноса графичес- кой информации на различные вычислительные машины и в другие прикладные программы в одной и той же машине. После добавления к каналу вывода (рис. 4.21) низкоуровневых, зависимых от устройства программ ввода информации с диалоговых устройств можно выделить в отдельный модуль для каждого «дис- плея» зависимые от устройства фрагмент программы и данные. Этот модуль называется драйвером логического устройства (рис. 4.23). В него входит генератор команд и программа, обслуживающая устройства ввода, а также программа дисплейного процессора и от- носящиеся к ней данные для управления сегментами. Для обмена данными и управляющими сигналами с физическими устройствами
214 Глава 4 ввода-вывода каждый такой драйвер использует драйверы физичес- ких устройств или «методы доступа» операционной системы. Для того чтобы графический пакет, подобно ПГП, не зависел от уст- ] ройства и вычислительной машины, независимая от устройства 'j часть пакета и драйверы логических устройств для каждого дис- плея реализуются на языке высокого уровня, обеспечивающем пере- нос программ с машины на машину. При таком модульном подходе , перенос пакета с машины на машину и адаптация к другому уст- ройству сводятся в основном к изменению находящегося на самом нижнем уровне драйвера физического устройства. 4.9. ЗАКЛЮЧЕНИЕ В первых четырех главах были рассмотрены вопросы, связан- ные с приложениями интерактивной машинной графики, графичес- ким программированием, аппаратурой и программным обеспече- нием. Основное внимание было сконцентрировано на применении и проектировании простого, независимого от устройства пакета подпрограмм, к которому можно обращаться на стандартных язы- ках программирования высокого уровня; прикладная программа, использующая пакет, может свободно переноситься на вычисли- тельные машины, обеспечивающие работу с таким пакетом. ПГП представляет базовый, но функционально полный набор изобрази- тельных и диалоговых примитивов; в гл. 8 в него будут добавлены средства для работы с трехмерными изображениями, а в гл. 11— дополнительные растровые примитивы для работы со сплошными областями. Однако ПГП не содержит средств моделирования, ориентированных на конкретные применения (эти средства обсуж- даются в гл. 9), и средств, реализующих функции более высокого уровня, такие, как рисование графиков или литер различных алфа- витов; эти возможности можно реализовать в виде надстройки над базовыми средствами ПГП. Пользователь ПГП может также не иметь доступа к специализированным, нестандартным возможнос- тям конкретного дисплея и в общем случае не сможет использовать оптимальным образом средства создания динамических изображе- ний, предоставляемые наиболее мощными дисплеями. В большинст- ве случаев некоторая потеря эффективности и гибкости вполне оку- пается легкостью программирования графических приложений и портативностью • получаемых программ; это позволяет экономить средства, вкладываемые в программное обеспечение. Вопросы соз- дания таких стандартных высокоуровневых пакетов подпрограмм и компромиссы, принимаемые при их проектировании, обсуждают- ся в работах [351, 203] и в статьях журнала ACM Computing Sur- veys за 1978 г. Несмотря на то что в данной книге основное внимание уделяется системе Core и ее подмножеству ПГП, читатель должен помнить о недостатках, свойственных методу подпрограмм. К ним относятся:
Реализация простого графического пакета 215 необходимость придерживаться синтаксических конструкций, име- ющих вид «списка параметров»; отсутствие контроля за правиль- ностью программы на этапе компиляции (поскольку графические подпрограммы могут «комЛилировать» изображения только при об- ращении к ним, т. е. на этапе выполнения прикладной программы). Гораздо предпочтительнее расширять какой-либо компилируемый (или, что еще лучше, интерпретируемый) язык графическими ти- пами данных и операторами, позволяющими создавать немедленно контролируемые, более естественные и более выразительные син- таксические конструкции (см., например, работу [353]). Расшире- ния «стандартных» языков обычно не так легко получить, как это можно было бы предположить: необходимо наложить ограничения на базовый язык и на расширения и, как правило, внести крупные изменения в компилятор. Очень желательна интерпретация такого языка, позволяющая обеспечить максимально благоприятные усло- вия для диалога с пользователем и программистом; однако опа об- ходится пока слишком дорого в системах разделения времени. С на- ступлением эры мощных персональных ЭВМ, оснащенных дисплея- ми с встроенной битовой картой, можно надеяться на постепенное отмирание систем, построенных на базе последовательного, компи- лируемого Фортрана, усиленного графическими подпрограммами, и на введение в широком масштабе интерактивных графических язы- ков, содержащих возможность программирования параллельных процессов. Проектирование таких языков является пока предметом чрезвычайно необходимых научных исследований (даже современ- ный язык Ада [489] ориентирован на традиционные пакетные си- стемы или системы разделения времени и не имеет графических воз- можностей). В языке Smalltalk [69] средства для графического диа- лога и параллельные процессы стали неотъемлемой частью объектно- ориентированного, интегрированного языка и среды, в которой выполняются программы. Такой подход заслуживает большого вни- мания при проектировании и реализации интерактивных графичес- ких систем. В данной главе рассмотрены реализация ПГП для простого дис- плейного процессора с регенерацией изображения и очень коротко несколько альтернативных подходов для других устройств. Методы реализации каждого этапа в каналах ввода и вывода обсуждены до- статочно подробно, и читатель должен быть сейчас в состоянии эф- фективно использовать или реализовать, такой графический пакет. Создание более мощных средств и организация работы с более про- изводительным оборудованием требуют, естественно, обсуждения еще многих других вопросов. Однако, прежде чем перейти к этим более сложным вопросам, познакомимся с физической и логической реализацией устройств ввода (гл. 5) и обсудим вопросы эргономики применительно к интерактивной графике (гл. 6).
216 Глава'4 УПРАЖНЕНИЯ 4.1. Предложите другую модель графического ввода-вывода, которая, на ваш взгляд, отражает ситуацию более адекватно, чем модель, предлагаемая в дан- ной главе, и обсудите достоинства и недостатки обеих моделей. 4.2. Напишите подпрограммы (процедуры), оставшиеся неопределенными в ал- горитме отсечения Коэна — Сазерленда (разд. 4.2.1). Повысьте эффективность этого алгоритма, исключив вычисление обоих кодов внутри на каждом проходе тела цикла. 4.3. После тщательного изучения возможных случаев пересечений с окном напишите алгоритм деления отрезка пополам, рассмотренный в разд. 4.2.1. 4.4. Как вы думаете, надо ли реализовывать программно алгоритм деления отрезка пополам, описанный в разд. 4.2.1. 4.5. а) Для алгоритма Коэна — Сазерленда и алгоритма деления отрезка пополам (разд. 4.2.1) укажите типы отрезков (характеризуемые кодами «вне/вну- три» концов и точками пересечений с окном), отсечение которых занимает наиболь- шее время. б) Покажите с помощью простых алгебраических соотношений, что отсечение может выполняться с одним и тем же результатом в пространстве мировых коорди- нат, в пространстве нормированных координат и в пространстве целых коорди- нат устройства. в) Для обоих алгоритмов отсечения, приведенных в разделе 4.2.1, сравните объемы вычислений, требуемых для обработки отрезка в каждой из двух последо- вательностей: отображение, а затем отсечение по прямому полю вывода и отсече- ние по повернутому окну, а затем отображение. Для каждой из последовательно- стей рассмотрите четыре случая: 1) отрезок принимается целиком; 2) отрезок отбра- сывается целиком; 3) отрезок пересекает одну сторону; 4) отрезок пересекает две стороны. г) Какое из пространств (пространство мировых координат, пространство нормированных координат или пространство физических координат устройства) предпочтительнее для выполнения операций отсечения в зависимости от распре- деления отрезков относительно окна, имеющейся аппаратуры, поворота окна и/или поля вывода и других факторов, которые вы сочтете относящимися к делу. Укажите пространство, которое оказывается предпочтительным в «большинстве» ситуаций. 4.6. Исследуйте некоторые из других методов отсечения, приведенных в ра- боте [238], и сравните принятые в них компромиссы между проверками и вычис- лениями с компромиссами, принятыми в алгоритмах из разд. 4.2.1. 4.7. При пакетной модификации, описанной в разд. 4.6, всякое изменение изображения на экране откладывается до момента, когда встретится конец па- кета. Предложите более эффективный вариант этого метода для запоминающих дисплеев. Имеет ли он какие-либо побочные эффекты? 4.8. Работа с текстом — один из самых трудных аспектов проектирования графического пакета, поскольку разработчику необходимо выбирать между противоречивыми целями: обеспечением эстетичности получаемого изображения и эффективностью использования программного обеспечения и аппаратуры. На- пример, формирование перспективного изображения движущегося грузовика с надписями на кузове предъявляет гораздо более жесткие требования, чем вывод подсказки. Сформулируйте требования к средствам для работы с текстом, которые кажутся вам важными, и проведите критический анализ средств, предлагаемых системой Core [203]. 4.9. Напишите ассемблер-генератор, формирующий примитивы вывода [гл. 2] для дисплейного процессора. Покажите, как надо генерировать команды центрального процессора, реализующие другие функции, и как модифицируется дисплейная программа. 4.10. Рассмотрим простое, раннее устройство Textronix 4006-1 с 10-разряд- иыми целочисленными координатами, обладающее только тремя командами, ко- торые имеют вид цепочек литер в 7-разрядном коде ASCII:
Реализация простого графического пакета 217 1 ENTER (войти в графический режим) 00 11101 2 LEAVE (выйти иэ графического режима) 00 11111 3 VECTOR (рисование вектора) (5 старших и 5 младших разрядов 10-разрядиых ко- ординат х и у в последовательных' 7-разрядных байтах) 01 11 01 10 у_старш. У-Младш. х-старт. х_младщ. Для того чтобы уплотнить поток байтов, передаваемых в терминал в случае коротких векторов, один или оба байта со старшими разрядами координат могут отсутствовать, например: 1 \у_младш., 0\Х-старш., \0х_младш. Первый вектор после команды ENTER используется для абсолютного пози- ционирования луча, остальные — для рисования. После получения команды-сим- вола LEAVE терминал переходит в алфавитно-цифровой режим, причем текст рисуется, начиная с текущей позиции луча с автоматическим переходом к позиции следующей литеры. Напишите простой генератор команд для этого устройства и покажите, как нужно решать проблемы переключения режимов (и как органи- зовать использование экрана прикладной программой и системой). 4.11. Обсудите возможные методы оптимизации программы дисплейного про- цессора и способы их реализации. Дайте конкретные примеры для дисплейного процессора из гл. 3. 4.12. Возможность модификации существующего сегмента отсутствует и в ПГП, и в Core. а) Многие разработчики пакетов предлагают обеспечить выборочное добав- ление примитивов с помощью функции APPEND (segment-name), которая могла бы вновь открыть указанный сегмент и разрешить добавление новых примитивов в его конец. Обсудите, в каких ситуациях эта функция более полезна или пред- почтительна, чем последовательность DELETE-SEGMENT, CREATE-SEG- MENT, и что требуется для того, чтобы реализовать ее. Указание. Рассмотрите проблемы, связанные с текущей позицией, типом ли- нии и другими атрибутами. Какая из двух структур данных, обсуждавшихся в разд. 4.3, создает более благоприятные условия для реализации APPEND? б) Как бы вы определили и реализовали средства для редактирования сег- ментов? 4.13. Рассмотрите более подробно, чем в разд. 4.3, с позиций реализации опе- раций над сегментами достоинства и недостатки разбиения сегментов на блоки постоянной и переменной длины. 4.14. Покажите, как можно было бы использовать указатели предыдущий элемент в списочной структуре из разд. 4.3.3 для упрощения операций удаления сегментов и изменения их видимости и для устранения необходимости держать в списке невидимые сегменты. Оправдывают ли (потенциальные) выгоды дополни- тельные затраты ресурсов на реализацию таких указателей? 4.15. Какие компромиссы приняты при организации хранения справочника сегментов в виде двоичного дерева? Как можно было бы использовать метод пере- мешивания, каковы его достоинства и недостатки? 4.16. Определите детально подпрограмму SET-ECHO-POSITION (уста- новить позицию для «эха»), которая позволила бы ПГП выводить литеры, вводи- мые пользователем с клавиатуры, в точке, выбранной прикладной программой, а не в стандартной, предназначенной для этого области. 4.17. Алгоритм идентификации указанного пользователем сегмента (описан- ный в разд. 4.3.4), использующий экранные оболочки, неоднозначен, если пере- крываются оболочки в точности одинакового размера. Покажите, как возникает эта неоднородность, и сравните две альтернативные стратегии: 1) неоднозначность интерактивно разрешается пользователем; 2) программа корреляции вычисляет
218 Глава 4 точное расстояние для всех примитивов конкурирующих сегментов (гл. 5, разд. 5.3.2). 4.18. Докажите, что архитектура «универсального» дисплейного процессора имеет преимущества при необходимости переноса программ, и покажите, как можно было бы структурировать его псевдодисплейную программу. Желательно ли это? 4.19. Выполните в качестве средней по трудозатратам (например, от 2 до 4 недель) программной разработки проектирование (методом «сверху вниз») и реализацию канала вывода ПГП для построчного печатающего устройства или телетайпа. Учтите проблемы, связанные с различием в числе позиций печати по вертикали и горизонтали и обеспечением максимально возможной гладкости (не- прерывности) линий. Указание. В зависимости от наклона линии используйте различные последо- вательности литер для того, чтобы получалась наиболее гладкая (наименее зазуб- ренная) аппроксимация прямой линии. И наоборот, для того чтобы изобразить атрибут цвета, используйте при формировании примитивов однобуквенные со- кращения.
Глава 5 Диалоговые устройства и интерактивные методы В предыдущих главах уже были рассмотрены некоторые диало- говые устройства и методы организации диалога: световое перо, планшет с карандашом, алфавитно-цифровая клавиатура и функ- циональные кнопки и такие методы их использования, как выбор команды из некоторого меню с помощью светового пера или планшета и позиционирование символов с помощью планшета. В данной главе рассмотрены другие существующие диалоговые уст- ройства и методы их использования; обсуждены их достоинства и недостатки. Наша цель состоит в том, чтобы читатель ясно понимал принци- пы работы устройств и возможные пути их использования. Устрой- ства и методы представляются конструктивными блоками, на базе которых создаются интерактивные системы. В гл. 6 рассмотрены методология и принципы, которые будут полезны при выборе комп- лекта устройств и совокупности методов для конкретного приложе- ния и объединения этих конструктивных блоков в интерактивную систему. , 5.1. КЛАССЫ ЛОГИЧЕСКИХ УСТРОЙСТВ Диалоговые устройства и методы их использования, несмотря на большое разнообразие, можно систематизировать и тем самым структурировать их изучение. В основе систематизации диалоговых устройств лежит выделение классов логических устройств (гл. 2). Имеются пять основных логических устройств: локатор (для ука- зания позиции и/или ориентации), селектор (для выбора показы- ваемого на экране объекта), валюатор (для ввода одиночного зна- чения из пространства вещественных чисел), клавиатура (для ввода цепочки литер) и кнопка (для выбора действия или признака из некоторого набора). Каждое логическое устройство имеет естественный прототип в виде некоторого физического устройства или класса таких уст- ройств. При описании ПГП (простого графического пакета), напри- мер, селектор рассматривался в терминах его естественного прото- типа — светового пера. Прототипом для локатора является план- шет с карандашом, для валюатора — потенциометр, для клавиа-
220 Глава 5 туры — алфавитно-цифровая клавиатура, для кнопки — програм- j мируемая функциональная клавиатура. Однако любое из этих ’ логических устройств можно моделировать любым устройством ввода: многие из рассматриваемых ниже интерактивных методов являются на самом деле методами такого моделирования. Понятие логических устройств ввода имеет много общего с понятием логичес- ких файлов в операционной системе. Последовательный файл ввода можно реализовать физически с помощью считывателя перфокарт, магнитной ленты, магнитного диска или клавиатуры терминала. Прикладному программисту не нужно думать о том, какое именно физическое устройство используется в данный момент — операцио- ная система делает их все функционально «одинаковыми», несмотря на физические различия. Идея логических устройств была высказана в 1968 г. Ньюменом в работе [346]. В 1971 г. в пакете подпрограмм GPGS (general- purpose graphic system — общецелевая графическая система) диалог был реализован с помощью логических устройств и были также про- демонстрированы приемы моделирования устройств ввода (таких, как селектор) на простых дисплейных системах, не имеющих соот- ветствующих физических устройств [4741. Идея логических устройств разрабатывалась затем в серии статей Коттона [107], Уоллэйса и Фоли [161] и Уоллэйса [481]. Кроме того, были описаны некоторые устройства более высокого уровня (такие, как устройство эскизи- рования) для задания последовательности позиций [481]. Логиче- ские устройства имеются не только в GPGS, но и в системе Core [203] и в графическом протоколе сети ARPA [438]. 5.2. ФИЗИЧЕСКИЕ ДИАЛОГОВЫЕ УСТРОЙСТВА В данном разделе рассмотрена работа диалоговых устройств. Основное внимание уделено наиболее распространенным из них. Устройства сгруппированы по классам логических устройств, наи- более близко соответствующих характеру физических операций в каждом описываемом устройстве; это означает, что для реализации логического устройства отнесенным к данному классу физическим устройством требуется минимальный объем программного обеспе- чения. Отметим, однако, что простота реализации не обязательно влечет за собой простоту использования. Поэтому мы не утверж- даем, что конкретные физические устройства лучше всего исполь- зовать для реализации тех логических устройств, к классу кото- рых они отнесены в данном разделе. На протяжении всей главы будут проводиться сравнения и противопоставления различных реализаций логических устройств; надеемся, что это поможет чи- тателю на практике при выборе подходящего метода для реализа- ции какого-либо логического устройства.
Диалоговые устройства и интерактивные методы ZZ1 5.2.1. Локаторы Наиболее часто в качестве локатора используется планшет — плоская поверхность, по которой движется карандаш (похожий на обычный карандаш) или ручной курсор; информация о положении ручного курсора или карандаша доступна вычислительной машине. Планшет о карандашом показан на рис. 1.14; на рис. 5.1 приведен Рис. 5.1. Планшет с подсветкой и курсором, имеющим 12 кнопок. (С разрешения фирмы Talos Systems.) планшет с подсветкой и ручным курсором. В карандаше обычно содержится переключатель, который включается, когда пользо- ватель нажимает на карандаш. В этот момент прикладная про- грамма оповещается о том, что карандаш находится в позиции, представляющей интерес. Большинство ручных курсоров имеют несколько кнопок, с помощью которых пользователь может вво- дить некоторые команды. Переключатель карандаша и кнопки руч- ного курсора на самом деле являются отдельными логическими кно- почными устройствами, которые физически (но не обязательно и логически) объединены с локатором.
222 Глава 5 В большинстве планшетов используются электрические схемы определения положения карандаша или ручного курсора. В одной из таких конструкций в поверхность планшета вмонтирована сетка проводов. Электромагнитное взаимодействие между электриче- скими сигналами в сетке и в карандаше (или в курсоре) создает электрический сигнал в катушке, находящейся в карандаше (или в курсоре). Величина электромагнитного взаимодействия может использоваться для грубого определения расстояния от карандаша или курсора до планшета («далеко», «близко», «на поверхности»). В двух последних случаях обычно включается изображение экран- ного курсора (генерируется аппаратурой дисплея или графическим пакетом), положение которого соответствует позиции, прочитанной с планшета; тем самым обеспечивается визуальная обратная связь для пользователя. Информация от устройства управления планшетом поступает обычно в одном из трех режимов: по требованию, когда вычисли- тельная машина выдает специальный запрос; через каждые t еди- ниц времени; каждый раз, когда смещение ручного курсора или карандаша от предыдущей позиции превысит некоторую величину d. Опрос по времени полезен при отслеживании экранным курсором позиции курсора или карандаша на планшете. Опрос по расстоянию пригоден для оцифровывания рисунков, поскольку позволяет из- бежать ввода чрезмерно большого числа точек. Существенными характеристиками планшетов и других локато- ров являются разрешающая способность, линейность, повторяе- мость и размеры рабочей области. Эти характеристики особенно важны при оцифровывании карт и рисунков. Если данное устрой- ство используется только для позиционирования экранного курсора, требования к этим характеристикам снижаются, поскольку поль- зователь, имеющий визуальную обратную связь в виде положения экранного курсора, может соответствующим образом корректиро- вать движения руки. В настоящее время в продаже имеются план- шеты размером до 122X183 см и точностью до 8 точек на 1 мм. Другим примером локатора является мышь (рис. 5.2), Это уст- ройство обычно держат в руке. В его основании имеются вращаю- щиеся шарики. Перемещение мыши по плоской поверхности при- водит к вращению шариков и потенциометров, подключенных к одному из шариков; сигналы с потенциометров характеризуют относительные смещения в двух ортогональных направлениях. Эти сигналы преобразуются в цифровую форму и используются для определения направления и величины смещения мыши, Мышь можно поднять, перенести и снова поставить на поверхность, не изменяя положения ее экранного курсора. Таким образом, мышь выдает информацию об относительных перемещениях, в то время как планшет — об абсолютной позиции. Вычислительная машина должна сохранять «текущую позицию мыши», пересчитывая ее при каждом перемещении. Мышь, подобно большинству ручных
Диалоговые устройства и интерактивные методы 223 Рис. 5.2. Мышь. (С разрешения фирмы Xerox.) а — вид сверху; б — вид снизу. курсоров, обычно имеет несколько кнопок, которые могут исполь- зоваться для ввода команд или другой информации и, следова- тельно, служить в качестве логических кнопок. С их помощью легко реализуется функция выбора. Хотя точность, обеспечиваемая мышью, сравнима с точностью планшета, осуществить с помощью мыши очень аккуратное эски- зирование труднее, чем с помощью планшета, поскольку человеку труднее точно управлять движениями кончиков пальцев. С дру- гой стороны, для использования мыши достаточна часть стола и мышь дешева в изготовлении. Шар является другой формой локатора (рис. 5.3). Движения шара приводят к вращению потенциометров, выходной сигнал которых преобразуется в цифровую форму. Шар свободно вращается внутри футляра; обычно его вращают ладонью одной руки, держа ее над шаром. С помощью шара трудно осуществить большие и быстрые изменения позиции. Рычаг можно наклонить влево или вправо, вперед или назад (рис. 5.4). Наклоняя рычаг, мы опять-таки воздействуем на по- тенциометры. Очень часто рычаг оснащен набором пружин, возвра- щающих его в центральное положение. Некоторые рычаги, в том числе и приведенный на рис. 5.4, имеют третью степень свободы: рычаг может вращаться вокруг своей оси по часовой стрелке и против часовой стрелки. Изометрический рычаг (рис. 5.5) является
224 Глава 5 Рис. 5.3. Шар. (С разрешения фирмы Ramtek.) Рис. 5.4 Рычаге вращающимся стержнем, позволяющим управлять третьей коор- динатой. (С разрешения фирмы Vector General.) жестким: датчики деформации измеряют малейшие отклонения, вызываемые силой, прикладываемой к рычагу. Рычаг трудно использовать для прямого управления позицией экранного курсора, поскольку небольшие движения руки отража- ются в положении экранного курсора усиленными в 5—10 раз.
Диалоговые устройства и интерактивные методы 225 Рис. 5.5. Жесткий рычаг (с разрешения фирмы Measurement Systems.) Рис. 5.6. Зависимость скорости от наклона рычага. Движения курсора довольно резки, что препятствует быстрому и точному позиционированию. Вследствие этого рычаг часто исполь- зуется для управления скоростью движения курсора, а не его аб- солютной позицией. Текущая позиция экранного курсора изменя- ется со скоростью, определяемой положением рычага. Важно, чтобы имелась небольшая мертвая зона нулевой скорости, служащая для компенсации дрейфа центрального положения рычага. Для того чтобы еще более облегчить пользование рычагом, зависимость скорости движения курсора от смещения рычага часто выбирается нелинейной (рис. 5.6). Такая зависимость и наличие пружин, возвращающих рычаг в нейтральное положение, делают процесс позиционирования довольно быстрым, но не таким быстрым, как в случае планшета или мыши. Рисовальный переключатель (вариант рычага) может переме- щаться в одном из восьми направлений: вверх, вниз, влево, вправо и в четырех диагональных направлениях. Таким образом, данный переключатель имеет девять состояний. В каждом из восьми «ак- тивных» состояний позиция экранного курсора изменяется с по- стоянной скоростью в соответствующем направлении. Таким пере- ключателем неудобно перемещать курсор на большие расстояния. Рычаг удобно использовать для управления ориентацией в трехмерном пространстве (логические локаторы можно исполь- зовать для получения информации о позиции и об ориентации), особенно если рычаг имеет третью степень свободы. Три значения, которые поступают от рычага, можно использовать для управления скоростью вращения вокруг каждой из трех осей. Если рычаг не имеет пружин, возвращающих его в нейтральное положение, вы-
226 Глава 5 Рис. 5.7. Двумерный звуковой планшет. даваемые им значения можно использовать в качестве абсолютных i значений углов поворота вокруг осей, а не в качестве скоростей | поворота. 1 Описанные выше локаторы управляются руками пользователя, j в то время как за положением экранного курсора он наблюдает с j помощью глаз. Чувствительная панель является локатором, позво- ; ляющим пользователю полностью сосредоточить свое внимание на < экране и прямо указывать позицию на нем, а не перемещать экран- ; ный курсор в требуемое положение. Эта прозрачная панель мон- тируется поверх экрана ЭЛТ: когда палец пользователя касается панели, измеряются координаты точки касания. Для изготовления чувствительных панелей используются не- сколько различных технологий. В панелях с низкой разрешающей способностью (10—50 различаемых позиций в каждом направле- j нии) применяются наборы источников света (светодиодов) и свето- чувствительных элементов (фотодиодов или фототранзисторов), формирующие сетку над областью изображения. Касание панели прерывает один или два вертикальных и горизонтальных световых • луча, что позволяет определить положение пальца. Если прерваны два параллельных луча, считается, что палец находится в центре между ними; если прерван один луч, считается, что палец коснулся панели точно на луче. В панели с высоким разрешением (около 500 различных позиций в каждом направлении) используется метод, аналогичный применяемому в эхо-локаторах. Пакеты вы- сокочастотных импульсов подаются поочередно вертикально и горизонтально в плоской стеклянной пластине. Прикосновение пальца к стеклу вызывает отражение части звуковой волны по на- правлению к ее источнику. Зная интервал времени между испуска- нием пакета импульсов и его возвращением, можно вычислить - расстояние до пальца. В другой высокоточной панели использу- • ются два разнесенных на небольшое расстояние слоя прозрачного, материала. На один слой нанесен проводящий материал, на дру- гой — резистор. Нажатие пальца приводит к касанию слоев; па- ! дение напряжения на резисторе измеряется и полученное значение! используется для вычисления координат точки касания.
Диалоговые устройства и интерактивные методы 227 В звуковом планшете устанавливается звуковая связь между карандашом и двумя микрофонами, имеющими вид полосок, укреп- ленных по сторонам планшета. На кончике карандаша генерируется электрический разряд. Временная задержка между разрядом и достижением его звуковой волны каждого микрофона пропорцио- нальна расстоянию от карандаша до каждого микрофона (рис. 5.7). Рис. 5.8. Трехмерный звуковой планшет. Рис. 5.9. Расположение микрофо- нов для жезла Линкольна. Все рассмотренные выше устройства являются двумерными локаторами. Часто удобно иметь трехмерные устройства, несмотря на то что для задания позиции в трехмерном пространстве можно последовательно использовать двумерные устройства. Идея зву- ковой связи может быть использована для создания трехмерного звукового пера. В одном из способов применяются три ортого- нальные полоски — микрофоны (рис. 5.8). Каждый микрофон фиксирует положение карандаша на цилиндре известного радиуса (определяемого временем распределения звука до микрофона), ось которого совпадает с микрофоном. Пересечение этих трех цилиндров определяет положение карандаша. Уравнения трех цилиндров имеют вид x2+t/2 = /l t/2 + z2 = r2, г2 + х^ = г2у, (5.1) где гх, гу и г2 — измеренные радиусы. Другой способ использования микрофонов-полосок для созда- ния трехмерного устройства состоит в формировании квадрата из четырех микрофонов. Более ранний звуковой локатор — жезл Линкольна (названный так потому, что он был разработан в Линкольновской лаборато- рии) — имел четыре точечных микрофона по углам экрана дисплея (рис. 5.9). Здесь также измеряется время распространения звука, но на этот раз эти времена определяют радиусы четырех сфер. Центр каждой сферы находится на одном из микрофонов. (В дей- ствительности для определения позиции нужны только три сферы; четвертая сфера может использоваться для контроля за ошибками
228 Глава 5 Рис. 5.10. Трехмерный локатор. или в случае, когда заблокирован звуковой канал к одному из микрофонов.) Уравнения сфер имеют вид (х—х,.)2 + (г/—г/,)а + (г—г1.)2 = г?> 4=1, 2, 3, 4, (5.2) где Xi, yt, Zi — координаты четырех микрофонов. Решение этих уравнений предлагается читателю в качестве упражнения. Было разработано несколько механических трехмерных лока- торов. Один из них — ящик Нола (названный так в честь разработ- чика Микаэля Нола) — представляет собой большой ящик со сколь- зящими устройствами, позволяющими перемещать некоторую го- ловку в любую точку 30-сантиметрового куба (рис. 5.10). Верти- кальный стержень сбалансирован так, что сохраняет любое уста- новленное положение. Для измерения положения головки вдоль каждой оси применяются длинные скользящие потенциометры. Другой механический трехмерный локатор описан в работе [187]. Все эти трехмерные локаторы работают в относительно малых объемах — не более кубического метра. Исследователи в области машинной графики мечтали получить информацию о движении рук и пальцев пользователя в трехмерном пространстве, чтобы с ее помощью определять позиции и даже поверхности. Это было реали- зовано с помощью оптической связи между активными источниками света (светодиоды), укрепленными на пользователе, и чу ветви-
Диалоговые устройства и интерактивные методы 229 тельными элементами, установленными высоко в углах небольшой комнаты. Были созданы две реализации датчика 166, 177), предназначен- ного для определения параметров плоскости, содержащей источник света. Три таких датчика определяют три плоскости, что доста- точно для определения позиции источника света; четвертый дат- чик, как и в описанном выше устройстве, может использоваться для контроля за ошибками и в тех случаях, когда свет не может пройти к одному из датчиков. Уравнения плоскостей имеют вид а1Тх + а12У + «/зг+а14 = 0> 2, 3. 4- (5.3) В настоящее время исследователи в области машинной графики скептически относятся к возможностям определения позиции в трехмерном пространстве с помощью механических, звуковых и световых датчиков. В системе ROPAMS фирмы Polhemus Naviga- tion Sciences генерируются электромагнитные поля, обнаружива- емые небольшим датчиком, укрепленным на руке или другой части тела. Положение и ориентация датчика могут быть определены очень точно. Этот метод пока еще слишком дорог и может исполь- зоваться только в экспериментальных условиях. 5.2.2. Селекторы Световое перо — единственное устройство, которое по сути яв- ляется селектором. Как показано в гл, 3, выход светового пера обычно связан с управляющей логикой дисплейного процессора (ДП), так что ДП прекращает выполнение команд, когда перо «видит» свет. В момент остановки счетчик команд ДП содержит адрес команды, следующей за той, которая рисовала выбранный примитив 11. Что будут содержать регистры X и Y дисплейного процессора, если прерывание от светового пера придет во время рисования век- тора? При аналоговом генераторе векторов в регистрах будут находиться координаты конечной точки вектора, поскольку точки внутри вектора в цифровой форме не представляются. При циф- ровом генераторе векторов (все чаще встречающемся в современ- ных векторных дисплеях) в регистрах будут находиться коорди- наты точки, расположенной немного дальше той, которую «видело» световое перо. Эти координаты можно сделать доступными цент- 11 В некоторых высокопроизводительных дисплеях время, требуемое свето- вому перу для остановки ДП, может превышать время, требуемое для рисования одного и более коротких векторов или литер, так что счетчик команд может указы- вать на элемент, расположенный в дисплейной программе еще дальше. Кроме того, ДП может иметь конвейерную архитектуру и начинать обработку очередной команды до завершения предыдущей. Для того чтобы обеспечить точный выбор эле- ментов световым пером, графический пакет, возможно, должен включать в дисп- лейную программу специальную графическую команду no-op после каждой группы элементов, которая должна опознаваться.
230 Глава 5 Рис. 5.11. Световые перья. На одном пере установлен механический переключа- тель, па остальных — емкостной. ральному процессору. Их можно использовать, например, при создании отрезка, соединяющего некоторую точку с какой-либо точкой в середине существующего отрезка. Световое перо, реализующее на векторном дисплее логический селектор, на растровом дисплее реализует локатор. Когда перо обнаруживает некоторый пиксел, система генерации изображения может предоставить ЭВМ координаты х и у текущей позиции растра. На рис. 5.11 показаны несколько световых перьев, а на рис. 5.12 — разрез светового пера и основные элементы связанной с ним электронной схемы. Полем зрения пера можно управлять, из- меняя диаметр отверстия перед линзой или настраивая фокусное расстояние линзы. Переключатель можно использовать для вклю- чения и выключения светового пера. На рис. 5.12 переключатель управляет электронной схемой, но в некоторых конструкциях он соединен с механическим затвором. Кроме того, внутри футляра
Диалоговые устройства и интерактивные методы Рис. 5.12. Схема светового пера. пера может находиться фотоумножитель (тогда световод отсутст- вует). Световые перья были разработаны на очень раннем этапе раз- вития интерактивной машинной графики. Первоначально они пред- назначались для использования в системе противовоздушной обороны SAGE для указания целей на экране радара. При непра- вильной настройке световое перо может реагировать на ложные цели, такие, как вспышки флюоресценции или находящиеся рядом примитивы (например, соседние литеры), и не реагировать на те цели, которые нужны. При работе с пером в течение нескольких часов может наступить утомление пользователя, который при каж- дом употреблении пера должен брать его в руку, делать указание и устанавливать на место. Поэтому в большинстве современных систем функции селектора моделируют с помощью планшета или мыши. С развитием растровой графики можно ожидать, что свето- вое перо будет использоваться все реже и реже. 5.2.3. Валюаторы Большинство валюаторов (устройств, предназначенных для ввода в систему скалярных величин) основано на потенциометрах. Потенциометры используются, например, для управления гром- костью и другими характеристиками стереофонического приемника. В большинстве валюаторов применяются вращающиеся потен- циометры, обычно объединенные в группы по восемь или десять (рис. 1.14). Вращающиеся потенциометры особенно удобны при
232 Глава 5 управлении поворотом объектов. Ползунковые потенциометры^» в которых вращение заменено линейным движением, пригодны для! задания значений, имеющих неугловую интерпретацию. Текущее! состояние ползункового потенциометра гораздо легче видеть поль-1 зователю, чем состояние вращающегося потенциометра. К сожале-1 нию, большинство производителей графических систем предлагают! только вращающиеся потенциометры. Наличие обоих типов потен-1 циометров в системе могло бы помочь пользователю запомнить, ка-1 кие функции связаны с каждым валюатором. При проектировании | системы, содержащей потенциометры, необходимо принять единый способ увеличения и уменьшения значений: например, движения по часовой стрелке или вперед обычно означают увеличение зна- > чения. ’ Определение положения потенциометра производится путем ,< измерения напряжения VI (рис. 5, 13) и пропускания измеренного < значения через аналого-цифровой преобразователь. Значение VI ' пропорционально величине поворота рукоятки потенциометра. Если ; преобразователь настроен правильно, то нулевой поворот будет со- ответствовать нулевому значению на выходе преобразователя, пол- ’ ный поворот — единицам во всех разрядах. Здесь предполагается, : что преобразованные значения помещаются в регистры дисплейного процессора (ДП) , которые могут быть прочитаны центральным про- • цессором (ЦП). В некоторых приложениях опрос валюатора осуществляется графическим пакетом, который следит за тем, не превышает ли из- менение валюатора некоторого значения. При превышении генери- руется событие, которое помещается в очередь событий графиче- ского пакета. Это означает, что прикладная программа освобож- дается от контроля за валюатором путем его циклического опроса. Перенос опроса на более низкий и более эффективный уровень эко- номит труд программиста и время центрального процессора. Отме- тим также, что этот подход можно использовать и в локаторах. 5.2.4. Клавиатуры Прототипом (и единственным) устройства ввода текста является алфавитно-цифровая клавиатура. Для обнаружения факта нажатия клавиши используются несколько различных способов: механиче- ское замыкание контакта, изменение емкости, магнитная связь и т. д. Важной функциональной характеристикой клавиату- ры является генерация кода (ASCII, EBCDIC и т. д.), однозначно со- ответствующего нажатой клавише. Качество клавиатуры определяется многими факторами: рас- стоянием между клавишами, наклоном клавиатуры, формой верх- ней части клавиш, усилием, необходимым для нажатия клавиши, и ощущением контакта, когда клавиша полностью нажата. Эти
Диалоговые устройства и интерактивные методы 233 Напряжение V Напряжение Ц- Напряжение О К источнику питания с положительным напряжением V Рис. 5.13. Подключение потенциометра к дисплейному процессору. факторы рассмотрены в работах [264, 272]. Другие важные вопросы связаны уже не с аппаратурой, а с программным обеспечением: часто используемые разделители и клавиши коррекции должны быть легко доступны без необходимости одновременно нажимать управляющую клавишу или клавишу смены регистра; опасные клавиши (такие, как удаление строки) должны быть отделены от других, часто используемых клавиш (таких, как «возврат каретки»). 5.2.5. Кнопки Программируемая функциональная клавиатура (ПФК) явля- ется наиболее распространенным кнопочным устройством. Иногда она имеет вид отдельного блока, но чаще кнопки объединяются с текстовой (алфавитно-цифровой) клавиатурой. Другими кнопоч- ными устройствами служат клавиши, имеющиеся на многих план- шетных курсорах и на «мыши». Кнопки обычно используются для ввода команд или параметров из некоторого меню в графическую программу. В специализированных системах могут использоваться кнопки с постоянными метками. Для работы с переменными мет- ками некоторые ПФК оснащены кодированными пластинами, на- кладываемыми поверх кнопок. На пластинах напечатаны имена команд, а на краю каждой пластины отперфорирован специальный код, который опрашивается системой. Таким образом, система знает, какая именно пластина используется в данный момент. Опе- ратор устанавливает пластину, содержащую требуемую команду, и нажимает соответствующую кнопку. В клавиатуре Нолтона с помощью зеркал происходит наложение меток с экрана ЭЛТ на верхнюю часть непомеченной клавиатуры [268]; такой метод пре- доставляет больше возможностей для работы с переменными мет- ками. Другой способ изменения меток состоит в размещении кно- пок на краю экрана, что позволяет показывать метки вместе с изображением. Чем отличается кнопочное устройство от текстового? Текстовое, устройство позволяет вводить сигналы от кнопок, которым заранее присвоены определенные метки. Клавиши кнопочного устройства
234 Глава 5 не имеют заранее определенного значения, а их число может из-| меняться от одной до нескольких десятков. Кроме того, некоторые! кнопочные устройства выдают сигналы как при нажатии кнопок, | так и при их отжатии. При работе с такой клавиатурой удобно | начинать некоторую деятельность (например, вращение изобража- j емого объекта) с нажатия кнопки, , а прекращать при ее отжатии. Можно считать текстовое устрой- ство специальным видом кнопоч- ного, но, поскольку текстовое ус- тройство нашло большое распро- странение, оно выделено нами в отдельный класс. Рис. 5.14. Аккордная клавиатура. Другим кнопочным устройством является аккордная клавиатура. Она представляет собой пять кнопок, имеющих вид тонких рояль- ных клавиш (рис. 5.14). При работе с устройством нажимают сразу несколько клавиш, т. е. «играют аккордами». При пяти клавишах можно генерировать 31 аккорд. Заучивание аккордов отнимает много времени, но искусные пользователи могут «играть» очень быстро, поскольку рука остается на одном месте. Это позволяет «печатать вслепую». Такую печать гораздо труднее реализовать на обычной ПФК. Однако аккордная клавиатура не представляет собой хорошую замену алфавитно-цифровой клавиатуры [264]. 5.2.6. Нетрадиционные устройства В графических системах полезны многие другие диалоговые устройства, но их нелегко отнести к используемым нами классам. Например, для ввода команд, значений и т. д. можно использо- вать распознаватели речи, уже доступные в версиях, распознающих от 100 до 1000 слов. Слова определяются как дискретные высказы- вания, которым предшествует и за которыми следует пауза про- должительностью 100—200 мс. Распознавание слитной речи пока еще в основном находится на этапе исследований [256], хотя некоторые системы уже появились в продаже. Большинство распознавателей слов настраиваются на харак- теристики речи конкретного человека. Из слова выделяются зву- ковые колебания нескольких частот. Спектр относительного рас- пределения громкости звука по этим частотам сопоставляется со словарем таких спектров. Обучение распознавателя заключается в создании словаря таких спектров путем произнесения пользовате- лем каждого слова несколько раз. Однажды созданный словарь может быть сохранен для последующего использования. Однако, если пользователь простудился, необходимо повторное обучение. Распознаватели, не э^исящие от характеристик речи конкретного
Диалоговые устройства и интерактивные методы 235 человека, имеют ограниченный словарь (10—20 слов, которые содержат также цифры от 0 до 9). Кроме речевого ввода существует речевой вывод (также на базе оцифрованных спектров), который можно использовать для подсказок, в качестве обратной связи и для сообщений об ошибках. Синтезаторы стали довольно обычными и недорогими устройствами; они применяются в нескольких современных домашних ЭВМ. «Иг- рушка» фирмы Texas Instruments «Произноси и напиши» служит примером возможностей, ставших доступными в настоящее время. В общем случае следует ожидать, что речевой ввод-вывод получит широкое распространение в этом десятилетии, поскольку он яв- ляется естественным, простым и быстрым и не требует ловкости РУК. ( 5.3. МЕТОДЫ МОДЕЛИРОВАНИЯ ЛОГИЧЕСКИХ УСТРОЙСТВ Во многих графических программах требуются локатор, селек- тор, валюатор, клавиатура и кнопки, но во многих графических системах не все эти физические устройства имеются. Однако логи- ческую функцию любого из этих устройств можно реализовать с помощью устройства из любого другого класса, хотя не всегда удачно. С другой стороны, мы не выступаем за го, чтобы для каж- дого из требуемых логических устройств всегда имелись отдельные физические устройства. Многие очень удобные в использовании интерактивные системы имеют только позиционирующее устрой- ство (обычно мышь или планшет), клавиатуру и иногда несколько специализированных функциональных кнопок на клавиатуре. С по- мощью этих трех физических устройств реализуются все логиче- ские устройства. В данном разделе описаны некоторые из наиболее употребительных и полезных методов моделирования устройств ввода. Более подробные описания и обсуждение связанных с таким моделированием эргономических факторов можно найти в работах [136, 166]. Иногда такие реализации являются частью графического па- кета. Например, в дисплейных системах на запоминающей трубке (в которых невозможна работа со световым пером) в качестве селек- тора используется локатор в виде курсора из скрещенных линий: курсор помещается в вершину выбираемого элемента. Затем, когда пользователь нажимает любую клавишу, код соответствующей литеры и позиция курсора посылаются в центральный процессор. Эта позиция сравнивается с позициями всех показываемых элемен- тов, чтобы найти ближайший. В других случаях такая реализация может быть частью прикладной программы. Выбор световых кно- пок из некоторого меню можно рассматривать (гл. 2) как реализацию кнопочного устройства с помощью селектора.
236 Глава 5 В таких графических пакетах, как GPGS, и в системе Core вся пять типов устройств определены как доступные и гарантировано! что при отсутствии соответствующего физического устройства пакет предоставляет разумную реализацию. «Разумная» здесы означает следующее: 1) примерно наилучшая из тех, какие можно реализовать на базе имеющихся устройств ввода, но 2) обычно менее удобная и приятная для пользователя, поскольку отнимает больше времени, и 3) логически идентичная, так что прикладная программа не может определить характер физической реализации.* Такой подход расширяет возможности переноса программ, но ли- шает прикладного программиста возможности управлять некото- рыми особенностями диалога на нижнем уровне. Кроме того, не-' которые реализации могут потребовать значительных ресурсов; центрального процессора, например при моделировании прерываний \ от логических устройств с помощью циклических опросов. Тем не. менее с точки зрения затрат очень выгодно осуществлять отладку прикладной программы на недорогом дисплее с запоминающей' трубкой (одном из многих в вычислительном центре), прежде чем" пропустить отлаженную программу в рабочем режиме на одном из немногих более дорогих высокопроизводительных дисплеев. 5.3.1. Моделирование локатора Световое перо. В векторном дисплее световое перо часто ис- пользуется в качестве локатора. Сначала в некоторое место экрана ЭЛТ выводится следящее перекрестие (рис. 5.15). Для задания позиции световым пером сначала указывают пером на перекрестие и затем «передвигают» его в требуемую позицию. Это осуществ- ляется путем непрерывного (в каждом цикле регенерации) переме- щения перекрестия таким образом, чго последнее всегда находится под световым пером. Новая позиция све- * тового пера вычисляется по точкам, ко- • . торые в предыдущем положении пере- • крестия попали в поле зрения светового • | пера (рис. 5.16). Координаты новой по- ' * * зиции определяются как средние значе- • • • • • • • > • • ния координат всех точек, зарегистри- • * рованных световым пером. • Если в поле зрения пера не попада- • ет ни одна точка перекрестия, это оз- • начает, что перекрестие потеряно. Это * могло произойти случайно (если поль- зователь перемещает перо так быстро, что не успевает срабатывать алгоритм слежения) или намеренно (если поль- зователь убрал перо с экрана ЭЛТ). В последнем случае пользователь может Рис. 5.15. Следящее перек- рестие светового пера (стрел- ками обозначен порядок изо- бражения точек). Типичные высота и ширина перекрестия составляют ~25 1^м.
Диалоговые устройства и интерактивные методы 237 е е Попе зрения светового \ перо О - • • • ev® о о О ®z \© е е Новее положение центра . слеЭящего перекрестия е е Обозначения в Нарисованные и необнаруженные твики Ф Нарисованные и обнаруженное точки О Ненарийованные точки е Рис. 5.16. Пример слежения. указывать тем самым, что следящее перекрестие находится в ко- нечной позиции и что желательно перейти к следующему шагу ди- алога. Когда перекрестие теряется, дисплейная система может автома- тически попытаться восстановить слежение, чтобы определить, была ли потеря случайной или намеренной, т. е. она может попы- таться установить, где находится в данный момент световое перо. Рис. 5.17. Спираль то- чек, используемая для восстановления слеже- ния за пером Рис. 5.18. Алгоритм прогнозирования позиции свето- вого пера первого порядка. Если перо действительно убрано с экрана, оно не будет найдено и система будет знать, что потеря перекрестия была намеренной. Первый способ восстановления слежения состоит в рисовании квадратной спирали точек вокруг последнего известного положе- ния светового пера до тех пор, пока не будет покрыт весь экран, или пока не будет найдено световое перо (рис. 5.17). Второй способ состоит в растровом сканировании всего экрана, причем расстояние между строками растра должно быть немного меньше диаметра поля зрения светового пера. Если перо находится на экране, им будет зарегистрирована некоторая строка растра. Если векторы
238 Глава 5 рисуются цифровым способом, координаты светового пера будут! доступны сразу же; при аналоговом генераторе векторов необхо-| дим более точный поиск вдоль строки растра для нахождения | горизонтальной координаты светового пера. Третий способ состоит \ в литерном взрыве — последовательном заполнении экрана лите- рами (или точками, или короткими отрезками), пока одна из них не будет зарегистрирована световым пером. Отметим, что все три метода могут использоваться независимо от процесса слежения для определения текущегб местонахождения пера на экране. Алгоритм слежения должен обеспечивать перемещение перекре- стия с разумной скоростью так, чтобы перекрестие не терялось слишком часто. Максимальное расстояние, на которое может сме- ститься перекрестие за одну итерацию, равно половине длины отрезков, образующих перекрестие. (Диагональное расстояние меньше.) Если длина отрезка равна ~25 мм и перекрестие меняет позицию 30 раз в 1 с, то максимальная горизонтальная или верти- кальная скорость, с которой может перемещаться перекрестие, равна ~375 мм/с (12,5 мм за один шаг). Вероятность потери перекрестия можно уменьшить, увеличив скорость его движения путем прогнозирования положения пера в следующем цикле на основании его положений в предыдущих двух или грех циклах. Перекрестие помещается в прогнозируемую позицию, а не в ту, которая вычисляется описанным выше простым методом усреднения. При прогнозировании предполагается, что перо движется с постоянной скоростью. Таким образом, в i+1-м цикле регенерации перекрестие помещается не в позицию, вычис- ленную на i-м шаге, а в позицию, определяемую линейной экстра- поляцией по позициям перекрестия на шагах i—1 и i (рис. 5.18). Управление курсором с клавиатуры. Локатор можно также моде- лировать четырьмя клавишами на клавиатуре, управляющими движениями курсора вверх, вниз, влево и вправо. Некоторые кла- виатуры имеют клавиши, специально предназначенные для этой цели. Удержание клавиши в нажатом состоянии может вызывать быстрое непрерывное движение курсора, в то время как резкое одноразовое нажатие — единичное перемещение (эта единица долж- на быть не меньше единицы разрешения дисплея). Процесс позицио- нирования курсора можно ускорить, непрерывно увеличивая ско- рость движения курсора в течение всего времени, пока клавиша удерживается в нажатом состоянии: если клавиша отжимается, курсор должен остановиться. Ввод позиции с клавиатуры. Всегда имеется возможность мо- делирования локатора путем набора координат позиции или пара- метров ориентации на клавиатуре, но при этом пользователь дол- жен выполнять довольно трудоемкую работу: перевести желаемые визуальные результаты в числа. Непосредственный визуальный контроль за гладким динамическим изменением позиции или вра- щением заменяется длинными диалоговыми процедурами, где цаж
Диалоговые устройства и интерактивные методы 239 дый шаг заканчивается предъявлением статического изображения. Для дисплея на запоминающей трубке, не допускающего локальной регенерации изображения, такой метод наиболее правилен. В ос- тальных случаях пользователь будет выражать неудовольствие, за исключением ситуаций, когда координаты точно заданы. 5.3.2. Моделирование селектора Выбор курсором. Наиболее часто селекторы моделируются фи- зическим локатором (планшетом, мышью и т. д.), с помощью ко- торого пользователь перемещает экранный курсор на объект, пред- ставляющий для него интерес, и нажимает кнопку. Затем графиче- ский пакет ищет в псевдодисплейном файле сегмент, ближайший к данной позиции курсора. Этот метод особенно привлекателен, если одна из нескольких кнопок, установленных на мыши или курсоре планшета, используется для запуска процесса поиска: каждая кнопка может иметь определенный смысл — выбор, уда- ление, перемещение, вращение и т. д. Конечно, слишком большое количество кнопок затрудняет работу пользователя; в этом случае требуемую функцию можно выбирать из некоторого меню с помощью того же локатора. Процесс поиска можно выполнять несколькими способами, один из которых обсуждался в гл. 4. Другой способ состоит в расшире- нии таблицы корреляции графического пакета путем включения в нее экранной оболочки для каждого сегмента. Экранная оболочка представляет собой вертикальный прямоугольник, охватывающий изображение сегмента, и может быть определена четверкой чисел (xmin, Xmax- //min, Утах)- Ниже ОНЭ будет НаЗЫВЭТЬСЯ ПрОСТО ОбоЛОЧ- кой. Пользование таблицей корреляции не представляет трудностей: имея позицию моделируемого селектора (хр, рр), необходимо найти в таблице все сегменты, такие, что -'“min < < -'“так ® Утш Ур < Утах- Если этим условиям удовлетворяет только один сегмент, задача решена. В остальных случаях необходимо дальнейшее уточнение. На рис. 5.19 показано, почему несколько сегментов могут удов- летворить этим условиям. Имеются, конечно, случаи, когда сег- менты не перекрываются, как, например, световые кнопки, обра- зующие некоторое меню. Что делать, если оболочки нескольких сегментов все же пере- кроются? В этом случае необходимо рассмотреть отдельные при- митивы вывода, образующие каждый из сегментов с перекрываю- щимися оболочками. В общем случае таких сегментов будет не- много. При этом опять можно использовать понятие оболочки, но уже для отдельных примитивов. Рассмотрим точку (хр, z/p) на рис. 5.20. Оболочка определяется следующим образом: xmin=xp—d, xm3X=xv+d, ymin=yv—d, ymax=yp+d- Э™ Оболочки можно было
240 Глава 5 бы тоже хранить в таблице корреляции или вычислять каждый раз, когда она потребуется, декодируя дисплейную программу. Параметр d выбирается таким образом, чтобы неточность в пози- ционировании курсора была приемлемой. Чем больше d, тем мень- шая точность действий требуется от пользователя, но тем больше вероятность того, что сразу несколько точек попадут в поле зрения моделируемого селектора. Рис. 5.19. Перекрытие обо- лочек для символов пись- менного стола и кресла. ।-----------п (*р + d, у + <У) I I fcp - d. ур - d} 1--------------I Рис. 5.20. Оболочка точки. Для изображенного на рис. 5.21 отрезка, соединяющего точки (х/, yl) и (х2, у2), оболочка определяется следующим образом: xmill = min(xl, х2)—d, xmax = max (xl, x2)4-d. ymin = y2)—d, t/max = max(i/l, y2) + d. Если прикладной программе необходимо знать, выбрана ли селек- тором конечная точка отрезка или сам отрезок, достаточно срав- нить с позицией моделируемого селектора сначала оболочки, ок- ружающие конечные точки (х/, yl) и (х.2, у2), и только при невы- полнении условий выбора для точек нужно сравнивать с позицией курсора оболочку самого отрезка. Рис. 5.21. Оболочка отрезка. Рис. 5.22. Перекрытие оболочек трех от- резков, находящихся в разных сегментах. Второе отсечение также может не дать единственного результата, если имеются перекрывающиеся оболочки примитивов (рис. 5.22). В этом случае последним шагом "будет более точное определение,
Диалоговые устройства и интерактивные методы 241 какой из примитивов ближе к моделируемому селектору. Для точки эта процедура довольно проста: надо найти D2 = (xp-x)2 + (i/p-i/)2. (5.4) Поскольку необходимо сравнивать только относительные расстоя- ния (чтобы определить, какая из выбранных точек ближе всего к точке (хр, t/p)), операция извлечения квадратного корня не требу- ется: для нахождения минимума с равным успехом можно сравни- вать квадраты расстояний. При вычислении кратчайшего расстояния от прямой до точки Р необходимо выполнить несколько операций умножения и деления. Эта задача эквивалентна нахождению на прямой точки Р', которая является ближайшей к Р, и вычислению расстояния от Р до Р'. При этом можно использовать приближенный способ: в качестве расстояния брать минимум горизонтального и вертикального рас- стояний от позиции локатора до прямой; в этом случае вычисления упрощаются, но возможна ошибка в 1^2 раз. Формирование суммы квадратов для вычисления D2 может само занимать много времени, особенно если выполняется на ЭВМ, не имеющей аппаратного ум- ножения. Величина D (а не D-) хорошо аппроксимируется фор- мулой, приведенной в работе [375]: |Хр—xl + |j/p —у| + 2*тах | хр—х |, |ур—у|) Средняя ошибка при этом составляет ~3,5%, а максимальная ошибка — немного больше 5% (вполне достаточно для тех целей, где эта формула будет использоваться). Поскольку расстояния необходимо только сравнивать, деление на 3 не обязательно. Та- ким образом, вычисление по этой приближенной формуле может оказаться быстрее, чем вычисление Di. Итак, тем или иным методом вычисляются расстояния от каж- дого примитива вывода до позиции моделируемого селектора. Пер- вый же примитив, удаленный от этой позиции не далее чем на d, считается тем примитивом, на который указывает селектор. Если такие примитивы отсутствуют, считается, что выбора не произве- дено, селектор ни на что не указывает. Этот трехшаговый процесс позволяет избежать подробной про- верки большинства сегментов и примитивов вывода, далеких от позиции моделируемого селектора, поскольку сначала проверяются оболочки сегментов, затем оболочки примитивов и лишь в конце фактические расстояния. Другой подход, более простой в реали- зации, но более медленный в исполнении, состоит в проверке каж- дого примитива. Основная идея заключается в том, что каждый примитив вывода отсекается по маленькому окну селектора со сто- роной 2d. Первый же примитив вывода, проходящий через окно селектора, считается тем примитивом, на который указал селектор. В случае дисплейного процессора, аппаратно реализующего ал-
?42 Глава 5 горитм отсечения, использование такого подхода дает большие» преимущества. Как показано в гл. 9, оболочки могут применяться! и здесь для ускорения процесса отсечения (за счет определения,! перекрываются ли оболочка и окно селектора). Некоторые из этих ’ методов подробно рассмотрены в работе [183]. Для перемещения экранного курсора в желаемую точку (либо , для моделирования селектора, либо в качестве локатора) можно использовать многие физические устройства. Какое из них яв- . ляется наилучшим? В проведенном в 1978 г. эксперименте Кард, Инглиш и Барр обнаружили, что при выборе символов и групп символов с полностью заполненного экрана мышь превосходит по скорости изометрический рычаг и управляющие клавиши [73]. Они также показали, что время, необходимое для перемещения курсора, подчиняется закону Фитта: время пропорционально логарифму частного от деления расстояния, на которое надо пере- местить курсор, на размер цели. Поэтому выбираемые цели неза- висимо от того, являются ли они световыми кнопками или симво- лами, должны иметь большие размеры. В эксперименте Инглиша, Энглбарта и Бермана, проведенном в 1967 г., было также обнаружено, что мышь превосходит по ско- рости световое перо и рычаг [140]. В 1975 г. Гудвин нашел, что световое перо обладает большей скоростью, чем управляющие клавиши на клавиатуре [191]. В работе [315] было обнаружено, что шар имеет более высокую скорость, чем рычаги с пружинами и без пружин и изометрические рычаги. Хотя к обобщению экспе- риментальных данных следует подходить осторожно, несомненно, что среди всех рассмотренных устройств мышь занимает одно из первых мест, а рычаг — одно из последних. Ввод имени. Селектор можно также моделировать, приписывая имя каждому сегменту или другой логической группе примитивов вывода и показывая имена на экране. При этом пользователь вводит с клавиатуры имя интересующего его объекта. Данный метод используется в нескольких имеющихся в продаже чертеж- ных системах. Однако его скорость меньше, чем при моделировании селектора с помощью курсора, а чувствительность к ошибкам печати выше. Простота использования метода повышается, если имена приписываются самим пользователем, так как они будут более естественными для данного приложения. Последовательное увеличение яркости. Селектор можно моде- лировать с помощью трех кнопок. При этом способе каждый объ- ект, который может быть выбран с помощью селектора, пооче- редно увеличивает свою яркость на короткий отрезок времени. Когда подсвечивается нужный объект, пользователь активирует одну кнопку. Однако в течение короткого отрезка времени между подсвечиванием объекта и активацией кнопки, вероятно, успеют подсветиться несколько последующих объектов, поэтому нажима- ется вторая кнопка, предписывающая изменить последовательность
Диалоговые устройства и интерактивные методы 243 подсветки на обратную и вести ее в пошаговом режиме. Когда опять подсвечивается нужный объект, нажимается третья кнопка, и процесс прекращается. Данный метод с успехом применялся для выбора отдельной молекулярной связи из нескольких тысяч, изображаемых на экране; в этом случае близость отдельных связей не давала возможности использовать какой-либо другой метод. Как показано в гл. 14, он пригоден также для стереоскопических трехмерных дисплеев [360]. 5.3.3. Моделирование валюатора В графических приложениях пользователь часто должен вво- дить числовые значения, не привязанные к мировым координатам (например, сопротивление, модуль Юнга для бруса, коэффициент демпфирования амортизатора). Ось локатора. Одна координатная ось рычага, планшета или другого локатора может моделировать валюатор невысокой точ- \ ности. Торнтон показал, как можно использовать планшет для моделирования валюатора с практически бесконечным диапазоном [463]. Ввод значения. Значение можно непосредственно набрать на клавиатуре, используя математическую запись для очень больших или очень малых значений. , 0,01 0,10 1,0 10 100 1000 67% Рис. 5.23. Шкалы. Работа со шкалами. На экране можно изображать круговые или линейные шкалы (рис. 5.23) и с помощью селектора, модели- руемого локатором, манипулировать ими: переносить стрелку в соответствующую позицию или выбирать нужное деление на шкале.
244 Глава 5 При таком способе моделирования валюатора полезно выводи™ на экран в числовом виде значение, выдаваемое им в каждый момент. Все шкалы должны ориентироваться естественным обрав зом: человек обычно предполагает, что движение слева направоД снизу вверх или по часовой стрелке соответствует увеличений значения, а в противоположном направлении — уменьшению. i 5.3.4. Моделирование клавиатуры j Распознаватели литер. Распознаватели литер использовались', в машинной графике с начала 60-х годов [61, 457]. Программа и) данные занимают обычно менее 4 Кбайт: в продаже имеется не-1 сколько вариантов, базирующихся на микропроцессорах. В ра-! боте [352] описана упрощенная реализация распознавателя Титл-4 мэна [4571, разработанная Лэдином. Распознавание выполняется путем сравнения характеристических особенностей литер (наклоны, точки изгиба, пересекаемые квадранты и т. д.), нарисованных! локатором, с хранящимся в памяти словарем особенностей каждой" литеры. Распознаватели можно обучать для распознавания раз- личных стилей рисования печатных литер: параметры каждой ха- рактеристики вычисляются по набору литер, нарисованному данным пользователем. Скорость рисования печатных литер относительно невелика по сравнению с печатью на клавиатуре или рисованием обычных рукописных литер: трудно рисовать более двух-трех печатных букв в 1 с (попробуйте сами!), так что для ввода большого объема текста распознавание не годится. Рукописные литеры рисуются быстрее, но до сих пор нет простых алгоритмов для распознавания сплошного рукописного текста. Меню-клавиатура. Меню литер можно изображать на экране и выбирать из них нужные литеры с помощью селектора. Эта про- цедура выполняется медленно и может использоваться только для очень коротких последовательностей литер или операторами, плохо печатающими на клавиатуре. Меню не обязательно рисовать на экране: можно напечатать клавиатуру на планшете и использовать карандаш планшета для указания последовательности литер. По- следний способ может также использоваться для ввода команд, если они изменяются не слишком часто. 5.3.5. Моделирование кнопок Распознаватели образов. Эффективным применением локатора является распознавание определенных движений курсора как ак- тиваций кнопок. На рис. 5.24 приведены движения, распознава- емые в системе анализа очередей [234]: восемь различных движений легко распознаются простым алгоритмом. Значение некоторых движений специализировано для данного приложения, другие
Диалоговые устройства и интерактивные методы 245 Увалить Переместить \ Созвать случайную ветвь ----------------- Ч I 4 Создать приоритетную ветвь — / / / Созвать случайный узел — X / / Создать приоритетный узел Соединить с портом ввода Соединить с портом вывова Рис. 5.24. Движения, распознаваемые как команды. имеют довольно общий смысл. Конструкторская чертежная система, созданная фирмой Applicon, распознает несколько десятков таких движений. Этот метод особенно привлекателен тем, что движение обычно выполняется поверх объекта, над которым нужно осущест- вить какую-то операцию, или в позиции экрана, в которую необ- ходимо что-либо поместить, так что одной командой в систему вводится сразу много информации. В продаже имеются интеллек- туальные планшеты со встроенными микропроцессорами для рас- познавания образов и литер. Меню. Меню, использованное в гл. 2, представляет собой обыч- ный способ моделирования кнопок. Меню команд содержит цепочки литер, а меню обстановки комнаты использует символы, представ- ляющие различные предметы обстановки. Меню команд также мо- жет использовать символы: прямая стрелка может обозначать сдвиг, кривая — вращение, красная кисть — СДЕЛАЙ ЭТО КРАСНЫМ. Меню является очень важным методом организации диалога, поскольку хранение в памяти имен команд или выбираемых по же- ланию параметров и свойств заменяется их распознаванием. Сим-
246 Глава 5 ЗАДАНИЕ КОНЕЧНЫХ ТОЧЕК ЗАДАНИЕ ВХОДНЫХ ЗНАЧЕНИЙ ОРИЕНТАЦИЯ —БЕЗ СИЛЫ ОРИЕНТАЦИЯ-С СИЛОЙ ПРЯМАЯ ЛИНЕЙНАЯ СИЛА ОБРАТНАЯ ЛИНЕЙНАЯ СИЛА ПРЯМАЯ КВАДРАТИЧНАЯ СИЛА ОБРАТНАЯ КВАДРАТИЧНАЯ СИЛА ПРЯМАЯ КУБИЧЕСКАЯ СИЛА ОБРАТНАЯ КУБИЧЕСКАЯ СИЛА ЗАВИСЯЩАЯ ОТ СКОРОСТИ СИЛА ПЕРПЕНДИКУЛЯРНАЯ ЗАВИСЯЩАЯ ОТ СКОРОСТИ СИЛА ПРОИЗВОЛЬНОЕ РАСПРЕДЕЛЕНИЕ ЗАРЯДА КОНДЕНСАТОР ДИОД ТРИОД ЯДЕРНАЯ СИЛА ДВЕ ПЛАНЕТЫ ПЛОСКИЙ КОНДЕНСАТОР ЦИЛИНДРИЧЕСКИЙ КОНДЕНСАТОР СФЕРИЧЕСКИЙ КОНДЕНСАТОР ИЗМЕРИТЕЛЬ—ТОЧНЫЙ ИЗМЕРИТЕЛЬ —ГРУБЫЙ ЗАДАНИЕ ВХОДНЫХ ЗНАЧЕНИЙ ИЗМЕНЕНИЕ КОНСТАНТЫ ПРОПОРЦИОНАЛЬНОСТИ УДВОЕНИЕ КОНСТАНТЫ ПРОПОРЦИОНАЛЬНОСТИ ПОЛОВИНА КОНСТАНТЫ ПРОПОРЦИОНАЛЬНОСТИ ОТТАЛКИВАЮЩАЯ СИЛА ПРИТЯГИВАЮЩАЯ СИЛА ОПРЕДЕЛЕНИЕ ПОЗИЦИИ ГРУППОВОГО УСТРОЙСТВА ЗАВЕРШЕНИЕ Рис. 5.25. Полноэкранное меню. (Фоли, Уоллэйс, ТИИЭР, 62, Xs 4, 1974 г.) волы можно использовать в меню, если их распознавание происхо- дит быстрее, чем распознавание эквивалентного текста. Например, система автоматизации канцелярских работ Star фирмы Xerox использует символические представления для корзинок входных и выходных бумаг, печатающих устройств, картотек и документов. Для того чтобы напечатать отчет, пользователь просто выбирает символ, соответствующий отчету, и перемещает его на символ пе- чатающего устройства [419]. Меню может содержать много входов. В предельном случае оно занимает весь экран (рис. 5.25). Такое меню нарушает визуальную
Диалоговые устройства и интерактивные методы 247 непрерывность диалога и мешает сохранению чувства «места», поскольку при каждом его показе визуальный контекст теряется. Обычно предпочтительнее сокращенное меню (рис. 5.26), хотя его элементы могут оказаться более трудными для понимания. Стати- ческое меню всегда показывается в одном и том же месте экрана и может присутствовать на экране постоянно или только в нужные моменты. Динамическое меню появляется на экране в различных позициях обычно там, где в данный момент находится курсор (уп- равляемый планшетом или другим локатором). Предполагается, что взгляд оператора устремлен на экранный курсор и с помощью динамического меню минимизируются движения рук и глаз. 48,000 44,000 40 000 36 000 32,000 28 000 24 000 20,000 16,000 12,000 8,000 4,000 200 400 600 800 1000 1200 • RESCALE • RECONCILE • CUMULATIVE • NON CUMLAT. • END PT. PROJ •CHANGE PTS • INITIALIZE • SEQUENCE • SPECIFY • INSERT • INCR. PT. • BLIND INCR • PROCEED Рис. 5.26. Сокращенное меню. (Фоли, Уоллэйс, ТИИЭР, 62, № 4, 1974 г.) Динамические меню легко реализуются на растровых дисплеях: меню заменяет прямоугольную часть показываемого изображения. В векторном дисплее меню может оказаться поверх изображения какого-либо объекта и затруднить тем самым его понимание. Име- ются противоречивые данные о сравнительных достоинствах и недостатках статических и динамических меню: статические по- зволяют использовать «мускульную память» для позиционирования пера или планшета и не приводят к резким изменениям изображе- ния, в то время как динамические меню обычно показываются в том месте, куда смотрит в данный момент оператор; таким образом, минимизируется время поиска. Ввод команд с клавиатуры. Имена команд могут “печататься” на клавиатуре. Упрощение, полезное как для плохо печатающих
248 Глава 5 пользователей, так и для минимизации вводимой информации,! состоит в изображении на экране команд с номерами: для ввода! команды достаточно набрать ее номер. Можно использовать сокра-1 щения: они должны легко запоминаться и по возможности быть! одинаковой длины. Простейшим правилом для формирования со- кращений является «фиксированная длина», приемлемы также «кратчайшие недвусмысленные» сокращения. 5.4. ИНТЕРАКТИВНЫЕ МЕТОДЫ Интерактивные методы представляют собой функции более высокого уровня, реализованные с помощью базовых устройств и методов моделирования, рассмотренных выше. Они широко ис- пользуются во многих графических прикладных программах. Уст- ройства, способы их моделирования и интерактивные методы — основные строительные блоки, из которых создается полный про- цесс диалога. 5.4.1. Методы формирования изображения Формирование картинки можно представить как процесс созда- ния (или модификации) модели объекта, изображение которого показывается на экране. Обычными операциями в этом процессе являются определение точек и отрезков, а также перемещение, вра- щение и масштабирование объектов. Манипулирование объектом осуществляется путем косвенного манипулирования его физиче- ским изображением на экране. Буксировка — метод динамического перемещения объекта с помощью локатора — была использована в гл. 2 для позиционирования символов обстановки комнаты. По этому методу производится частый опрос локатора (желательно на каждом цикле регенерации), и его позиция используется для пере- мещения показываемого объекта. В векторном дисплее перемещение выполняется относительно просто: путем манипуляций над дисп- лейной программой. В растровом дисплее эта задача не так проста, но ее можно решить способом, обсуждаемым в гл. 12. Буксировка изображения, хранящегося на запоминающей трубке, невозможна без использования режима рисования поверх изображения и буфера регенерации, имеющегося, например, в устройстве 4054 фирмы Tektronix. Буксировка дополняется динамическим масштабированием и вращением объектов для установления желаемых размеров и ори- ентации. В случае двумерного изображения этот метод требует не- прерывного опроса двух валюаторов и использования прочитан- ных с них значений для управления размером и углом. Конечно, для одновременного управления вертикальным и горизонтальным размерами или для управления размером и ориентацией трехмер-
Диалоговые устройства и интерактивные методы 249 Рис. 5.27. Изображение ориентации молекулы (картинка получена на системе GRIP [514]) с помощью гномона (в правом нижнем углу). ного объекта потребуется большее число валюаторов. Применение преобразований образа к примитивам, прошедшим отсечение, об- суждается в гл. 8, геометрические преобразования мировых коорди- нат объектов рассмотрены в гл. 7. Поскольку ориентацию некоторых сложных трехмерных объ- ектов трудно воспринять по двумерным проекциям, можно исполь- зовать специальный указатель — гномон, показывающий ориента- цию главных осей (рис. 5.27). Гномон облегчает вращение объектов в трехмерном пространстве. Для рисования отрезков часто используется метод резиновой нити. При нажатии кнопки с локатора читаются координаты на- чальной точки и затем постоянно рисуется отрезок, соединяющий начальную точку с текущей позицией экранного курсора, управля- емого локатором. При движении курсора движется и конечная точка отрезка. Повторное нажатие кнопки (или освобождение кноп- ки, нажатой при входе в режим «резиновой нити») «отсоединяет» локатор от конечной точки отрезка. Для реализации данного ме- тода особенно пригодны планшеты, карандаш которых имеет пере- ключатель, поскольку сигналы, соответствующие нажйтиям кно- пок, могут вводиться с карандаша. Рис. 5.28 иллюстрирует последо- вательность операций метода «резиновой нити». На отрезок, рисуемый с помощью метода «резиновой нити», могут быть наложены ограничения. На рис. 5.29 показана последо- вательность отрезков, нарисованная по тем же позициям курсора, что и на рис. 5.28, но с учетом ограничения, требующего чтобы отрезок был горизонтальным. Таким способом можно нарисовать
250 Глава 5 а Рис. 5.28. Рисование методом «резиновой нити». а— нажата кнопка; вход в режим «резиновой нити» в текущей позиции курсора; б — рисуется отрезок из начальной позиции в новую позицию курсора; в — отрезок после дополнительных перемещений курсора; г — нажата кнопка; выход из режима резиновой нити; д — курсор уже ие управляет отрезком. Рис. 5.29. Рисование горизонтального отрезка методом «резиновой нити» с учетом ограничения. а — нажата кнопка; вход в режим «резиновой нити» в текущей позиции курсора; б — рису- ется отрезок из начальной позиции в новую позицию курсора; в — нажата кнопка; выход из режима «резиновой нити»; г — курсор уже не управляет отрезком. вертикальный отрезок, отрезок какой-либо другой ориентации, часть окружности, эллипса или любой другой кривой: кривая инициализируется в некоторой позиции, а затем движениями кур-
Диалоговые устройства и интерактивные методы 251 сора определяется, какая часть кривой должна быть нарисована. Обычно координаты локатора являются входными данными для ограничивающей функции, которая определяет, какое изображение будет генерироваться. Другой формой ограничения, применяемой не только в методе «резиновой нити», является привязка к сетке. Все конечные точки отрезков и т. д. должны попадать на сетку точек (иногда изобража- емую отрезками или точками). Привязка к сетке помогает генери- ровать аккуратные рисунки. Чтобы осуществить привязку, при- кладной программе достаточно округлить координаты локатора до ближайшей точки сетки. Привязка к сетке обычно осуществля- ется в мировой системе координат. Таким образом, расстояние между линиями сетки, рисуемыми на экране, будет зависеть от отображения «окно — поле вывода». Хотя сетки обычно регулярны и покрывают весь экран, при создании рисунков и иллюстраций полезны также нерегулярные сетки, разные сетки в различных областях и повернутые сетки [151]. Рис. 5.30. Отрезок, окруженный гравитационным полем. При формировании рисунков часто желательно начать новый отрезок в конечной точке существующего отрезка или на нем. Позиционирование курсора с такой точностью может оказаться затруднительным, если не используется привязка к сетке. Эту трудность можно устранить, снабдив каждый существующий от- резок запрограммированным гравитационным полем, притягива- ющим курсор к отрезку, как только он попадает в его поле. На рис. 5.30 изображен отрезок с гравитационным полем, которое вокруг конечных точек имеет большие размеры и поэтому их сое- динение осуществляется проще. Как и при выборе объектов с помощью светового пара, насыщенное изображение затрудняет применение этого метода. Гравитационное поле можно реализо- вать с помощью способа, который аналогичен способу, применя- емому при моделировании селектора локатором. В этом случае параметр близости выбирается больше для конечных точек, чем для самих отрезков. Иногда требуется нарисовать от руки кривую или контур. Для
252 Глава 5 Рис. 5.31. Дискретное эскизирование. а — нажата кнопка для начала дискретного эскизирования; б — рисуется отрезок в режиме «резиновой нити»; в — нажата кнопка для фиксации отрезка; г — нажата кнопка для фикса- ции следующего отрезка и т. д. Рис. 5.32. Непрерывное эскизирование. а — нажата кнопка для начала непрерывного эскизирования; г — нажата кнопка для за- вершения. этого используют эскизирование — метод, при котором вдоль пути курсора рисуется цепочка отрезков, как при рисовании карандашом на бумаге. При дискретном эскизировании пользователь нажимает кнопку каждый раз, когда надо закончить один отрезок и начать другой (рис. 5.31). Обозначенные таким образом точки соединя- ются отрезками прямых. Если необходимо получить гладкую кри- вую, используется непрерывное эскизирование. При этом методе для завершения одного отрезка и начала другого не требуется явных указаний пользователя: вдоль траектории курсора протягивается последовательность коротких отрезков, аппроксимирующих глад- кую кривую (рис. 5.32). Там, где радиус кривизны мал, исполь- зуются более короткие отрезки. Буксировка представляет собой динамическое перемещение выбранного символа из одной позиции в другую под контролем локатора (рис. 5.33). Для начала буксировки обычно нажимается одна кнопка (иногда можно этим же нажатием кнопки осуществ- лять выбор символа), завершение буксировки и освобождение сим- вола от курсора происходит при нажатии другой кнопки либо при отжатии первой кнопки. Все эти методы формирования изображения обязательно ис- пользуют немедленную динамическую обратную связь Она может быть обеспечена только при гарантированной доступности услуг ЭВМ или при наличии у дисплейного процессора достаточной
Диалоговые устройства и интерактивные методы 253 вычислительной мощности, чтобы обеспечить такую обратную связь самостоятельно (гл. 10). И если в небольшой персональной ЭВМ осуществить динамическую обратную связь довольно просто, то в ЭВМ, работающей в режиме разделения времени, часто это от- нюдь не простая задача. В отсутствие динамической обратной связи Рис. 5.33. Буксировка символа, а — нажата кнопка для начала буксировки символа; б — несколько промежуточных позиций символа; в — нажата кнопка для завершения буксировки; г —» курсор уже не управляет по- зицией символа. используются более медленные и громоздкие методы диалога. На- пример, вместо режима «резиновой нити» используется следующая последовательность шагов: задаются конечные точки отрезка и нарисованный отрезок показывается на экране. Если отрезок не удовлетворяет требованиям пользователя, повторно задают одну или обе конечные точки. Повторное задание точек продолжается до тех пор, пока не будет получен удовлетворительный результат. Таким образом, динамическая обратная связь режима «резиновой нити» заменяется гораздо более медленной и менее удовлетвори- тельной статической обратной связью. Следовательно, пользователь либо затрачивает большее время на формирование рисунка, либо довольствуется худшими результатами. 5.4.2. Методы ввода команд В гл. 2 продемонстрирован ввод команд с использованием меню и программируемой функциональной клавиатуры. Во многих ре- альных приложениях имеются десятки и даже сотни различных ко- манд — гораздо больше, чем может содержать меню на экране или может быть приписано 16 или 32 кнопкам программируемой функ- циональной клавиатуры. С этим изобилием команд можно «спра- виться», если их сгруппировать в различные фазы или режимы. Каждая фаза содержит группу логически связанных команд или подфаз, которые являются группировками команд следующего уровня. Если для ввода команд применяется программируемая функцио- нальная клавиатура, то команды каждой фазы можно нанести на отдельный трафарет, накладываемый на клавиатуру. Для умень-
254 Глава 5 шения частоты смены трафаретов фазы составляют из логически] связанных команд. Если данное приложение имеет небольшое] ядро часто используемых команд, последние должны присутствовать] в каждой фазе и везде должны быть связаны с одними и теми же! кнопками. Естественно, на экране должно показываться имя теку-- щей фазы или подфазы, чтобы оператор мог легко вспомнить кон- текст, в котором будут выполняться команды. Способ перехода от одной фазы к другой должен быть простым и очевидным. ' Если для ввода команд используются меню, то «главное» меню или меню самого высокого уровня будет использоваться для выбора фазы. После выбора фазы показывается меню, содержащее все команды данной фазы. При необходимости можно использовать несколько уровней фаз и подфаз: в некоторых прикладных про- граммах имеются четыре или пять уровней в иерархии команд (дерево), определяемых фазами. Это означает, что до фактического задания команды необходимо последовательно сделать четыре или пять выборов меню. Иерархический выбор меню может ока- заться медленным и скучным для опытных пользователей, если только очередные меню не показываются практически мгновенно. Одной из возможных альтернатив является разрешение набирать на клавиатуре имя любой команды независимо от того, присутст- вует она или нет в текущем меню. Новые пользователи могут ру- ководствоваться меню, а опытные — использовать метод, ориенти- рованный на клавиатуру. Мощные персональные ЭВМ могут пока- зывать меню быстро и в этом случае ввод с клавиатуры менее при- влекателен для пользователя, если только его руки уже не нахо- дятся на ней. 5.4.3. Методы выбора объектов Во многих приложениях важной частью процесса графического диалога является выбор объекта, над которым необходимо выпол- нить некоторую операцию. Объекты, с которыми работают селек- торы, часто иерархически структурированы — пользователь может выбрать базовый объект (окно в доме), совокупность базовых объ- ектов (дом, состоящий из нескольких окон, стен и крыши) или со- вокупность совокупностей (несколько домов). Селектор не содержит средств для определения уровня иерар- хии, однако желания пользователя надо каким-то образом сооб- щить прикладной программе. Одним из способов является такое проектирование команд диалога, что уровень объекта, над которым необходимо выполнить какую-то операцию, выделяется из команд без явных действий оператора. Например, в фазе, предназначен- ной для группировки домов в кварталы, селектор выбирает весь дом, в то время как в фазе, предназначенной для конструирования отдельных домов, выбираются компоненты дома.
Диалоговые устройства и интерактивные методы 255 Если намерения пользователя нельзя выразить неявно, команд- ный язык должен предоставлять ему средства для явного указания своих целей. Команды ПЕРЕДВИНУТЬ ОКНО И ПЕРЕДВИ- НУТЬ ДОМ являются примерами таких средств. С другой стороны, если уровни иерархии, на которых работает пользователь, меня- ются относительно редко, удобнее иметь отдельную команду, оп- ределяющую уровень, на котором будут выполняться все остальные выборы объектов. Пользователь переопределяет уровень, когда это необходимо. Другой подход требуется в случае, когда число иерархиче- ских уровней объектов неизвестно проектировщику системы и потенциально велико (как, например, в чертежной системе, где могут быть определены шаблоны, содержащие другие шаблоны и базовые объекты, такие, как отрезки, точки и дуги). Пользова- телю необходимо предоставить две команды: ПОДНЯТЬСЯ ВВЕРХ ПО ИЕРАРХИИ и ВЕРНУТЬСЯ ВНИЗ. Когда пользователь вы- бирает селектором некоторый элемент, система повышает яркость объекта, содержащего выбранный элемент и относящегося к са- мому нижнему уровню иерархии. Если пользователю нужен именно этот объект, пользователь продолжает работу. Если нет, он вводит команду ПОДНЯТЬСЯ ВВЕРХ ПО ИЕРАРХИИ и подсвечи- вается объект следующего по иерархии уровня (например, дом), содержащий выбранный элемент. Если и этот объект не нужен пользователю, команда повторяется и подсвечивается еще более крупная часть изображения. Если пользователь по ошибке подни- мется слишком высоко, он может поправить положение с помощью команды ВЕРНУТЬСЯ ВНИЗ. В некоторых редакторах текстов существует иерархия: лите- ра — слово — предложение — параграф. При использовании ре- дактора текстов системы Star фирмы Xerox для выбора литеры необходимо позиционировать на ней экранный курсор и нажать кнопку «выбор» (одну из двух) на мыши. Для того чтобы выбрать слово, пользователь опять нажимает кнопку «выбор». Дальнейший подъем по иерархии достигается повторными нажатиями кнопки. УПРАЖНЕНИЯ 5.1. Решите уравнения (5.1) и найдите х, у и г. 5.2. Решите три уравнения из системы (5.2) и найдите х, у и г. 5.3. Решите три уравнения из системы (5.3) и найдите х, у и г. 5.4. Придумайте алгоритм, использующий все четыре уравнения системы (5.2) для вычисления «иаилучшего приближения» координат (х, у, г) источника света. Начните с решения всех четырех комбинаций из трех уравнений. В резуль- тате получите четыре различных решения для (х, у, г). Если все они «близки», то среднее значение будет хорошим приближением. Что делать, если решения раз- личаются существенно? 5.5. Можно ли световое перо использовать с дисплеем иа запоминающей труб- ке? Обоснуйте ваш ответ.
256 Глава 5 5.6. Как можно использовать световое перо в качестве селектора на растроЗ вом дисплее? | 5.7. Напишите алгоритм слежеиия за световым пером со спиральным поиском при потере следящего перекрестия или с прогнозом положения светового пери 1-го и 2-го порядков. 1 5.8. Реализуйте простой алгоритм распознавания литер на базе сравнений] характеристик. 5.9. Смоделируйте селектор (световое перо) локатором и проведите эксперт мент с методами корреляции координат. 5.10. Напишите процедуру для нахождения оболочки последовательности отрезков и точек с учетом допуска d вокруг примитивов. * 5.11. Покажите, что аппроксимация расстояния от точки до прямой мини-5 мальным горизонтальным или вертикальным расстоянием в наихудшем случае-5 отличается от истинного расстояния в }^2раза. 5.12. Опишите в общих чертах методы моделирования любого логического устройства устройством из любого другого логического класса. Повторите это упражнение в предположении, что доступно одно физическое устройство (клавиа- тура, световое перо, планшет). Создайте разумные протоколы общения пользова-: теля с системой, позволяющие ему указать, как используется в настоящий момент данное физическое устройство (как селектор, локатор и т. д.). (Это необходимо потому, что некоторые графяческие пакеты разрешают последовательно в любом порядке выполнять различные действия, входящие в полную спецификацию команд: если в спецификации команды участвует и селектор, и кнопки, можно на- чинать с любого из этих устройств.) 5.13. Напишите подпрограмму для непрерывного эскизирования, которая читает показания локатора и формирует короткий отрезок прямой для аппрокси- мации траектории локатора. Параметром подпрограммы является наимень- ший угол, который разрешается образовывать двум последовательным отрезкам. Наличие углового ограничения позволяет избежать рисования лишних отрезков. Подпрограмма является как бы фильтром: считываются координаты многих точек, но в общем случае только некоторые из них становятся конечнымя точками от- резков. 5.14. Ознакомьтесь с несколькими экспериментами, выполненными с помощью устройств диалога [140, 191, 73] и сделайте критические замечания. Проведите аналогичные эксперименты с помощью устройств, доступных вам.
Глава 6 Проектирование графического диалога В гл. 5 описаны основные блоки, из которых создается интер- фейс с интерактивной графической системой — диалоговые уст- ройства и интерактивные методы. Но как объединить эти блоки, чтобы получилось нечто удобное и полезное? Мы находимся сейчас в положении студентов-архитекторов, которые только что узнали о свойствах окон, дверей, стропил и прочих строительных конст- рукций и хотят понять, как собрать из этих компонент привлека- тельный и пригодный для жилья дом. Подобно архитектуре проектирование интерфейса с пользова- телем является, по крайней мере частично, искусством, а не нау- кой. Мы надеемся, что настанут времена, когда проектирование диалога с пользователем можно будет отнести скорее к науке, чем к искусству, однако сияющие вершины еще далеко. Восхож- дение началось, но впереди много сложных препятствий. А пока мы предлагаем некоторый подход к проектированию интерактивных систем и набор правил, указывающих, что следует делать, а чего не следует. При творческом применении этот подход и эти правила могут помочь проектировщику сфокусировать внимание на чело- веческих факторах (или, как говорят, на эргономике) интерактивной системы. Почему так важно понимание роли эргономики? Что будет, если проектировщик выберет методы организации диалога и устрой- ства, как ему заблагорассудится? Многочисленные исследования выявили существенное влияние, оказываемое методами и устрой- ствами, на скорость работы оператора и частоту совершаемых им ошибок. В классическом эксперименте [140] наблюдались отличия в скорости работы на 100% и в частоте ошибок — на 200% при использовании нескольких методов выбора слов, показываемых на экране. Время выполнения одной и той же работы на двух раз- ных интерактивных графических чертежных системах отличалось на 100%. Каждый из нас, кому приходилось работать с вычисли- тельными системами, знает, что эффективность работы пользова- теля существенно зависит от того, как была учтена эргономика при проектировании вычислительной системы. Коммерческий ус- пех новых интерактивных графических систем с аналогичными функциональными возможностями во все большей степени будет зависеть от простоты их использования. Системы, использование
258 Глава 6 которых не является вынужденным, должны строиться так, чтобм не оттолкнуть пользователя сразу же после первой попытки. ПроЯ стота использования, но не простота реализации, становится важ-1 нейшим параметром при проектировании интерактивных системл Эргономика не входит в традиционный круг вопросов, обсуж-1 даемых при формальном изучении вычислительных систем. В прош«| лом основное внимание уделялось оптимизации использования! двух дефицитных ресурсов — машинного времени и памяти. Эф-1 фективность программы была высшей целью. И вот теперь, когда! уменьшается стоимость аппаратуры и увеличивается графическая | оснащенность персональных ЭВМ (гл. 1), можно оптимизировать [ эффективность работы пользователя, а не ЭВМ. Многие из обсуж- < даемых в данной главе идей требуют для реализации дополнитель- ных машинных ресурсов — времени и памяти,— однако потенци- альный выигрыш в эффективности работы пользователя и его удов- ; летворенности интерфейсом с системой окупает полностью неболь- шие дополнительные расходы на эти ресурсы. Проектирование интерфейсов пользователей с ЭВМ не является областью деятельности только специалистов по информатике. Для успешного проекта необходимо знать элементы теории восприятия (как мы видим), теории познания (как мы овладеваем знаниями) и эргономики (как мы взаимодействуем с оборудованием). По- этому крупные проекты следует разрабатывать коллективами, вклю- чающими соответствующих специалистов, а ознакомление со всеми этими науками желательно даже при проектировании небольших систем. В некоторых докладах на заседании рабочей группы по методологии организации диалога [204] обсуждаются междисцип- линарные аспекты проектирования интерфейса с пользователем. Идеалом является система, возможности которой понятны и удобны ее пользователям (а не только разработчикам). Методология про- ектирования таких систем все еще развита слабо. В данной главе описывается один общий подход, состоящий в применении в про- цессе проектирования понятий и навыков из практики человече- ского общения и теории языка. Этот подход впервые был предложен Уоллэйсом и кратко описан в работе [161]. 6.1. ЯЗЫКОВАЯ АНАЛОГИЯ Термины диалог пользователя с ЭВМ. или диалог человека с машиной являются обычными при обсуждении интерактивных систем, поскольку каждый, кто проектирует интерактивную гра- фическую систему, в то же время проектирует и графический диа- < лог пользователя с ЭВМ. Существует полезная аналогия между < диалогом пользователя с ЭВМ и человеческим общением. Конечно, ‘ язык машинной графики почти не содержит слов, которые произ- ; носят или пишут; «словами» этого языка являются картинки и [
Проектирование графического диалога 259 действия, такие, как нажатия кнопок, выбор элементов селектором, позиционирование локатора. Тем не менее многие атрибуты обще- ния человека с человеком и языка этого общения следует сохранить в графическом диалоге пользователя с ЭВМ. Назовем некоторые из этих атрибутов. Язык диалога должен быть языком пользователя, без излишней ориентации на ЭВМ; он должен быть естественным для пользователя. Для того чтобы лучше понять аналогию, вспомним свои первые попытки изучения иностранного языка. Первые предложения конструировались мед- ленно, поскольку приходилось бороться со словарем и грамматикой. Позднее, когда благодаря практике грамматика стала более при- вычной и естественной, усилия сконцентрировались на пополне- нии словарного запаса. Новый пользователь интерактивной си- стемы должен тоже пройти через подобный процесс обучения. Этот процесс может оказаться даже более трудным, чем изучение ино- странного языка, так как пользователь должен изучать не только новые грамматику и лексику, но и новые понятия. Таким образом, разработчик системы должен обходиться простыми правилами, про- стым словарем и использовать понятия, которые пользователю уже знакомы или которые ему легко изучить. Например, для био- химика, изучающего структуры молекул (геометрические структу- ры), привычны такие понятия, как атом, связь, двугранный угол и осадок, но он не знает и не должен знать таких понятий, как связанный список, итерация и сегменты. Первые понятия хорошо знакомы пользователю, в то время как вторые ему непонятны и чужды и овладевать ими у него нет ни времени, ни желания. Язык диалога пользователя с ЭВМ должен быть эффективным и полным и обладать естественной грамматикой. На эффективном языке пользователь может давать ЭВМ команды оперативно и кратко. Полный язык позволяет выразить любую идею, относящую- ся к области исследования. Естественная грамматика имеет мини- мальное число простых и легких для изучения правил. Это мини- мизирует усилия пользователя на освоение системы и позволяет ему сконцентрировать внимание на решаемой проблеме. Основной принцип состоит в следующем: надо избегать сложных грамматиче- ских правил, которые могут прервать или нарушить мыслительные процессы пользователя. Полный язык может быть очень кратким. Например, в языке для логического проектирования достаточно представить только один конструктивный блок: либо НЕ-И, либо HE-ИЛИ, с помощью которого можно создать любую логическую схему. С другой сто- роны, подобный язык было бы очень трудно использовать и потому он неэффективен. В язык лучше включить средство для создания более сложных команд из небольшого числа основных. Расширя- емость — метод превращения полного языка в эффективный путем предоставления средств для определения новых выражений как комбинаций существующих выражений. В операционных систе*
260 Глава 6 мах расширяемость обычно реализуется путем сценариев, катало- гизированных процедур или командных файлов, а в языках програм- мирования с помощью макросредств; в графических же системах подобные средства встречаются реже. Рассмотрим теперь разговор человека с человеком. Один че- ловек задает вопрос или что-то утверждает, а другой отвечает, как правило, довольно быстро. Если ответ задерживается, гово- рящий обычно видит по крайней мере какие-то признаки внимания к его высказыванию, такие, как мимика или жестикуляция. И то и другое является формой обратной связи — очень важной ком- понентой диалога. Иногда говорящий делает ошибку, говорит «О, я хотел ска- зать...», и слушатель немедленно корректирует воспринятую ин- формацию. Возможность исправлять ошибки важна также и в диалоге пользователя с ЭВМ. Аналогично в разговоре рассказчик может попросить слушателя помочь ему выразить свою мысль или объяснить различные допустимые варианты следующих действий. Эти же возможности должны присутствовать в диалоге пользова- теля с ЭВМ. В диалоге пользователя с ЭВМ до настоящего времени трудно было реализовать такие характеристики диалога человека с чело- веком» как использование предыдущего контекста для разрешения неоднозначностей, понимания косвенных ссылок и выполнения других подобных умозаключений. В настоящее время эти проблемы начинают решаться методами искусственного интеллекта [215]. 6.2. ЯЗЫКОВАЯ МОДЕЛЬ После общего обзора проблем, возникающих при конструиро- вании интерфейса пользователя с ЭВМ, определим теперь более конкретно входящие в него компоненты. В этом интерфейсе на самом деле существуют два языка. На одном языке пользователь формулирует команды и данные для ЭВМ, на другом — ЭВМ от- вечает пользователю. Первый язык выражается в действиях с различными диалоговыми устройствами, второй — графически с помощью отрезков, точек, цепочек литер, сплошных областей и оттенков, из которых составляются образы и сообщения. Оба языка можно разбить на четыре основные части: концепции, семантика, синтаксис и лексика. Эти части могут анализироваться и проектироваться последовательно, начиная с концептуального проектирования. При концептуальном проектировании определяются ключевые прикладные понятия, которыми должен в совершенстве владеть пользователь; поэтому они называются также пользовательской моделью приложения. В процессе концептуального проектирования 'обычно определяются объекты или'классы объектов, взаимосвязи
Проектирование графического диалога 26» между объектами (классами объектов) и операции над объектами (классами объектов). В простом текстовом редакторе объектами являются строки и файлы; связь между объектами состоит в том, что файлы являются последовательностями строк; над объектами- строками можно выполнять операции включения, удаления, пере- мещения и копирования, а над объектами-файлами — операции создания, удаления, включения, переименования и копирования. Концептуальная модель прикладной программы из гл. 2 имеет один объект (комната) и один класс объектов (различные предметы мебели). Связь между объектами состоит в том, что комната содер- жит мебель, а множество операций с мебелью состоит из операций переноса, поворота и т. д. При семантическом проектировании подробно определяются функциональные характеристики языка: необходимая информация для каждой операции над объектом, возможные семантические ошибки и способы их устранения, результаты каждой операции. Отметим что на стадии семантического проектирования опреде- ляется смысл, а не форма или последовательность (это оставляется на последующие этапы проектирования). При синтаксическом проектировании определяется последова- тельность, в которой должны появляться элементарные единицы языка. Для входного языка эта последовательность является грамматикой: набор правил, руководствуясь которыми можно формировать последовательности знаков (слов) языка, являющиеся правильными (но не обязательно осмысленными) предложениями. Во входном языке обычно имеются следующие типы знаков: команды, значения, имена, координаты и произвольный текст. Как в ес- тественных, так и в искусственных языках знаки являются мини- мальными осмысленными единицами, и дальнейшая их декомпози- ция невозможна без потери смысла. В выходном языке понятие последовательности расширено: в него включены пространственные и временные характеристики. Поэтому синтаксис выходного языка содержит правила для по- строения двумерных и трехмерных изображений и описания любых изменений формы во времени. Знаки выходной последовательности так же, как и входной, представляют минимальные осмысленные единицы и не могут расчленяться. Эти знаки часто выражаются графически как символы и рисунки, а не как последовательности литер, и не имеют смысла при расчленении на отдельные отрез- ки или литеры. Например, символ транзистора имеет смысл для схемотехника, а отдельные отрезки, его образующие, не имеют. При лексическом проектировании определяются способы форми- рования знаков входного и выходного языков из имеющихся аппа- ратных примитивов или лексем. Лексемы входного языка представ- ляют собой устройства ввода, а лексемы выходного языка — при- митивы (такие, как отрезки и литеры) и их атрибуты (такие, как цвет и яркость), предоставляемые графическим пакетом. Таким
262 Глава 6 образом, для входного языка лексическое проектирование пред- ставляет собой разработку для каждого знака соответствующего1 интерактивного метода (примеры таких методов приводятся в гл. 5). Аналогично для выходного языка лексическое проектирование сводится к комбинированию примитивов вывода и их атрибутов для представления имеющих смысл выходных единиц — знаков. Таким образом, лексическое проектирование есть привязка аппа- ратных возможностей к аппаратно-независимым знакам входного и выходного языков. В методе проектирования «сверху вниз» привязка к физическим представлениям или реализациям отклады- вается на последний этап проектирования. В программе размещения мебели в комнате семантикой вход- ного языка являются операции: создать, удалить и переместить. Синтаксис предложений префиксный; начинается предложение с приказа — команды, за ней следует 0, один или два операнда, всегда в определенном порядке. В некоторых случаях необходимо явное завершающее действие («точка»); в других случаях завер- шающее действие осуществляется неявно. Например, операция ДОБАВИТЬ СИМВОЛ (ADD SYMBOL) представляется следую- щей последовательностью действий: 1. Ввести команду ДОБАВИТЬ СИМВОЛ. 2. Выбрать символ добавляемого предмета. 3. Переместить символ в новую позицию. 4. Завершить спецификацию операции вводом команды СДЕ- ЛАНО. Лексические компоненты входного языка для программы разме- щения мебели определяются привязкой к планшету (а не к какому- либо другому физическому устройству) как к средству для выпол- нения функций выбора команды из меню, выбора удаляемого шаб- лона и определения позиции. Если бы язык ориентировался на использование клавиатуры, то одной из лексических компонент языка была бы цепочка литер МЕСТО, определенная как знак (слово) команды, имеющей значение «ПОМЕСТИТЬ СИМВОЛ». В случае программируемой функциональной клавиатуры соот- ветствующей лексической компонентой была бы конкретная кнопка, используемая как знак «ПОМЕСТИТЬ СИМВОЛ». Семантическим содержанием выходного языка данного прило- жения является текущее расположение мебели в комнате, а также подсказка и управляющая информация (такая, как меню). Син- таксис выходного языка определяет размещение информации на экране, включая разбиение его на различные области и задание точного местоположения меню, подсказок и сообщений об ошибках. Лексический уровень выходного языка содержит шрифт текста, толщину и цвет линий, цвет сплошных областей и способ комбини- рования примитивов вывода для создания элементарных символов выходного языка, таких, например, кдк символы предметов мебели, которыми манипулирует программа.
Проектирование графического диалога 263 Другим вариантом синтаксиса выходного языка могло бы быть табличное представление позиции, ориентации и типа каждого предмета обстановки в комнате. Тогда лексическими компонентами выходного языка были бы размер литер, их яркость и расстояние между ними в таблице. Кроме входного и выходного языков имеется протокол диалога, определяющий, как протекает во времени диалог пользователя с ЭВМ. Например, команды входного языка могут выполняться сразу (с предъявлением результатов пользователю), а могут груп- пироваться в пакет и затем выполняться. Некоторые системы по- зволяют «печатать с опережением» — вводить новую команду до завершения выполнения предыдущих, но какое-либо явное их пакетирование отсутствует. Времена отклика также являются частью протокола, как и реакция ЭВМ на ввод пользователем лексических, синтаксических и семантических конструкций. В чем же состоит проектирование интерфейса «пользователь — ЭВМ» для интерактивной графической системы? Оно заключается в определении концептуальной модели, полном определении се- мантических, синтаксических и лексических компонент входного и выходного языков и протокола диалога. Более подробно процесс проектирования описан в разд. 6.4. Прежде чем приступить к описанию, нам необходимо сформулировать и обосновать некото- рые принципы проектирования, влияющие на качество интерфейса пользователя с ЭВМ. 6.3. ПРИНЦИПЫ ПРОЕКТИРОВАНИЯ В этом разделе описаны принципы проектирования, с помощью которых можно создать интерфейс с хорошими эргономическими характеристиками. Хотя применение этих принципов само по себе не гарантирует успеха, следование им (сознательное или бессо- знательное) обычно считается необходимым для удачного проек- та. Здесь эти принципы описываются лишь в общих чертах; более подробное обсуждение приведено в работах [91, 138, 161, 165, 212, 302, 422]. 6.3.1. Обеспечение обратной связи Представьте себе разговор с человеком, который, слушая, не улыбается, не кивает и отвечает только тогда, когда его к этому вынуждают. Такой «диалог», несомненно, неприятен, поскольку говорящий не имеет почти никакого или совсем никакого подтверж- дения, что собеседник действительно его слушает. Обратная связь (реакция) является существенной компонентой диалога с ЭВМ так же, как и диалога человека с человеком. Различие состоит в том, что в обычном человеческом разговоре имеется много источ-
264 Глава 6 ников обратной связи (жесты, позы, мимика, глаза), которые про- являются неосознанно у каждого участника разговора. Графиче- ский же терминал ЭВМ не представляет почти никакой автомати- ческой обратной связи (исключение составляет индикатор «вклю- чено»), так что пользователь будет иметь только ту обратную связь, которая заранее спланирована и запрограммирована. В интерактивных системах возможны три уровня обратной связи, соответствующие уровням языка: лексическая, синтаксиче- ская и семантическая. Проектировщик должен рассмотреть каждый уровень и в явном виде решить, нужна ли на этом уровне обратная связь, и если да, то какую форму она должна принимать. Самым нижним уровнем обратной связи является лексический уровень. Каждое лексическое действие на входном языке может сопровож- даться лексическим откликом на выходном языке: например, ли- теры, набираемые пользователем на клавиатуре, могут немедленно отражаться на экране, а изменение пользователем позиции лока- тора может сопровождаться перемещением экранного курсора. Обратная связь на синтаксическом уровне возникает при вводе в систему каждой единицы (слова) входного языка (команды, по- зиции, выбранного объекта и т. д.). Команда, выбранная из меню, или объект, выбранный селектором для перемещения, могут выде- ляться повышением их яркости на экране, так что пользователь знает, что его действия восприняты (т. е. «слова» поняты). Ана- логичными формами обратной связи на синтаксическом уровне являются: приглашение на ввод следующей синтаксической еди- ницы, подсвечивание кнопки программируемой функциональной клавиатуры, нажатой пользователем, и повторение с помощью синтезатора единиц входного языка, введенных голосом. В про- грамме размещения мебели в комнате, описанной в гл. 2, исполь- зовано несколько таких механизмов обратной связи. Другой формой обратной связи на синтаксическом уровне яв- ляется реакция системы не на каждый синтаксический знак, а на полное синтаксическое предложение (предложение на командном языке), которое система нашла синтаксически правильным. Такая обратная связь подтверждает прием правильного предложения и необходима лишь в случаях, когда выполнение семантики предло- жения (действий, заданных командой) занимает более одной или двух секунд. Программа размещения мебели не использует этой формы обратной связи. Наиболее полезной и приятной для пользователя формой се- мантической обратной связи является извещение его о завершении затребованной операции. Обычно это выполняется путем предъяв- ления пользователю нового или модифицированного изображения, в котором явно обозначены результаты операции. Программа раз- мещения мебели использует только этот тип семантической обратной связи, поскольку каждая команда .выполняется довольно быстро. В некоторых случаях, например, когда пользователь просит сохра-
Проектирование графического диалога 265 ЗАДАЙ УРОВЕНЬ... ВВОД нарисуй месячную гистограмму. ГЕНЕРИРУЕТСЯ МЕСЯЧНАЯ ГИСТОГРАММА. ВВОД: название гистограммы «ОБЪЕМЫ ПРОДАЖ ПО РАЙОНАМ». ТЕКСТ НАЗВАНИЯ: «ОБЪЕМЫ ПРОДАЖ ПО РАЙОНАМ». ВВОД: подпись по оси х «МЕСЯЦЫ 1978». ТЕКСТ ПОДПИСИ ПО ОСИ X «МЕСЯЦЫ 1978». ВВОД: подпись по оси у «МИЛЛИОНЫ». ТЕКСТ ПОДПИСИ ПО ОСИ Y «МИЛЛИОНЫ». ВВОД: входные данные. «ЗАПАД» 349.7 463.8 577.9 668.3 «ВОСТОК» 364.9 468.7 562 658.7 конец данных. ВВОД выполняй Рис. 6.1. Диалог с ЭВМ с немедленной обратной связью после каждой команды. Сообщения, выдаваемые ЭВМ, набраны прописными буквами; команды, вводимые пользователем,— строчными; слова и фразы, набранные прописными буквами, но заключенные в кавычки, также вводятся пользователем. Пакет, с которым ведется диалог, представляет собой TELL—А — GRAF — программное изделие фирмы Intergrated Software Systems Corporation (ISSCO) (Сан-Диего, Калифорния). нить рисунок во внешней памяти для последующего использования, такая явная графическая обратная связь неуместна и вместо нее используются подсказки или сообщения о завершении операции (либо в текстовом виде, либо в символическом). Другим типом семантической обратной связи, необходимым только в тех случаях, когда выполнение запроса требует более нескольких секунд, является извещение пользователя о том, что ЭВМ работает над его запросом. (Известны случаи, когда отсут- ствие такой обратной связи приводило к тому, что пользователи физически «расправлялись» с графическим терминалом и даже с самим создателем прикладной системы!) Такая обратная связь может принимать много форм; особенно привлекателен диск с вра- щающейся стрелкой, которая совершает полный оборот за время выполнения запрошенной операции. По темпу продвижения стрелки пользователь сможет быстро оценить, успеет ли он выпить чашечку кофе. Еще одной формой семантической обратной связи, также предъ- являемой до отработки семантики, является изображение полного определения запроса, которое система сформулировала по дей- ствиям пользователя. Такая обратная связь является неполноцен- ной заменой наблюдения действительных результатов выполнения запроса и должна использоваться только в случаях, когда немед- ленное выполнение семантики займет слишком много времени или
266 Глава 6 Рис. 6.2. Гистограмма — результат диалога, приведенного на рис. 6.1. ЗАДАЙ УРОВЕНЬ... ВВОД: продолжай. ВВОД: измени название на «ОБЪЕМЫ ПРОДАЖ» ПРОДОЛЖИ ИЛИ ВВЕДИ ТОЧКУ: «ВОСТОЧНЫХ И ЗАПАДНЫХ РАЙОНОВ». ТЕКСТ НАЗВАНИЯ: «ОБЪЕМЫ ПРОДАЖ» «ВОСТОЧНЫЕ И ЗАПАДНЫЕ РАЙОНЫ». ВВОД: сделай рамку вокруг рисунка, нарисуй сетку ио оси у, РАЗРЕШЕНА РАМКА. ВВОД: РАЗРЕШЕНА СЕТКА ПО ОСИ Y. ВВОД: не нужна разметка оси х, НЕ БУДЕТ РАЗМЕТКИ ОСИ X. ВВОД: выполняй. Рис. 6.3. Диалог, который модифицирует гистограмму, приведенную на рис. 6.2. других ресурсов или когда необходимо сгруппировать несколько команд, прежде чем начать выполнять их семантику. В этих слу- чаях обратная связь особенно полезна для новых пользователей, если в интерпретации их действий системой возможна неоднознач- ность или зависимость от контекста. На рис. 6.1 приведен пример: командный язык содержит ключевые слова, такие, как НАЗВАНИЕ, К, Y, ОСЬ и ГИСТОГРАММА, которые могут вводиться в свобод-
Проектирование графического диалога 267 ном порядке. На рис. 6.2 показана гистограмма — результаты диалога, приведенного на рис. 6.1. Если обратная связь показы- вает, что система неправильно поняла введенную команду, ее можно изменить прежде, чем требуемая гистограмма начнет рисоваться. На рис. 6.3 приведен диалог, в котором запрашивается изменение в исходной гистограмме, а на рис. 6.4 — новая гистограмма. В диа- логе необходимо модифицировать только те части спецификации гистограммы, которые относятся к ее изменяемым параметрам. Иногда целесообразной формой семантической обратной связи оказывается постепенный вывод на экран частичных результатов. Если эти результаты появляются в некотором разумном порядке, получаемая «мультипликация» помогает пользователю лучше по- нять конечное их представление, чем мгновенное предъявление после некоторой задержки окончательного представления. Важно также, какое место на экране отводится для обратной связи. Считается естественным выделять для этой цели (и для выдачи сообщений об ошибках) некоторую фиксированную область. Однако такой подход может нарушить визуальную непрерывность, поскольку взгляд пользователя должен постоянно переходить от рабочей области к области системных сообщений и наоборот. Зву- ковая обратная связь устраняет этот недостаток. С той же целью для реализации обратной связи следует выбирать то место на эк- ране, куда смотрит пользователь. Это место легко предсказать в системах, в которых главным инструментом диалога является планшет и курсор: взгляд пользователя будет, как правило, на- правлен в точку рядом с курсором, особенно если инициируются некоторые действия. Данный принцип используется, например, в экранном редакторе Снирингера (OCCAM), размещающем выделен- ные цветом сообщения об ошибках в точке экрана, соответствую- щей текущей позиции редактирования [434]. В системе размещения материала на газетной странице Бэкера и Тилбрука (NEWSWHO- LE) для обратной связи используется форма курсора: символ большого пальца, направленного вниз, означает, что пользователь допустил ошибку, а маленький символ Будды «призывает пользо- вателя к терпению», когда система выполняет его запрос [121, 465]. 6.3.2. Помощь пользователю при изучении системы Многие интерактивные графические системы должны созда- ваться в расчете на широкий круг пользователей: на начинающих, неопытных пользователей и на пользователей, которые работают с системой сотни или тысячи часов. Опытность пользователя яв- ляется, конечно, непрерывной характеристикой, однако полезно разделить пользователей на три категории: новички (только на- чавшие изучать основные понятия и принципы работы системы), пользователи средней опытности (научившиеся получать хотя бы какие-нибудь результаты и продолжающие осваивать систему и
268 Глава 6 ОБЪЕМЫ продаж (восточные и ЗАПАДНЫе районы) МЕСЯЦЫ 1978 Рис. 6.4. Модифицированная гистограмма. изучать дополнительные ее возможности) и опытные пользователи, свободно работающие с системой и знающие все ее возможности. (Некоторые системы имеют так много возможностей, что пользо- ватели знакомы только с некоторыми часто используемыми их подмножествами.) Как спроектировать интерактивную систему, удовлетворяющую потребностям такого широкого круга пользователей? Новичку сначала требуются направляемые ЭВМ «экскурсии» по возможно- стям системы (с пояснительными примерами) и уроки основных команд; здесь возможно применение методов машинного обучения. В самой простой форме такого диалога пользователю просто предъ- является последовательность вопросов, на которые нужно отве- тить «да» или «нет» или выбрать одну из нескольких альтернатив. Для реализации такой системы в нашем распоряжении имеются два основных инструмента: подсказка и запрос «помоги» (help). В отличие от обратной связи, подтверждающей, что система при- няла конкретный запрос пользователя, подсказка говорит поль- зователю, какие действия он может предпринять в данный момент. Чем опытнее пользователь, тем менее он нуждается в подсказках, особенно если они делаются навязчивым образом, замедляющим диалог. Многие системы имеют несколько уровней подсказок; кон- кретный уровень выбирает пользователь. Неопытные могут вы- брать режим, при котором их «ведуФ за руку», в то время как опыт- ные могут обходиться без отвлекающих подсказок.
Проектирование графического диалога 269 Подсказки могут быть представлены в различных формах. Наи- более прямой способ состоит в показе надписи, объясняющей, что нужно делать дальше (например, ЗАДАЙ МЕСТО). Синтезатор речи дает пользователю устные инструкции. Имеются также более «тонкие» формы подсказок, менее навязчивые для пользователя. На программируемой функциональной клавиатуре можно подсве- чивать те кнопки, которые разрешается нажимать в данный момент. В тех случаях, когда необходимо задать позицию, можно высве- чивать на экране заметное следящее перекрестие или курсор; мигающим курсором можно обозначить необходимость ввести тек- стовую строку, а изображением линейной или круговой шкалы — необходимость ввести значение. Такие ненавязчивые подсказки удобны для пользователей со средним и большим опытом, для но- вичков они могут оказаться слишком сложными. Диалог пользователя и ЭВМ, в котором используются меню и другие подсказки, называется диалогом, инициируемым ЭВМ, поскольку в них ЭВМ направляет пользователя и помогает ему правильно сформулировать запрос. Такая разновидность диалогов часто применяется для общения ЭВМ с пользователями-новичками. Как уже говорилось в разд. 5.3.5, меню удобны и для опытных пользователей, если время их формирования и предъявления пользователю очень мало. Диалоги, в которых управление осуще- ствляется пользователем и пользователь выбирает одну из многих альтернатив, обычно не имея перед собой явного представления набора этих альтернатив, называются диалогами, инициируемыми пользователем', они пригодны для опытных пользователей. К со- жалению, в большинстве современных систем разделения времени используется этот тип диалога: его легко реализовать с помощью алфавитно-цифровой клавиатуры, в то время как в наиболее эф- фективных формах работы с меню требуются дисплеи с высоким разрешением и устройства-селекторы. Запрос о помощи позволяет пользователю получать дополни- тельную информацию о различных командах и способах их исполь- зования. Он обычно реализуется с помощью специальной команды ПОМОГИ; пользователь должен иметь возможность воспользо- ваться этой командой в любой момент диалога с ЭВМ и всегда одним и тем же способом. При возврате из режима команды ПОМОГИ система должна оказаться в точности в том же состоянии, в каком она была до выполнения этой команды. Если команда ПОМОГИ вызвана в то время, когда система ждала ввода команды, при воз- врате должен быть представлен список команд, доступных в дан- ный момент (при работе с меню или программируемыми функцио- нальными клавиатурами этот список необязателен). При вводе команды ПОМОГИ, а затем имени какой-либо команды, появ- ляется дополнительная информация об этой команде. Если выбрана какая-либо команда, а затем вызвана команда ПОМОГИ, система должна подсказать пользователю, как вводить первый параметр
270 Глава 6 Использование системы (тип пользователя) Требования к диалогу пользователя с ЭВМ Случайное, нерегулярное Регулярное; достаточно частое Есть стимул — пользователь хо- чет использовать систему Стимул отсутствует — у пользо- вателя нет желания работать с системой Временные ограничения или какие- либо другие обстоятельства застав- ляют пользователя выполнить ра- боту как можно быстрее Нужны приглашения и меню Сжатый командный язык или средства быстрого выбора из меню; выполнение задачи за небольшое число шагов Пользователь готов тратить вре- мя на обучение работе с систе- мой, даже если это трудно Любой изъян в проекте дает пользователю предлог для кри- тических выступлений или пре- кращения пользования систе- мой Особенно важна простота, поз- воляющая работать с системой на интуитивном или рефлектор- ном уровне Рис. 6.5. Категории пользователей. команды. При повторном вызове команды ПОМОГИ могла бы появиться более подробная информация о том же объекте и, воз- можно, дать пользователю доступ в оперативном режиме к более детальной документации по системе. Например, вся документация по операционной системе UNIX хранится в самой системе; поль- зователь может получить к ней доступ с помощью «ручной» команды: man (имя команды). Режим помощи полезен даже в системах, генерирующих под- сказки и использующих для диалога с пользователем аппарат меню, поскольку дает пользователю возможность получить более под- робную информацию, чем та, что содержится в короткой подсказке. Даже опытные пользователи могут иногда забывать некоторые подробности, особенно в больших и сложных приложениях; в этих случаях команда ПОМОГИ является быстрым способом получения требуемой информации. В таблице на рис. 6.5 приведены рассмотренные здесь и неко- торые другие соображения относительно проектирования диалога для различных категорий пользователей (более детальное разбие- ние пользователей на категории можно найти в работе [ЗОН).
Проектирование графического диалога 271 6.3.3. Возможность возвращения в предыдущее состояние и исправления ошибки Все мы совершаем ошибки во время работы с ЭВМ и нуждаемся в простых и удобных средствах для их исправления, чтобы не наделать еще более серьезных ошибок. Большинство (если не все) интерактивных систем имеют клавишу возврата на одну позицию для удаления последней введенной литеры. Представьте себе, как тяжело было бы работать с ЭВМ без этого простого механизма исправления ошибок! Многие системы позволяют также удалить всю текущую входную строку; часто это служит способом прекра- щения выполнения текущей команды до ее завершения. Система \ обычно возвращается в состояние, в котором она была до ввода удаленной команды, если только не были произведены изменения в файлах. Менее обычной является возможность полностью ликвиди- ровать результаты выполнения последней команды, даже если про- изошли изменения в файлах. В некоторых системах сохраняется несколько версий файлов, что частично упрощает проблему. В са- мых совершенных системах сохраняются все команды пользова- теля, введенные им за сеанс работы; если необходимо, можно вер- нуться назад в точку, где была совершена ошибка. Сказанное выше иллюстрирует возможности исправления оши- бок на трех уровнях: лексическом, синтаксическом и семантиче- ском. Создатель системы должен рассмотреть возможность восста- новления каждого типа, учитывая при этом, что «стоимость» се- мантического восстановления может быть довольно высока: при- кладная программа должна непрерывно сохранять либо состояние системы, либо изменения этого состояния и должен быть реализован алгоритм возврата к предыдущему состоянию. Отсутствие средств для исправления ошибок угнетает пользователя и снижает его производительность; их наличие, наоборот, поощряет пользова- теля к исследованию неизученных возможностей системы «без бо- язни ошибиться», поскольку ошибку легко исправить. Многие интерактивные методы, обсуждавшиеся в гл. 5, имеют средства возврата к предыдущему состоянию (отката): например, конечную позицию буксируемого по экрану объекта легко изме- нить, поэтому можно опробовать много позиций. Это пример син- таксического отката: предоставляется возможность легко изменять значение одной синтаксической единицы (позиции в случае букси- ровки) в команде. Семантическим откатом в данном случае был бы возврат системой объекта в исходную позицию — ликвидация ре- зультатов выполнения команды буксировки. Другая форма отката применяется при работе с селектором. Если используется световое перо, элемент, излучение которого чувствует в данный момент световое перо, обычно выделяется по- вышенной яркостью. Пользователь перемещает перо по экрану до тех пор, пока не начнет усиленно светиться тот элемент, который
VI Глава 6 ему нужен, и нажимает кнопку. Последовательность, образуемая ’ позиционированием светового пера и нажатием кнопки, представ- • ляет собой синтаксическую единицу — выбранный элемент. После • того как некоторый элемент выбран таким образом, замена его на другой элемент потребовала бы дополнительных средств отката (на этот раз на семантическом уровне). Возможность отмены результатов выполнения команды в неко- торых системах обеспечивается путем запроса у пользователя яв- ного подтверждения правильности команды — пользователь может «согласиться» с ее результатами или потребовать их ликвидации. Однако при таком подходе увеличивается число действий пользо- вателя, необходимых для выполнения определенной работы. Хо- рошей альтернативой является запрос явных действий только для отмены результатов команды: пользователь неявно подтверждает ее правильность, когда вводит следующую команду. Поскольку отменить можно только команду целиком, средства отмены легко осваиваются пользователем, если язык диалога распадается на предложения, обозначающие начало и конец команд. Предоставление средств для отмены команд требует дополни- тельных затрат на программирование, особенно для команд, осу- ществляющих крупные изменения в структурах данных. Альтер- нативой отмене является запрос у пользователя подтверждения на выполнение наиболее сложных для отмены команд. Удаление файла является, по-видимому, наилучшим примером команд такого типа. Когда подтверждение запроса на удаление (во многих интерактив- ных системах такое подтверждение обязательно) отсутствует, воз- никают ситуации, подобные той, о которой рассказывается в ра- боте [466] при описании системы редактирования газетного мате- риала: Одна из этих клавиш (на клавиатуре ЭЛТ) — кнопка «уничтожить» — даже стирает материал с экрана и уничтожает его в памяти машины... Когда заметки начали исчезать в электронной «преисподней», администрация газеты Detroit News была вынуждена модифицировать терминалы таким образом, чтобы кнопку «уничтожить» нужно было нажимать дважды для того, чтобы заметка действи- тельно была уничтожена. В одной популярной микропроцессорной системе клавиша RESET была расположена как раз над клавишей RETURN. Лишь в недавней модификации изделия этот недочет был устранен, а рань- ше случайное нажатие клавиши RESET очищало память микро- ЭВМ. В обоих примерах исправление ошибки требует значительных усилий. Таким образом, при отсутствии возможности отмены команд запрос подтверждения является наилучшим средством предотвраще- ния ошибок.
Проектирование графического диалога 27$ 6.3.4. Управление временем отклика Время отклика программы является одним из основных крите- риев ее применимости, хотя в системах разделения времени создатель прикладной программы часто не может прямо управлять этим па- раметром. Рассмотрим, однако, случай, когда прикладной програм- мист имеет возможность управлять временем отклика своей про- граммы. Чем он должен руководствоваться при выборе его значе- ния? К сожалению, на этот вопрос нет единственного ответа. Обра- тимся опять к разговору человека с человеком: задавая вопрос о вре- мени дня, вы предполагаете получить ответ в течение нескольких секунд; задержка 30 с вызовет у вас раздражение. С другой стороны, 30 с не такое уж большое время, если вы ждете ответа на вопрос, требующий сложных вычислений. Имеет значение также и то, какие аппаратные средства мы используем. При нажатии клавиши на те- летайпе мы ожидаем почти сразу же услышать звук удара печатаю- щей головки по бумаге. Ощущение какой-либо задержки здесь часто вызывает сильное недоумение. Таким образом, требования к времени отклика связаны с ожи- даниями пользователя. Миллер [324] предполагает, что существует иерархия требуемых времен отклика, соответствующих различным уровням психологического ощущения сложности выполняемой задачи. Чем сложнее выполняемая системой задача, тем больше допустимое время отклика. Системы с ощутимым для пользователя временем отклика за- ставляют его бесполезно тратить время двояким образом. Во-пер- вых, пользователь тратит время на ожидание ответа от ЭВМ. Во- вторых, получив ответ, он тратит некоторое время на восстановление прежнего хода мысли. Почти предельные требования к времени отклика предъявляются, по-видимому, в двух случаях: отклик на рефлекторные действия и отклик на «простой» запрос. Под «рефлекторными действиями» по- нимаются действия, выполняемые с помощью либо приобретенного, либо врожденного рефлекса, например печать литеры или переме- щение курсора. В каждом из этих случаев отклик системы должен быть немедленным или очень близким к нему, т. е. задержка между нажатием клавиши или перемещением карандаша по планшету и появлением результата данного действия не должна превышать 100 мс [509]. «Простыми» называются запросы, которые, по мнению пользо- вателя, не должны вызывать в ЭВМ каких-либо сложных вычисле- ний; поэтому он не хочет ждать ответа на такой запрос. Возникает вопрос: каково предельное время отклика, при превышении кото- рого пользователь замечает, что имеет место задержка, начинает удивляться медлительности ЭВМ и, следовательно, теряет ход рас- суждений? «Около двух секунд» — обычный ответ на этот вопрос [324]. Двухсекундная задержка считается допустимой для боль-
274 Глава 6 шинства обсуждавшихся выше систем, реализующих обратную связи на синтаксическом уровне, и для простых семантических действий» таких, как удаление строки при использовании ЭВМ, работающий в режиме разделения времени. я Двухсекундная задержка считается пользователем допустимой! частично потому, что она совпадает с его предположениями. По1 мере того как все более обычными становятся персональные ЭВМз и графические системы, рассчитанные на работу с одним пользо-1 вателем, предположения пользователя становятся более «жесткими», ] поскольку такие системы способны давать более быстрый ответ на большинство действий пользователя. Исключение составляют только запросы, связанные с большим объемом вычислений или с просмот- . ром файлов. Таким образом, все большее число запросов должны, по мнению пользователя, выполняться мгновенно, т. е. ответ должен ' быть получен за время, не превышающее 100—200 мс. Другим требованием, предъявляемым к времени отклика, явля-" ется постоянство. Действительно, эксперименты показывают, что пользователи более продуктивно работают с более медленной систе- мой, имеющей постоянное время отклика, чем с более быстрой (в среднем) системой, имеющей непостоянное время отклика [47, 326]. Предсказуемость предпочтительнее для пользователя, чем изменчивость, по крайней мере в некоторых пределах. 6.3.5. Соблюдение цельности системы Система является цельной, если ее концептуальная модель, се- мантика, синтаксис командного языка и форматы изображений единообразны и не имеют исключений и особых условий. Простыми примерами соблюдения принципа цельности в выходном языке яв- ляются следующие его свойства: в Единообразное кодирование информации. Осевые линии окруж- ностей всегда штрихпунктирные и имеют одинаковую яркость. Цвет кодирует информацию всегда одинаковым образом, так же как зеленый цвет всегда разрешает движение, а красный — запрещает, в Сообщения о состоянии системы всегда показываются в логи- чески (но не обязательно физически) фиксированном месте поверх- ности экрана. в Элементы меню занимают одни и те же позиции относительно меню в целом, так что при выборе нужного элемента пользователь может использовать «мускульную память». Примерами соблюдения принципа цельности при проектирова- нии входного языка являются следующие его свойства: в Клавиши клавиатуры, такие, как «возврат каретки», «перевод строки» и «возврат на позицию», всегда имеют одну и ту же функцию и могут использоваться всёгда, когда вводится текст. в Глобальные команды, такие, как ПОМОГИ, СОСТОЯНИЕ и ОТМЕНИТЬ, могут быть введены в любой момент.
Проектирование графического диалога 275 Рис. 6.6. Диаграмма переходов, которая изображает сложный командный язык, не обладающий цельностью. Ключевые слова в языке, представляющемся строками литер, могут сокращаться до строк постоянной длины. Одним из наиболее важных приложений принципа цельности яв- ляется синтаксическое и лексическое определения входного языка. В формальной теории языка многие языки являются регулярными и, следовательно, могут быть представлены ориентированными гра- фами-диаграммами переходов (разд. 2.14.3). Входными события- ми являются действия пользователя, а выходными — вычисления и изменения в изображении. Каждая дуга графа помечена действием пользователя, вызывающим соответствующий данной дуге переход, и действием системы (если оно имеется).
276 Глава 6 < ВвоЭ ( \ операнда киданий fleQcm8ue V Jвыполняется ВвО(Г/Г1о6тверждак1 Ввод „отменить" Деаствие отменяепТся Рис. 6.7. Явная отмена н явное подтверждение. На рис. 6.6 приведена диаграмма переходов для группы команд реального командного языка, не отличающегося особой цельностью. В нейтральном состоянии, являющемся также исходным состоянием, может быть введена любая команда Ввод команды вызывает переход •системы в состояние ожидания операндов — пользователю предла- гается ввести относящуюся к команде данного типа информацию. В языке имеются четыре структуры предложений (это слишком много); каждая структура соответствует одному из пяти основных циклов, изображенных на рисунке. Команды 2-го и 3-го типов ил- люстрируют принцип явного подтверждения или отмены результа- тов команды, в то время как в командах 4-го типа явно требуется задавать лишь отмену, а подтверж- дение специфируется неявно. Осо- бенно неприятно отсутствие едино- образия в структурах 2-го и 3-го ти- пов: единственным отличием является способ отмены команды. Пользова- тель, желающий отменить команду 3-го типа, должен помнить о том, что ему не следует пытаться использовать клавиатуру. Это увеличивает вероят- ность совершения ошибок. Для представления всех команд системы, не обладающей свойством цельности, может потребоваться большой и сложный граф состояний. Это создает дополнительный стимул для соблюдения принципа цельности при проектировании интерактивной системы. Сравним, например, два способа подтверждения результатов коман- ды — явное подтверждение и неявное. На рис. 6.7 представлен командный язык с однооперандными командами и явным указанием подтверждения или отмены результатов, а на рис. 6.8 — тот же язык, но с неявным подтверждением результатов и явной их отме- ной В первом случае для ввода любой команды нужно выполнить три действия, а во втором — только два. Минимизация числа эле- ментарных шагов, требуемых для решения задачи, является одной из целей при проектировании интерфейса, особенно для опытных пользователей, поскольку (что неудивительно) скорость, с которой Ввод команды “е Ввод операнда_______ Действие выполняется Ввод .отменить" Действие отменяется Рис. 6.8. Явная отмена, неявное подтверждение
Проектирование графического диалога 277 опытные пользователи могут вводить команды, примерно линейно зависит от числа дискретных шагов в команде (нажатий клавиш, движений руки) [74]. Рэйзнер экспериментально подтвердила интуитивно очевидный результат: при наличии двух функционально идентичных систем пользователь совершает меньше ошибок при работе с той системой, которая обладает более простой синтаксической структурой; эта же система быстрее осваивается [386]. Таким образом, другая цель при проектировании системы состоит в минимизации числа различных структур предложений. На семантическом уровне принцип цельности требует, чтобы операция, применимая к одному классу объектов, была также при- менима к другим «аналогичным» объектам (например, операция перемещения, применимая к символам письменных столов, должна быть применима и к символам стульев). Итак, можно сказать, что одной из целей соблюдения принципа цельности системы является поощрение пользователя к обобщению знания одного аспекта системы на другие аспекты. Цельность позво- ляет также избегать ситуаций, когда поведение системы для поль- зователя непонятно и нелогично. Наилучшим способом достижения цельности является тщательное проектирование всей системы в це- лом методом сверху вниз. 6.3.6. Структуризация изображения Пользователю часто необходимо предъявить большое количество информации, и, если информация представляется в неструктури- зованной форме, ее трудно воспринимать и понимать. Для облегче- ния структуризации информации полезно разделить экран на не- сколько областей и в каждой области показывать информацию опре- деленного типа. Подсказки, сообщения об ошибках, информация о состоянии системы и, собственно, графическая информация могут изображаться в отдельных областях. Такой способ позволяет созда- вать упорядоченную картинку и помогает пользователю найти на экране нужную информацию. Некоторые (немногочисленные) сис- темы даже разрешают пользователю выделять на экране области для организации обратной связи [218, 458]. Хотя эти области могут перекрываться, их границы позволяют отделить одну область от другой и служат средством логического группирования информации. Как уже говорилось выше (при обсуждении проблем обратной связи), при использовании фиксированных областей не всегда уда- ется сохранить визуальную непрерывность. Восприятие структуры изображения можно улучшить, используя различные способы визуального кодирования, такие, как цвет, тип линии или интенсивность. На рис. 6.9 показана промышленная уста- новка, детали которой трудно визуально выделить. На вклейке 12 та же установка изображена в цвете, и ее основные части легко
Рис. 6.9. Промышленная установка. (С разрешения фирмы Evans and Sutherland.) различаются. В таблице на рис. 6.10 приведены более подробные данные о способах кодирования информации; порядок перечисления методов примерно соответствует уменьшению степени их эффектив- ности. Цветовые различия наиболее легко воспринимаются пользо- вателями (за исключением пользователей, страдающих цветовой слепотой) и легко осуществимы на растровых дисплеях. Метод кодирования Максимальное число кодов для почти безошибочного распознавания Цвет 6 Геометрические формы 10 Ширина линии 2 Тип линии 5 Яркость 2 Рис. 6.10. Методы кодирования.
Проектирование графического диалога 279 Рис. 6.11. Полная молекула. (Рисунок из системы GRIP [513].) Комбинируя методы кодирования, можно повысить степень вы- деляемости объектов (путем избыточного кодирования) или увели- чить число выделяемых объектов [92]. Например, красные прямо- угольники и зеленые треугольники легче выбрать и визуально от- делить один от другого, чем объекты из следующих пар: (красный прямоугольник, красный треугольник), (зеленый прямоугольник, зеленый треугольник), (красный прямоугольник, зеленый прямо- угольник), (красный треугольник, зеленый треугольник). Кодиро- вание формой и цветом избыточно (каждый метод дает достаточно информации), однако пользователь может выбрать для выделения объектов любой метод кодирования или использовать сразу оба. Структуру представления трехмерных объектов можно улуч- шить, используя различные факторы глубины (гл. 14). Внимание пользователя можно привлечь к конкретной части изображения, рисуя в ней объекты другим цветом, заставляя мерцать объекты (2—3 раза в 1 с, время высвечивания не менее 50 мс) или выделяя объекты с помощью большой цветной мерцающей подложки. Любым из этих методов можно помочь пользователю, например, выделить движущийся или только что измененный объект и следить за ним. Другие аспекты структуризации изображений с целью облегчения восприятия и понимания описаны в работе [271]. В работе [299] изложены хорошо известные принципы графического проектирова- ния и их применение к диаграммам и графикам, генерируемым ЭВМ. Очевидным средством создания более ясной структуры, позво- ляющей уменьшить визуальный хаос, является селективное изо- бражение. Рис. 6.11 и 6.12 иллюстрируют два способа рисования
280 Глава 6 Рис. 6.12. Частичное изображение молекулы; показана только основа и одна боковая цепь. (Рисунок из системы GPIP.) Рис. 6.13. Использование обратной связи для получения пространственного 4 контекста. молекулы. Если пользователя интересует в основном общая вели- 5 чина структуры молекулы, следует выбрать рис. 6.11, если же нужна 2 детальная информация, рекомендуется рис. 6.12. ] Укрупнение небольшой части изображения для показа тех дета- I лей, которые в исходном изображении не видны, позволяет также | уменьшить визуальный хаос. Однако, когда показывается укруп- | ненная часть рисунка, необходимо каким-то образом обеспечитьj|
Проектирование графического диалога 284 сохранение у пользователя «чувства места» этой части в общем рисунке. На рис. 6.13 проиллюстрирован один из способов пред- ставления общего пространственного контекста: маленький квадрат внутри более крупного указывает, какая часть общего рисунка по- казывается в данный момент. Еще более эффективен этот способ при наличии двух дисплеев: один для общего вида, другой для укруп- ненного изображения части. Объединение дисплея на запоминающей трубке (для общего вида) с векторным или растровым дисплеем (для укрупненного изображения части) оказалось очень эффективным при конструировании кристаллов СБИС; рисование всего кристалла могло бы потребовать ~ 100 000 векторов с высоким разрешением. 6.3.7. Минимизация объема запоминаемой информации Обучение работе с системой включает запоминание некоторой информации. Важным принципом проектирования является макси- мальное облегчение запоминания и устранение последнего, когда это возможно. Цельность системы способствует этому так же, как пре- доставление меню и подсказок; но существуют и другие способы. Многие системы, ориентированные на работу с клавиатурой, имеют команды, которые состоят из полных слов, выражающих смысл команды, например УДАЛИТЬ. Очевидно, что короткие формы команд должны быть аббревиатурами этих слов. Следует также из- бегать необходимости запоминания порядка ввода позиционных параметров. Иногда свойства интерфейса вынуждают пользователя запоми- нать ненужную ему информацию. В одной чертежной системе объек- ты идентифицируются числовыми, а не буквенно-цифровыми име- нами. Для того чтобы оценить последствия такого решения, пред- ставьте себе интерактивную операционную систему, в которой имена файлов должны быть числовыми. В обоих случаях пользова- тель не может применить механизмы запоминания изучения, при- годные для мнемонических имен, и эффективность его работы сни- жается. Конечно, явный выбор показываемых объектов или образов исключает необходимость запоминания. Предпочтительнее, где это возможно, использовать способности пользователя к распознаванию, а не к запоминанию. В одной интерактивной графической системе команда PLOT YEARS GROSS NET (нарисуй по годам валовой чистый доход) рисует в одних и тех же осях графики ежегодного валового и чистого дохода. Разумным способом управления типом одной из линий была бы команда вида LINESTYLE NET DASH (чистый доход штриховой линией). К сожалению, действительная команда имеет вид LINES- TYLE 3 DASH. С помощью цифры 3 реализуется ссылка на третью переменную в последней команде PLOT: в данном случае NET. По- скольку, вообще говоря, последняя команда на экране уже отсут- ствует, пользователь должен помнить порядок параметров.
282 Глава 6 Во многих контекстно-ориентированных редакторах текста для изменения строки требуется двухшаговый процесс, поскольку команЯ да ИЗМЕНИТЬ оперирует только над текущей строкой. Сначала вводится команда НАЙТИ, которая находит строку, содержащую удаляемую цепочку литер; затем вводится команда ИЗМЕНИТЫ с указанием старой цепочки литер и новой цепочки. Пользователь^ должен помнить старую цепочку на протяжении ввода двух команд., По крайней мере один редактор избавляет пользователя от такой* необходимости: в нем за один шаг команда ИЗМЕНИТЬ сначала ищет, начиная с текущей строки, заданную цепочку литер и затем' осуществляет замену [175]. Во многих системах необходимость запоминания возникает при использовании команды ПОМОГИ (HELP) Получение с помощью этой команды дополнительной информации часто приводит к зна- чительным изменениям изображения, и пользователь теряет ви- зуальный контекст, в котором он обратился к команде ПОМОГИ. Поэтому пользователь должен запомнить обстоятельства, сопут- ствующие обращению к команде ПОМОГИ, такие, как содержание сообщения об ошибке, расположение изображения. После того как пользователь воспринял информацию, полученную с помощью команды ПОМОГИ, он должен запомнить ее и вернуться в контекст, в котором возникла ошибка. В таких системах, как Star фирмы Xerox и Smalltalk [69, 257, 258], интерфейс с пользователем устроен таким образом, что одновременно изображаются несколько окон (рис. 1.6, 1.9), В каждом окне показывается определенное изображе- ние, например, в одном — информация, получаемая по команде ПОМОГИ, в другом — картинка данного интерактивного приложе- ния. Переключение от работы с прикладной системой к получению информации об этой системе сводится к перемещению экранного курсора с одного окна на другое. Аналогично при работе с несколькими окнами довольно просто выполнить копирование части одного документа в другой. Одно окно показывает часть документа, из которого осуществляется за- имствование, другое — часть документа, в который необходимо включить копируемую информацию. Перемещение окна по тексту и другие позиционирующие команды могут быть выполнены для любого окна. Когда копируемый текст и точка, куда его необходимо вставить, оказались в своих окнах, выполняется собственно копи- рование. При этом не надо запоминать один контекст при переключе- нии на другой, поскольку они оба видны. В описании системы Smalltalk [69] Теслер довольно убедительно аргументировал полез- ' ность такого подхода. Динамическое управление окнами требует определенных затрат. 1 Для действительно эффективной работы необходима высокопроиз- - водительная персональная ЭВМ, а программное обеспечение оказы- вается намного более сложным, чем ц-традиционных системах, таких, j как ПГП и прикладная программа для размещения мебели в ком- |
Проектирование графического диалога 283 нате, описанная в гл. 2. Следует ожидать, что подобные методы управления окнами все чаще будут включаться в базовое программ- ное обеспечение персональных ЭВМ и работа с ними станет для при- кладных программистов таким же обычным делом, как сегодня работы с графическими пакетами, подобными ПГП. 6.3.8. Заключение Для читателя, хорошо знакомого с интерактивными системами, перечисленные выше правила могут показаться очевидными. Одна- ко, когда дело доходит до создания интерактивной системы, эти правила слишком часто забываются или им следуют только на сло- вах. Причины достаточно ясны. Обычно имеются жесткие ограниче- ния по времени, побуждающие как можно быстрее запустить систему и не оставляющие достаточной свободы для вдумчивого проектиро- вания. Поэтому при проектировании интерфейса с пользователем в первую очередь принимается во внимание простота реализации, а не простота использования. Иногда проект недостаточно детализи- рован, и программисты, не ведая того, нарушают принцип цельно- сти. Так, может оказаться, что при использовании одних возможно- стей прикладной системы вводимые параметры необходимо разде- лять запятой, а при использовании других возможностей для этой же цели может требоваться пробел. Хотя причины плохого проектирования понятны, получаемая в результате система может оказаться неприемлемой. Для создания интерактивной системы необходим полный, хорошо продуманный и документированный проект, в основе которого лежат четкие и ясные принципы. 6.4. ПРОЦЕСС ПРОЕКТИРОВАНИЯ Как проектируется интерфейс пользователя с ЭВМ для интер- активной графической прикладной программы? Сначала необходимо определить программную область данного приложения и будущих пользователей системы. Этот этап может показаться читателю ба- нальным, однако нередко он выполняется недостаточно хорошо. Частичную помощь в решении проблемы может оказать изучение методов, применяемых в данной проблемной области в настоящее время. Как сказал Хорнбакл, наблюдение за тем, что обычно делает человек во время решения стоящей перед ним задачи, может по- служить отправной точкой для проектировщика. В частности, мате- матик не манипулирует уравнениями, сидя за телетайпом, а схемо- техник отнюдь не высказывает желания работать с перфоратором [224]. Хансен еще более краток, его совет — «познай пользователя» [217]. Наблюдайте, изучайте, общайтесь с будущими пользователя- ми, пытайтесь понять их образ мышления и почему они делают то, что они делают.
284 Глава 6 Сказанное не означает, что графическая система на базе ЭВИ должна обязательно имитировать способ работы пользователя вру«Я ную или с неграфическими машинными средствами. С помощь» машинной графики часто можно существенно улучшить методы, кем торыми решается проблема или выполняется работа. Конечно, любом возможное увеличение эффективности, как следствие изменения- методов, должно сопоставляться с затратами на обучение и адап* тацию, необходимыми при переходе пользователей на новые методы^ Обычная стратегия заключается в том, что сначала существующий методы «переносятся» на ЭВМ, а затем, после того как пользователь^ привыкнет к работе с ЭВМ, осуществляется переход на более эф-’ фективные методы. Процесс изучения приложения и пользователей часто называ- ется анализом задачи. Его результатом является набор функцио- нальных требований или возможностей, которые должны быть до- ступны через интерфейс пользователя с ЭВМ. Этот анализ может также помочь понять, как представить пользователю возможности системы. Наконец, анализ идентифицирует категории пользовате- лей, для которых проектируется система (важность разделения поль- зователей на категории обсуждалась в предыдущем разделе). Что должен делать проектировщик после завершения анализа задачи? Разумным подходом, полезность которого доказана на практике, является проектирование сверху вниз в соответствии, с языковой моделью (разд. 6.2). Таким образом, проектировщик должен: сформулировать концептуальную модель системы; спроектировать семантику — операции, выполняемые над объек- тами в концептуальной модели; изменения, вызываемые операция- ми в объектах, и информацию, показываемую на экране; определить синтаксис — последовательности логических дей- ствий пользователя (знаков), необходимые для спецификации каж- дой операции и организацию изображения на экране; выполнить лексическое проектирование — каждый логический знак (слово) привязывается к физическим действиям с конкретны- ми устройствами диалога, а визуальное представление информации привязывается к возможностям конкретного устройства отобра- жения. Принципы, описанные в предыдущем разделе, применяются на каждом этапе процесса проектирования. При этом может возник- нуть необходимость в итеративном повторении процесса несколько раз, прежде чем будет получен полностью удовлетворительный проект. Концептуальные, семантические, синтаксические и лексические компоненты проекта вкратце рассмотрены в разд 6.1. Ниже эти основные понятия будут рассмотрены, бол ее подробно. Концептуальная модель определяет общую форму набора воз-
Проектирование графического диалога 285 можностей, которые необходимо представить пользователю. Сюда относятся типы объектов, о которых будет знать пользователь, и типы действий, которые можно выполнять над этими объектами. Например, для интерактивной чертежной системы можно предло- жить несколько альтернативных моделей: К Копирование инструментов и методов, используемых чертеж- ником. Расширение этих инструментов и методов на три измерения. Отказ от традиционных чертежных инструментов — пользова- телю разрешается непосредственно манипулировать (позициони- ровать, добавлять, вычитать) трехмерными объемами. Отказ от традиционных чертежных инструментов — предостав- ление средств для процедурного описания (как при написании про- граммы) процесса рисования конструирования двух- или трехмер- ных объектов. Для интерактивного редактора текстов возможны следующие модели: Редактор, ориентированный на номера строк; операции выпол- няются над некоторой строкой или набором строк. Редактор, ориентированный на цепочки литер; операции выпол- няются над произвольными цепочками литер. Редактор, ориентированный на работу с окнами; операции вы- полняются над цепочками литер в прямоугольных областях экрана. Очевидно, что семантика прикладной системы сильно зависит от концептуальной модели, поэтому последнюю нужно выбирать чрез- вычайно тщательно. К сожалению, в этой области почти нет каких- либо общих правил. Можно, например, строить концептуальную модель на понятиях, близких к тем, с которыми пользователь уже хорошо знаком. С другой стороны, какая-либо другая модель может быть более полезной и эффективной. Чем восприимчивее к новым идеям коллектив пользователей, тем в большей степени можно жертвовать привычностью в пользу эффективности. На основе анализа задачи и концептуальной модели определяется, семантика прикладной системы. Идентифицируется каждая, требуе- мая операция и детализируется информация, необходимая для ее выполнения. В примере, приведенном в гл. 2, объектами являются символы предметов мебели и заголовок; над символами можно вы- полнять действия ДОБАВИТЬ и УДАЛИТЬ, над заголовком — ЗАМЕНИТЬ. Для добавления символа требуется, чтобы был задан символ и его желаемая позиция; для замены заголовка требуется ввод цепочки литер. Пользователи прикладной системы должны понимать ее концеп- туальную модель и семантику. В крупных и развитых предметных областях обычно существует много видов объектов и действий над ними. Концептуальная модель и семантика структурируются таким.
286 Глава 6 образом, чтобы новички могли эффективно работать без понимания всей семантики в целом; такое понимание постепенно приходит по мере накопления опыта работы с системой. Взаимосвязи между различными понятиями системы можно выяснить, нарисовав граф, показывающий связи и зависимости, Моран предложил формальный 4 способ определения семантических понятий и взаимосвязей между ними [329]. После завершения проектирования семантики выполняется этап синтаксического проектирования. Здесь возможно большое разно- образие. Даже для такой простой команды, как добавление символа, возможны шесть форм синтаксиса: 1. ДОБАВИТЬ ОБЪЕКТ позиция 2. ДОБАВИТЬ позиция ОБЪЕКТ 3. ОБЪЕКТ ДОБАВИТЬ позиция 4. ОБЪЕКТ позиция ДОБАВИТЬ 5. позиция ДОБАВИТЬ ОБЪЕКТ 6. позиция ОБЪЕКТ ДОБАВИТЬ Для форм 1 и 2, в которых вначале вводится команда, можно использовать подсказку. Только формы 1 и 3, где позиция вводится последней, допускают использование для позиционирования метода буксировки. В общем случае префиксные формы позволяют легко изменить команду, если она выбрана по ошибке, а постфиксные формы позволяют исправлять операнды. Можно использовать команды с открытым концом, которые по- зволяют вводить произвольное число полных операндов. Например, можно было бы иметь команду ДОБАВИТЬ, которая, будучи один раз задана, разрешала бы добавление к рисунку произвольного числа символов мебели — до ввода другой команды. При использо- вании таких команд характерна такая последовательность команд: ДОБАВИТЬ ОБЪЕКТ ПОЗИЦИЯ ОБЪЕКТ ПОЗИЦИЯ УДАЛИТЬ ОБЪЕКТ ОБЪЕКТ Таким образом можно уменьшить число действий, которые должен выполнить пользователь для завершения задачи. Другим способом уменьшения числа действий, требуемых от пользователя при работе сопрограммой размещения мебели, являет- ся предоставление отдельной команды ДОБАВИТЬ для каждого символа обстановки: ДОБАВИТЬ „КРЕСЛО, ДОБАВИТЬ_СТОЛ и т. д. Такой подход приводит к появлению большого числа команд, >
Проектирование графического диалога 287 зато пользователь вместо ввода команды ДОБАВИТЬ и последую- щего указания символа кресла сразу вводит команду ДОБАВИТЬ. КРЕСЛО простым выбором символа кресла из меню. Проектирование лексики влечет за собой привязку конкретных аппаратных возможностей к знакам^ входного и выходного языков. Для входного языка это означает установление соответствия между действиями или последовательностями действий с устройствами ввода и «словами» языка. Для выходного языка устанавливается соответствие между примитивами вывода (отрезками, литерами, кривыми и сплошными областями), а также их атрибутами (такими, как цвет, тип линии и яркость литеры) и данными, которые необ- ходимо изобразить на экране. Как и в других примерах проектиро- вания сверху вниз, привязка к физическим представлениям или реа- лизациям осуществляется на самом последнем этапе проектирова- ния. Логические устройства, описанные в гл. 5, можно считать син- таксическими типами (подобно различным частям речи в естествен- ном языке). Различные интерактивные методы, реализующие логи- ческие устройства с помощью планшетов, клавиатур, устройств ре- чевого ввода и вывода и т. д., представляют собой ассоциации физи- ческих действий пользователя (или последовательностей физических действий) со словами на синтаксическом уровне. В процессе проектирования синтаксических и лексических кон- струкций могут быть полезны различные формализмы. Диаграммы переходов, обсуждавшиеся в разд. 6.3.5, служат примером подобных формализмов. Рэйзнер для формального определения двух изучае- мых ею систем использовала нормальную форму Бэкуса (НФБ) [386]. При наличии формального определения можно выполнить еще две операции. Во-первых, использовать это определение для управления моделью интерфейса с пользователем [211] или реаль- ным интерфейсом [345]. Для аналогичных целей применяются моди- фицированные регулярные выражения в средствах ввода Ван ден Боса [475]. Подобные средства применяются также при вводе с кла- виатуры в системе LANGPAK [216] и в системе, являющейся объеди- нением систем YACC и LEX [246]. Во-вторых, использовать метрики для предсказания характеристик интерфейса с пользователем. Рэйзнер использовала этот прием для предсказания частоты ошибок; Кард, Моран и Ньюэл подсчитали время, требующееся опытным пользователям для ввода команд с помощью различных диалоговых устройств и методов [74]. Таким образом, процесс проектирования начинается с анализа задачи и формирования концептуальной модели и завершается де- тальным рассмотрением вопросов реализации намечаемых решений на имеющейся аппаратуре. Что дальше? Как и при проектировании программ, проект интерфейса с пользователем должен быть акку- ратно документирован и формально проверен. При проверке следует, в частности, определить, насколько хорошо воплощены в проекте
288 Глава 6 основополагающие принципы (подобные описанным в разд. 6.3|В После проверки (и только после нее) начинается реализация проект» интерфейса пользователя с ЭВМ. Я Предостережение. Опыт показывает, что даже тщательно про-® думанные проекты оказываются после реализации не вполне соотЯ ветствующими предъявляемым требованиям. Поэтому реализациям проекта должна быть как можно более модульной, в частности для того, чтобы облегчить изменения на лексическом и синтаксичеЯ ском уровнях. Такая тщательная настройка эргономических харак*3 теристик системы часто необходима для того, чтобы система наибо-я лее эффективно использовалась коллективом пользователей. | Проектирование тщательно настроенного интерфейса может за- нять много времени, но результаты оправдывают затраченные уси- лия. Создание интерфейса с пользователем в системе Star фирмы “ Xerox потребовало, по сообщениям, 20—30 человеко-лет [418], 1 включая эксперименты с различными альтернативными проектами. Результатом является один из наиболее удачных интерфейсов в ис- тории интерактивных систем! УПРАЖНЕНИЯ 6.1. Проанализируйте какую-нибудь из существующих интерактивных систем, желательно интерактивную графическую систему. Какова ее концептуаль- ная модель, что представляют собой семантические, синтаксические и лексиче- ские компоненты входного и выходного языков? Идентифицируйте все входные и выходные знаки и лексемы. Сделайте критические замечания исходя из принци- пов, сформулированных в данной главе, и личного опыта. 6.2. Изучите простую задачу, например построение блок-схем, рисование электрических схем или «закрашивание» для растровой системы. Используя опи- санную в данной главе методологию, синтезируйте интерфейс с пользователем. Явно идентифицируйте в проекте четыре уровня- концептуальную модель, семан- тику, синтаксис, лексику. Изобразите с помощью диаграмм переходов и рисун- ков на бумаге, моделирующих картинки на экране дисплея, типичный процесс взаимодействия пользователя и ЭВМ. 6.3. Определите формально синтаксис командного языка прикладной про- граммы, описанной в гл. 2. Используйте для этого продукции или диаграммы переходов. 6.4. Какие из описанных в гл. 5 интерактивных методов при использовании опытными пользователями будут включать рефлекторные действия и, следова- тельно, предъявлять высокие требования к временам отклика системы? 6.5. Приведите несколько правил (пропущенных авторами данной книги), предписывающих, что следует и что не следует делать при проектировании интер- активной системы, и обсудите их; желательно, чтобы эти правила основывались на вашем личном опыте. Приведите также те утверждения в дайной главе, с которыми вы не согласны, и объясните почему. Пришлите результаты нам, чтобы мы могли их использовать при подготовке второго издания (конечно, с соответствующей ссылкой!). 6.6. Сделайте критические замечания по эргономическим характеристикам » хорошо знакомой вам интерактивной системы, например редактора текстов. г 6.7. Выберите задачу из упражнения 2 и определите структуры данных, тре- . буемые для реализации отмены любой команды. Предложите метод, более совер- * шейный, чем простое сохранение всей структуры данных на каждом шаге. 4
Проектирование графического диалога 289 6.8. Спроектируйте управляемую ЭВМ, обучающую систему для новичков, желающих работать с программой размещения мебели в комнате. Предположите, что ваши пользователи хорошо знакомы с проблемами расстановки мебели и ни- чего не знают об ЭВМ: все, что оии умеют делать, это начать сеанс работы с гра- фическим терминалом. Ваша задача — ввести их в круг относящихся к делу понятий, показать несколько типичных результатов и обучить применению каж- дой команды. 6.9. Исследуйте несколько интерактивных систем. Какие типы ненавязчивых подсказок используются в них? 6.10. Спроектируйте интерфейс с пользователем для систем эскизирования, использующей в качестве диалогового устройства планшет. Необходимы следую- щие возможности: 1) аппроксимация кривой последовательностью'коротких от- резков; 2) редактирование (т. е. исправление) части введенной кривой; 3) удаление кривой; 4) перемещение кривой. Сначала спроектируйте интерфейс для новичков, затем — для опытных пользователей. После этого попытайтесь спроектировать интерфейс, приспосабливающийся и к начинающим, и к опытным пользователям. 6.11. Измените интерфейс с пользователем в программе размещения мебели таким образом, чтобы команды ДОБАВИТЬ и УДАЛИТЬ стали командами с от- крытым концом, как это описано в разд. 6.4.
Глава 7 Г еометрические преобразования В данной главе описаны элементарные двумерные и трехмерные преобразования, применяемые в машинной графике. Преобразова- ния переноса, масштабирования и поворота, рассмотренные в кни- ге, лежат в основе многих графических приложений и будут широко использоваться в последующих главах. Преобразования обычно применяются как в графическом пакете, так и непосредственно в самой прикладной программе. Например, в процессоре видовой операции ПГП (гл. 4) при реализации отобра- жения мировых координат в экранные используются двумерные перенос и масштабирование. После введения трехмерных мировых координат в гл. 8 будем использовать для той же цели трехмерные поворот и перенос. В гл. 9 показано, как применять геометрические преобразования, чтобы с их помощью менять на чертеже положение, ориентацию и размер объектов (называемых также символами или шаблонами). Простейшим примером использования этих преобра- зований может служить преобразование, с помощью которого раз- мещались символы предметов мебели в гл. 2. 7.1. ДВУМЕРНЫЕ ПРЕОБРАЗОВАНИЯ Точки на ху-плоскости можно перенести в новые позиции путем добавления к координатам этих точек констант переноса. Для каж- дой точки Р(х, у), которая перемещается в новую точку Р' (х, у), сдвигаясь на Dx единиц параллельно оси х и на Dy единиц парал- лельно оси у, можно написать уравнения] х' =x + Dx, y' — y+Dy. (7.1) На рис. 7.1 показана точка с координатами (1 ,г2), которая смещается на расстояние (5, 7), преобразуясь в точку (6, 9). Определяя векто- ры-строки P«[xji], Р'=[*'/], T = [DxDy], можно переписать уравнение (7.1) в векторной форме [х'/] = [xz/]-b[DxDz/], (7.2) или более кратко Р' = Р + Т. (7.3)
Геометрические преобразования 291 Объект можно перенести, применяя уравнения (7.1) к каждой его точке. Однако, поскольку каждый отрезок, описывающий объект, состоит из бесконечного числа точек, такой процесс длился бы бес- конечно долго. К счастью, все точки, принадлежащие отрезку, мож- но перенести путем перемещения одних лишь крайних точек отрезка и последующего вычерчивания нового отрезка между получившими- ся в результате точками. Это справедливо также для масштабиро- вания (растяжения) и поворота. Доказательство утверждения пре- доставляем читателю в качестве упражнения. На рис. 7.2 показан результат действия на контур домика операции переноса на рас- стояние (3, —4). • Нб, 9) -LLU.J.I.I 1 I I_ ' Рис. 7.1. Перенос точки. До переноса После переноса Рис. 7.2. Перенос объекта. Точки можно промасштабировать (растянуть) в Sx раз вдоль оси х и в Sy раз вдоль оси у, поручив в результате новые точки, с по- мощью умножения' , x'=*x-Sx, y' = y-Sy. (7.4) 'Sx 0 ’ . О Sy_ Определяя S как , можно записать в матричной форме Sx 0 ' . О 8у_ IX /] = [х#] (7.5) или P' = P-S. (7-6) На рис. 7.3 отдельная точка (6, 6) масштабируется с коэффици- ентами 1/2 по оси х и 1/3 по оси у. Йа рис. 7.4 показан контур домика, промасштабированный с коэффициентами 1/2 по оси х и 1/4 по оси у. Отметим, что масштабирование производится относительно на- чала координат; в результате преобразования домик стал меньше и ближе к началу координат. Если бы масштабные множители были больше 1, то домик увеличился бы и отдалился от начала координат. Способы проведения масштабирования относительно других точек, отличных от начала координат, рассматриваются в одном из по- следующих разделов главы. Пропорции домика также изменились: было применено неоднородное масштабирование, при котором Sx=£
»2 Глава 7 *£Sy. Однородное масштабирование, для которого Sx—Sy, не вли- яет на пропорции. Точки могут быть повернуты на угол 0 относительно начала коор- динат, как показано на рис. 7.5 для точки Р (6, 1) и угла 0=30°. Математически поворот определяется следующим образом: x' = x-cos0—i/-sin0, _ у' =x-sin0 + i/-cos 0. ' ‘ ' В матричной форме мы имеем к'/]=к»][_^9”Г9] Р-«) или Р' = р.р, (7.9) где через R обозначена матрица поворота из выражения (7.8). На рис. 7.6 показан квадрат, повернутый на 45°. Как и в случае мас- штабирования, поворот производится относительно начала коорди- нат. Поворот относительно произвольной точки рассмотрен в одном из' последующих разделов. Рис. 7.3. Масштабиро- вание точки. До масштабирования Рис. 7.4. Масштабирование объекта. После масштабирования Рис. 7.5. Поворот точки. Рис. 7.6. Поворот квадрата. Положительными считаются углы, измеряемые против движения часовой стрелки от х к у. В случае отрицательных (по часовой стрел- ке) углов для модификации выражений (7.7) и (7.8) можно восполь- зоваться тождествами cos(—0)=cos0 и sin(—0)=—sin 0.
Геометрические преобразования 29J Уравнения (7.7) легко получа- ются из рис. 7.7, на котором точка Р (х, у) переводится в точку Р' (х’> У ) поворотом на угол 0. По- скольку поворот производится от- носительно начала координат, рас- стояния от него до Р и Р' равны. Они обозначены на рисунке через г. Из простых тригонометрических соотношений следует, что x = rcos<jp, у = г sin <р (7.10) Рис. 7.7. Вывод уравнения поворота. И х’ — г cos (0 + ф) = г cos ф cos 0—г sin ф sin 0, (7 11) у' = г зш(0 + ф) = г cos ф sin 0 +г sin фсозО. ' Теперь подставим уравнения (7.10) в уравнения (7.11) и получим уравнения (7.7). 7.2. ОДНОРОДНЫЕ КООРДИНАТЫ И МАТРИЧНОЕ ПРЕДСТАВЛЕНИЕ ДВУМЕРНЫХ ПРЕОБРАЗОВАНИЙ Преобразования переноса, масштабирования и поворота в мат- ричной форме записываются в виде Р' = Р + Т, (7.3) Р'М, (7.6) P'^P-R. (7.9) К сожалению, перенос реализуется отдельно (с помощью сложения) от масштабирования и поворота (с помощью умножения). Хотелось бы представить их таким способом, чтобы все эти три элементарных преобразования можно было легко объединять вместе. Ниже в этом разделе показано, как это можно сделать. Если мы выразим точки в однородных координатах, то все три преобразования можно реализовать с помощью умножений. Одно- родные координаты были введены в геометрии [307, 308] и впослед- ствии использованы в графике [397, 42, 43]. С однородными коорди- натами и преобразованиями над ними работают многие пакеты гра- фических подпрограмм и некоторые дисплейные процессоры. В од- них случаях эти координаты используются прикладной программой непосредственно при задании параметров для графического пакета, в других — применяются лишь внутри самого пакета и недоступны для программиста. В однородных координатах точка Р(х, у) записывается как P(W'X, №'У, W7) для любого масштабного множителя'W^O. При
294 Глава 7 этом если для точки задано ее представление в однородных коорди- натах Р(Х, Y, W), то можно найти ее двумерные декартовы коорди- наты как x=X/W и y—Y/W. В этой главе W всегда будет равно 1, поэтому операция деления не требуется. Однородные координаты можно представить как вложение промасштабированной с коэффи- циентом W двумерной плоскости в плоскость z=W (здесь z=l) в трехмерном пространстве. Точки теперь описываются трехэлементными вектор-строками, поэтому матрицы преобразований, на которые умножается вектор точки, чтобы получить другой вектор точки, должны иметь размер 3x3. Уравнения переноса (7.1) записываются в виде матрицы пре- образования однородных координат следующим образом: [*' у' l] = [xt/ !]• '1 0 0 1 Dx Dy 0" 1 1 (7.12) или P' = P-T(Dx, Dy), (7.13) где 1 0 O' T(Dx, Dy) = 0 1 0 • (7.14) _Dx Dy 1_ Что будет, если точку Р перенести в точку Р' на расстояние (Dxlt Dyt), а затем в Р" на расстояние (Ох2 Dy,)? Интуитивно ожидаемый результат в этом случае представляет собой суммарный перенос на расстояние (Z)xi+Z)x2, Dy^-r-Dy,). Чтобы доказать это, запишем данные в виде Р'— Р-Т (DXi, Dyj), (7.15) Р" — Р'-Т (Dx„ Dy,). (7.16) Теперь, подставляя выражение (7.15) в выражение (7.16), получим P’ = (P.T(Dxi( Dyt))-T(Dx„ Dy,) = P-(T (DX1, Dyi)-T (Dx„ Dy,)). (7.17) Матричное произведение T(Dxlt Dy1)-T(Dx,, Dy,) есть ’ 1 0 O' ' 1 0 O' ' 1 0 O' 0 1 0 0 1 0 0 1 0 _Dxr Dyt 1 _Dx, 1 + Dx, tyh + Dy, 1 (7.18) Действительно, результирующий перенос есть (Dxi+Dx„ Dyt+ +Dy,). Матричное произведение в разных случаях называют объ- единением, соединением, конкатенацией и композицией матриц
Геометрические преобразования 295 T(Dxi, Dyа) и T(Dx2, Dy2). В этой книге мы будем использовать тер- мин композиция. Уравнения масштабирования (7.4) в матричной форме записы- ваются в виде [х'у' l] = [xz/ !]• Sx 0 0 0 Sy 0 .° oi. (7.19) Определяя S (Sx, Sy) = Sx 0 0 0 Sy 0 , (7.20) имеем P' = P.S(S _o 0 i. >x, Sy). (7.21) Так же как последовательные переносы являются аддитивными, можно ожидать, что последовательные масштабирования будут мультипликативными. Если заданы P' = P-S(Sxi, Syt), (7.22) P" = P'-.S(Sx2, Sy J, (7.23) то, подставляя выражение (7.22) в выражение (7.23), получим P’ = (P-S(Sxlt Syi)).S(Sxt, Syt) = P-(S (Sxit Sy1).S(Sxi, Sy,)). (7-24) Матричное произведение S(Sxb Si/i).S(Sx2, Sy2) есть ~Sxf 0 O’ "Sx2 0 O’ Sxj-Sx,; 0 0 o syi 0 o Sy2 o = ° syi-syiQ . (7.25) 0 0 1 .o oi. ° 0 1. Таким образом, масштабирования в самом деле мультипликативны. И наконец, уравнения поворота (7.3) можно представить в виде [*' у' 1]=[х у 1]. cos 6 sinQ О — sin 6 cos0 О 0 О L (7.26) Полагая имеем cos0 sin0 7?(0) = —sin 0 cos0 0‘ О 1 (7.27) р' = р.р(8). (7.28) О О
296 Глава 7 Доказательство того, что два последовательных поворота являются аддитивными, предоставляем читателю в качестве упражнения. В матрице выражения (7.27) рассмотрим каждый из двух столб- цов подматрицы размером 2x2, содержащей синусы и косинусы, как векторы. Можно показать, что эти векторы обладают тремя свой- ствами: 1. Каждый вектор является единичным. 2. Они взаимно ортогональны (их скалярное произведение рав- но нулю). 3. Направления, задаваемые векторами при их повороте на R (0), совпадают с х- и у-осями. Первые два свойства справедливы также и для строк подматрицы размером 2X2. Два направления являются теми, на которые указы- вают векторы, расположенные вдоль х- и г/-осей, после того как они были повернуты. Из этих свойств вытекают два правила, полезные для вывода матрицы поворота, когда известен результат желаемого поворота. 7.3. КОМПОЗИЦИЯ ДВУМЕРНЫХ ПРЕОБРАЗОВАНИЙ Понятие композиции было введено в предыдущем разделе. В данном разделе мы покажем, каким образом можно использовать композицию преобразований для объединения фундаментальных матриц R, S и Т с целью получения желаемых общих результатов. Основное преимущество объединенных преобразований состоит в том, что к точке более эффективно применять одно результирую- щее преобразование, чем ряд преобразований друг за другом. Рассмотрим, например, поворот объекта относительно некоторой произвольной точки Рр Поскольку нам известно, лишь как повора- чивать вокруг начала координат, разобьем исходную (трудную) про- блему на три более легкие задачи. Таким образом, чтобы произвести поворот относительно точки Plt необходимо выполнить последова- тельно три элементарных преобразования: 1. Перенос, при котором точка Pi перемещается в начало коор- динат. 2. Поворот. 3. Перенос, при котором точка из начала координат возвраща- ется в первоначальное положение Р^ Эта последовательность показана на рис. 7.8, на котором вокруг точки Pi(x, у) поворачивается контур домика. Первый перенос про- изводится на (——ух), в то время как последующий — на (хъ z/J — является обратным ему. Результат существенно отличается от того, который получился бы, если бы применялся один только поворот.
Геометрические преобразования 297 Результирующее преобразование имеет вид 1 О О О 1 О _ xi Уг L COS 0 — sin 0 cos0 sin 0 0 '1 0 o' — sin 0 cos 0 0 • 0 1 0 =3 0 0 1_ _*1 У1 1_ sin 0 0" COS0 0 Xt(l—COS 0) + sin 0 Z/j(l—COS0) — XjSinO 1 (7,29) Эта композиция преобразований путем умножения матриц слу- жит примером того, как применение однородных координат упро- щает задачу. Используя аналогичный подход, можно промасштабировать объект относительно произвольной точки Рг: перенести Рг в начало координат, промасштабировать, перенести назад в точку Л. Ре- зультирующее преобразование в этом случае будет иметь вид о о 1 1 О О О 10. А — У1 L Sx = 0 Sx 0 о 0 0 Sy 0 0 1. о 1 о 0 1 _*1 Z/i о" Sy 0 . z/i(l — Sy) 1_ (7.30) _*! (1—Sx) Предположим, что нам необходимо промасштабировать, повер- нуть и расположить в нужном месте домик, показанный на рис. 7.9, где центром поворота и масштабирования является точка Pj. По- следовательность преобразований заключается в переносе точки Рх в начало координат, проведении масштабирования и поворота, а затем переносе из начала координат в новую позицию Р2, в кото- рой домик должен оказаться (эта последовательность показана на рис. 7.9). В структуре данных, в которой содержится это преобра- зование, могут находиться масштабный множитель (множители), угол поворота и величины переноса или может быть записана мат- рица результирующего преобразования: Т (— xlt — уJ • S (Sx, Sy) • R (0) • Т (х2, уг). Если известно, что и Л12 представляют собой элементарные перенос, масштабирование или поворот, то при каких условиях и М2 коммутативны? В общем случае умножение матриц некоммута- тивно. Однако легко показать, что в следующих частных случаях коммутативность имеет место:
Первоначальный домик Домик в начальный момент Рис. 7.9. Преобразование шаблона.
Геометрические преобразования 299 Л11 Afe Перенос Перенос Масштабирование Масштабнрова ние Поворот Поворот Масштабирование (при Sx=Sy) Поворот В этих случаях можно не беспокоиться о порядке перемножения матриц. 7.4. ВОПРОСЫ ЭФФЕКТИВНОСТИ Композиция наиболее общего вида, составленная из операций R, S иТ, имеет матрицу га Гц 0 м = G1 г22 0 (7.31) Ее верхняя часть размером 2x2 является объединенной матри- цей поворота и масштабирования, в то время как tx и ty описывают суммарный перенос. Для вычисления Р-М как произведения век- тора на матрицу размером 3x3 требуются 9 операций умножения и 6 операций сложения. Структура последнего столбца матрицы в выражении (7.31) позволяет упростить фактически выполняемые действия: х’ = x>ril + y-ril + tx, .732) f/' = xT12+z/-ra2 + ^, ( ’ сводя процесс к 4 операциям умножения и 4 операциям сложения. Это существенно ускоряет процесс, особенно если учесть, что пре- образованиям могут подвергаться сотни и даже тысячи точек на каждом изображении. Таким образом, несмотря на то что матрицы размером 3x3 удобны и полезны для совмещения преобразований, в программе целесообразно использовать результирующую матрицу с учетом особенностей ее структуры. Если же умножение матриц выполняется аппаратно с помощью параллельно работающих сум- маторов и умножителей, то вопрос эффективности перестает быть актуальным. Другой областью применения, в которой важно быстродействие, является генерация последовательных кадров — изображений объ- екта (такого, как молекула или самолет), когда каждый следующий кадр отличается от предыдущего поворотом объекта на несколько градусов. Если каждое изображение строится и выводится на экран
300 Глава 7 дисплея достаточно быстро (в течение 30—60 мс), то поворот объектая будет казаться непрерывным и плавным. Для достижения такогоА быстродействия каждую точку и линию объекта следует преобразо-1 Бывать как можно быстрее. В уравнения поворота (7.7) входят 4 one-1 рации умножения и 2 операции сложения. Эту оценку можно улуч- 1 шить, воспользовавшись тем, что угол 0 мал (несколько градусов) 1 и cos 0~ 1. При такой аппроксимации уравнения (7.7) принимают вид " х' = х—узтв, у' — хsin 6 +у, (7.33) ; и тогда требуется только 2 операции умножения и 2 операции сло- жения. Экономия двух операций умножения может оказаться су- щественной для ЭВМ, не имеющих аппаратно реализованных опе- раций умноженйя. Можно получить еще лучшую аппроксимацию, если во втором уравнении использовать х' вместо х: х'=х—у sin 0, у' = х' sin 0 -|- у. (7.34) Определитель соответствующей матрицы размером 2x2 теперь ра- вен 1, как и определители всех матриц поворота. Однако здесь возникает одно затруднение. Формулы представ- ляют собой аппроксимацию точных значений х' и у' с некоторой небольшой ошибкой. Каждый раз, когда формулы применяются к новым значениям х и у, ошибка слегка увеличивается. При доста- точно большом числе повторений ошибка станет сравнимой с самими значениями. В результате изображение поворачивающегося образа объекта все в большей степени будет выглядеть как совокупность линий, вычерченных случайным образом. Это затруднение можно преодолеть, если сохранять исходный список (х, у) координат. После каждого поворота на 360° полученные в результате данные отбрасываются, а для последующего вращения берутся исходные данные. Для дополнительного списка координат потребуется память. В этом нет ничего удивительного, поскольку справедлива пространственно-временная зависимость между поша- говым и абсолютным поворотом! Преимущества, которые дает поша- говый поворот, нельзя получить, ничем не жертвуя. 7.5. МАТРИЧНОЕ ПРЕДСТАВЛЕНИЕ ТРЕХМЕРНЫХ ПРЕОБРАЗОВАНИЙ Аналогично тому, как двумерные преобразования описываются матрицами размером 3x3, трехмерные преобразования могут быть представлены в виде матриц размером 4x4. И тогда трехмерная точка (х, у, г) записывается в однородных координатах как (W-x, W-y, W-z, W), где IF#=0. Если 1, для получения трехмерных декартовых координат точки (х, у, г) первые три однородные коорди- наты делятся на W. Отсюда, в частности, следует, что две точки /71 и Н3 в пространстве однородных координат описывают одну и ту же
Геометрические преобразования 301 точку трехмерного пространства в том и только в том случае, когда Ну^—сН^ для любой константы с, не равной нулю. Трехмерная система координат, при- меняемая в этой книге, является пра- восторонней (рис. 7.10). Примем согла- шение, в соответствии с которым по- ложительными будем считать такие по- вороты, при которых (если смотреть с конца положительной полуоси в на- правлении начала координат) поворот на 90° против часовой стрелкип будет переводить одну положительную полу- ось в другую. На основе этого согла- Рис. 7.10. Правосторонняя система координат. шения строится следующая таблица, которую можно использовать как для правых, так и для левых систем координат: Если ось вращения Положительным будет направление поворота X от у к г У от 2 к X 2 ОТ X к у Эти положительные направления отмечены также на рис. 7.10. Мы применяем здесь правостороннюю систему координат, по- скольку она хорошо знакома большинству людей, хотя в трехмерной графике чаще более удобна левосторонняя система, так как ее легче представить наложенной на поверхность экрана дисплея (рис. 7.11). Это позволяет естественно интерпретировать тот факт, что точки с большими значениями z находятся дальше от наблюдателя. Отме- тим, что в левосторонней системе положительными будут повороты, выполняемые по часовой стрелке, если смотреть с конца положитель- ной полуоси в направлении начала координат. Трехмерный перенос является простым расширением двумер- ного: (7.35) Dx Dy Dz 1. т. е. [xyzl]-T(Dx, Dy, Dz)—[x+Dx y+Dy z+Dz 1]. Ч Это соглашение, используемое также в векторной алгебре, является обрат- ным тому, которое применяется в работе [352].
302 Глава 7 система координат. Рис. 7.12. Преобразование точек Plt Р2 и Ра из на-J чальной позиции в конечную. Рис. 7.11. Левосторонняя Масштабирование расширяется аналогичным образом: Sx 0 0 0 S(Sx, Sy, Sz) = 0 Sy 0 0 0 0 Sz 0 (7.36) . 0 0 0 1 В самом деле, [х у z lbS(Sx, Sy, Sz)=[Sx-x Sy-y Sz-z 1]. Двумерный поворот, описываемый уравнением (7.26), является в то же время трехмерным поворотом вокруг оси г. В трехмерном пространстве поворот вокруг оси z описывается выражением COS0 sin 0 0 O' — sin 0 cos 0 0 0 (0) = 0 0 1 0 (7.37) 0 0 0 1. Это легко проверить: в результате поворота на 90° вектора [1 0 0 1], являющегося единичным вектором оси х, должен получиться еди- ничный вектор [0 10 1] оси у. Вычисляя произведение ' 0 1 0 0‘ [10 0 1]. 1 ° 0 0 11 4 0 0 10’ 0 0 0 1. получаем предсказанный результат [0 1 0 1]. Матрица поворота вокруг оси х имеет вид (7.38j '1 0 0 O' 0 COS0 sin 0 0 Rx (0) = 0 — sin 0 cos 0 0 .0 0 0 1. (7.39)
Геометрические преобразования 303 Матрица поворота вокруг оси у записывается в виде COS0 0 sin 0 О W) = О —sin 0 О" 1 О О О cos 0 О О 0 1 (7.40) Столбцы (и строки) верхней левой подматрицы размером 3X3 мат- риц /?z(0), /?х(0) и Ry(&) представляют собой взаимно ортогональ- ные единичные векторы, интерпретация которых такая же, что и в двумерном случае. Все эти матрицы преобразований имеют обратные матрицы. Матрица, обратная Т, получается подстановкой знака минус перед Dx, Dy и Dz\ обратная S — заменой Sx, Sy и Sz на обратные им значения, а для каждой из трех матриц поворота — выбором отри- цательного угла поворота. Результатом произвольной последовательности поворотов вокруг осей х, у и z является матрица А, имеющая вид ri2 ri3 О’ А = Gt Г 23 0 r,t Г 2 2 гзз 0 _ 0 0 0 1. (7.41) Подматрицу поворота размером 3x3 называют ортогональной, поскольку ее столбцы являются взаимно ортогональными единич- ными векторами. При повороте, задаваемом матрицей, эти единичные векторы совмещаются с осями х, у и г. Иногда возникает необходи- мость определить матрицу поворота, соответствующую таким на- правлениям. Матрицы поворота сохраняют длину и углы, а матрицы масштабирования и переноса не сохраняют. Для любой ортогональной матрицы В обратная матрица совпа- дает с транспонированной: В~1~ВТ. Этот результат является полезным, поскольку, вычислять матрицу, обратную матрице по- ворота, приводится часто. В действительности для получения транс- понированной матрицы не требуются даже взаимные пересылки между элементами массива, описывающего матрицу. Необходимо только при выборе элементов массива поменять местами индексы строк и столбцов. Отметим, что этот метод определения обратной матрицы дает тот же результат, что и способ обращения Rx, Ry, Rz, основанный на подстановке знака минус перед углом 0. Можно перемножить произвольное число матриц поворота, мас- штабирования и переноса. Результат всегда будет иметь вид Гц '12 Гц 0’ Г 22 ^29 0 rsi Г22 33 0 tX 4 t, 1 (7.42)
Верхняя левая подматрица /? размером 3X3 (как прежде пом матрица размером 2x2) будет описывать суммарные поворот и мао| штабирование, в то время как подматрица Т будет задавать после! дующий совокупный перенос. С точки зрения быстродействия про! ведения вычислений выгоднее выполнять преобразования явно» [*' у' г'] = [х у г] -R + T, (7.43>1 где R и Т — подматрицы матрицы (7.42). 7.6. КОМПОЗИЦИЯ ТРЕХМЕРНЫХ ПРЕОБРАЗОВАНИЙ Путем объединения элементарных трехмерных преобразований можно получить другие преобразования. В этом разделе показано, как это сделать (чтобы полученный результат мог быть использован в разд. 8.4). Задача состоит в том, чтобы преобразовать отрезки PiPt и РтРз (рис. 7.12) из начальной позиции в конечную. Точка Pf переносится в начало координат, РгРа располагается вдоль отрица- тельной полуоси z, a PiP3 помещается в плоскости уг в той ее поло- вине, где ось у положительна. На длины отрезков преобразование не воздействует. Как и прежде, разобьем сложную задачу на более простые. В данном случае преобразование можно выполнить за четыре шага: 1. Перенос точки F\ в начало координат. 2. Поворот вокруг оси у до совмещения РгР2 с плоскостью уг. 3. Поворот вокруг оси х до совмещения РгРг с отрицательной полуосью г. ____ 4. Поворот вокруг оси г до совмещения Р^Р* с плоскостью уг. Шаг 1. Перенос 1\ в начало координат: Т(—хъ — yit —гг) ' 1 О О О' О 1 0 0 0 0 10 Xi.—yt— Zt 1. (7.44) Применение Т к Р2 и Ря дает P'^PvT(-x., -У1, -21) = [0 0 0 1], (7.45) Р2 = Ра'7'( xlt уи zt) = [х2 х, у2 z/j z2—Z] 1], (7.46) Рз — Рз'Р( ylt 2’1) = [x3 X] ya yt za Zj 1]. (7.47) Шаг 2. Поворот вокруг оси у. На рис. 7.13 показаны отрезки Р^Рз после шага 1 и проекция РгРз на плоскость хг. Поворот производит-
Геометрические преобразования 305 ся на положительный угол 0, для которого cos 0 = ~ (гГ~г1) , (7.48) и1 sin © = -£- = (7.49) и1 где =|/(г2—г,)24-(%2—xt)2. (7.50) Подставим эти выражения в выражения (7.40). Тогда Л2 = Р.:./?у(0) = [о (7.51) Как и ожидалось, х-компонента Р2 равна нулю. Шаг 3. Поворот вокруг оси х. На рис. 7.14 показан отрезок Р^2 у Рис. 7.13. Поворот вокруг оси г/; про- екция Р'Р'поворачивается до совме- щения с отрицательной полуосью г. Рис. 7.14. Поворот вокруг оси х', поворачивается до совмеще- ния с отрицательной полуосью г. после шага 2. Поворот производится на отрицательный угол ср, для которого cos(—ср) — cos ср = г— , (7.52) РЛ11 sin (— ср) = — sin ср = Z_g. -, (7.53) где IIЛЛК U2-xt)2 + (У2-У1у + (z2—Zj)2. (7.54) Запись ||Р1Рг|| обозначает длину PiP2. Результатом поворота на шаге 3 является Р2" = P2.Rx((p) = P'2-Ry (Q)-Rx (ср) = _________ =Р2-Т.7?//(0)-/?х(ср)=[О 0 -pAII И. (7-55) т. е. Р^Р2 теперь совпадает с отрицательной полуосью г.
306 Глава 7 Шаг 4. Поворот вокруг оси г. На рис. 7.15 показаны Р^Р2 и PiPa после шага 3, когда Р2" лежит на отрицательной полуоси г, а Ра" — в точке Рз" = [хГ' У'3" г3г' 1] = Р8-Т(—— t/j, — Zt)-Ry(9)-Rx(<p). (7-56) Поворот производится на положительный угол а, для которого cos а=г/з'72)а, sin af=x3"/D2, (xTT+G/s'T- Шаг 4 является последним шагом, после которого получается ко- нечный результат, показанный на рис. 7.12. Результирующая матрица Т(—хг, — ylt — zJ-Ry($)-Rx(<p)-Rz(a)~T-R (7.57) описывает искомое преобразование, где R=Ry(9)-Rx(<p)-Rz (а). Проверку того, что точка переводится в начало координат, точка Р2 помещается на отрицательную полуось г, а точка Ра переносится в положительную по у половину плоскости yz путем применения этого преобразования к Pit Р2 и Р3, предоставляем читателю в ка- честве упражнения. Рис. 7.15. Поворот вокруг оси г; проекция р^'р^7 по_ ворачивается до совмещения с осью у. Рис. 7.16. Точка Р и четыре сшлемы координат. Для получения матрицы R можно воспользоваться также более простым с вычислительной точки зрения способом, основанным на свойствах ортогональных матриц, рассмотренных в разд. 7.5. Пусть G = • (7-58) И *1' 2 Л Это единичный направляющий вектор отрезка Р^Р2, который будет поворачиваться до совмещения с положительной полуосью г. Кроме того, ____ '.-Ь, г,.]- , <7.59)
Геометрические преобразования 307 Этот единичный вектор перпендикулярен плоскости, определяемой точками Рг, Р3 и Р3. Он будет поворачиваться до совмещения с по- ложительной полуосью х. И наконец, вектор ry—[r1(y r2lj r3l/] = ~rzXrx будет поворачиваться до совмещения с положительной полуосью у. Тогда результирующая матрица записывается в виде Т(— Xlt — уи -zj- >1* rix ?ЗХ г1у Г2У Гзу Пг Г3г Гзг О’ 0 0 = T-R, (7.60) _ 0 0 0 1. где Т иР такие же, как и в уравнении (7.57). 7.7. ПРЕОБРАЗОВАНИЕ КАК ИЗМЕНЕНИЕ СИСТЕМ КООРДИНАТ Мы рассматриваем преобразование множества точек, принадле- жащих объекту, в некоторое другое множество точек, причем оба этих множества описаны в одной и той же системе координат. Таким образом, система координат остается неизменной, а сам объект преобразуется относительно начала координат до получения желае- мого размера. Другим эквивалентным способом описания преобра- зования является смена систем координат. Такой подход оказывается полезным, когда желательно собрать вместе много объектов, каждый из которых описан в своей собственной локальной системе коорди- нат, и выразить их координаты в одной глобальной системе коорди- нат. Но прежде убедимся, что положение точки, заданной в одной системе координат, можно описать в любой другой системе коорди- нат. Например, точка на рис. 7.16 имеет, собственно, координаты (10, 8), (6, 6), (8, 6) и (4, 2) в системах координат 1—4. Преобразование из системы координат 1 в систему 2 есть Д12== ^Т(—4,—2); из 2 в 3 — 7,аз=7’(—2, —3)-S(2, 2); из Зв 4 — ?34 = =Т(—6,7, —1,8)-/?(—45°). В общем случае преобразование До- переводит оси системы координат / в оси системы координат i от- носительно системы координат I. Если Pi представляет точку, координаты которой заданы в систе- ме координат i, то можно записать Pz~PiTV2. В рассматриваемом случае [6 6 11=[10 8 !]•?(—4, —2). Преобразование Т21 из системы координат 2 в систему 1 имеет, безусловно, вид Т721=Т(4, 2). Аналогично Д82 = Д-31 = (Д(— 2, — 3)-S(2, 2))"1 = S-1(2, 2, — 3) = = S(0.5, 0.5)-Г(2, 3). Более того, Tls=7\2-T33 и т. д. Следовательно, Т13^=Т(—6,—5)- S(2, 2). При составлении из объектов некоторого объекта более высокого
3 308 Глава 7 Преобразование мировых коорЭинат а Система коарЭинат Символа - стула Смена преобразования коорЭинат ------► Мировая система коорбинат 5 Мировая система координат Рис. 7.17. Три способа изменения систем координат. а — преобразование из мировых координат в мировые координаты; б — преобразование си« стемы координат символа в мировую систему; в — преобразование систем координат с помо- щью определения новой мировой системы координат относительно системы координарр сим- вола. уровня, как в случае символов предметов мебели в гл. 2, преобра- зование можно представить одним из двух способов. В гл. 2 мы счи- тали, что символы определены в мировых координатах, и с помощью преобразований приводили их к новым позициям и ориентациям в той же мировой системе координат (рис. 7.17, а). В более общем случае размещение символов можно рассматривать как переход от точек, заданных в локальной системе координат символа, к соот- ветствующим позициям в системе координат, связанной с комнатой (т е. в мировых координатах), путем преобразования системы коор- динат символа в мировую систему координат (рис. 7.17, б). Отметим,
Геометрические преобразования 309 что более строго новая система координат, связанная с комнатой, определяется относительно старой системы координат символа, по- казанной на рис. 7.17, в, хотя мы, конечно, считаем при этом, что всегда имели дело с системой координат, связанной с комнатой, и размещаем последующие системы координат символа относительно нее. Оба этих подхода приводят, разумеется, к одинаковым резуль- татам. Координаты точек символа, выраженные в системе координат КОМНаТЫ (мирОВОи), есть ^комната' ^стул-Лтул, комната, ГДе Тстул, комната описывает преобразование, которое переводит ко- ординатные оси стула в оси мировой системы координат: R (45°)- Т (4, 10). В этом можно убедиться, обратившись к рис. 7.17, б. Неудиви- тельно, что преобразование 7'стуЛ1 коината такое же, как и то, ко- торое отображает первоначальные мировые координаты символа в преобразованные мировые координаты на рис. 7.17, а. Первый подход, т. е. описание всех объектов (символов) в миро- вой системе координат и последующее размещение их в желаемом месте, приводит до некоторой степени к нереалистичному изображе- нию всех символов, первоначально заданных один поверх другого в одной и той же мировой системе координат. Более естественно полагать, что каждый символ задан в своей собственной системе координат и затем промасштабирован, повернут и перенесен путем преобразования координат в новую мировую систему координат. Второй подход легко представить себе как сжатие или растяжение, поворот и позиционирование на мировой координатной плоскости отдельных листков бумаги, на каждом из которых изображен символ (или наоборот, сжатие или растяжение, поворот и перемещение плос- кости относительно каждого из листков бумаги). С математической точки зрения оба подхода идентичны. Подход, основанный на изменении систем координат, удобен в тех случаях, когда задается дополнительная информация для
310 Глава 7 подобъектов в их локальных системах координат. Например, если к переднему колесу трехколесного велосипеда (рис. 7.18) приложить крутящий момент, то все его колеса повернутся. Нам необходимо определить, насколько велосипед переместится в пространстве как единое целое. Эта задача более сложная, чем та, которая связана с размещением символов, поскольку здесь требуется несколько по- следовательных изменений систем координат. В начальный момент системы координат велосипеда и его переднего колеса заданы отно- сительно мировой системы координат. При движении велосипеда, вперед переднее колесо поворачивается вокруг оси г системы коор- динат колеса, и одновременно системы координат колеса и велоси- педа перемещаются относительно мировой системы координат. Сис- темы координат колеса и велосипеда связаны с мировой системой координат с помощью зависящих от времени переносов вдоль осей х и у и поворота вокруг оси у. Координатные системы велоси- педа и колеса между собой связаны с помощью зависящего от вре- мени поворота вокруг оси у, вызываемого поворотом руля. (Систе- ма координат велосипеда связана с рамой велосипеда, а не с ру- лем.) Для упрощения задачи будем считать, что координатные оси колеса и велосипеда параллельны осям мировой системы координат и что колесо перемещается прямолинейно вдоль оси х мировой коор- динатной системы. Если колесо поворачивается на угол а, точка на колесе (обозначим ее через Ркол) поворачивается на расстояние аг, где г — радиус колеса. Так как колесо едет по земле, велосипед перемещается вперед на аг единиц. Поэтому точка на ободе колеса Ркол смещается и поворачивается относительно исходной системы координат колеса на величины аг и а соответственно, так что ее новые координаты в этой системе координат будут Р^Ркол-РЛ^-Т(аг, 0, 0), (7.61) или в новой (перенесенной) системе координат колеса ^кол' = ^кол-^г(а)- (7.62) Для того чтобы найти значения координат точек Рмир и Р^ир в мировой системе координат, преобразуем их из системы коорди- нат колеса в мировую: ^мир Ркоп ' ^кол. мир = Ркол ' ^кол, вел ’ ^вел, мир- (7.63) В данном случае ТК0Л1 вел и Твел,М110 представляют собой простые переносы, задаваемые начальными положениями велосипеда и колеса. Р'мир вычисляется с помощью уравнений (7.61) и (7.63): Рмар — Ркол’ТКОЛ: мир = Ejjo, •(а) • Т (аг, 0,-0)-7’КОЛ1 мир. (7.64) Кроме того, нам известно, что Ткол> мир преобразуется в Ткол,у мир путем переноса системы координат колеса, поэтому перепишем (7.64)
Геометрические преобразования 311 в виде Т'мир = ^КОЛ' •Т’кол', мир = (Т’кол Rz (а)) ’(^ (art 0) < 71КоЛ1 МИр) (7,65) Таким образом, мы выражаем новые значения Ткол,1МЯр и TKon,t вел, через их предыдущие значения путем применения соответствующих преобразований, основанных на уравнениях движения частей трех- колесного велосипеда, и затем применяем эти измененные преобра- зования к скорректированным точкам в локальных системах коор- динат, в результате чего получаем соответствующие точки в мировой системе координат. Оставляем читателю в качестве упражнения исследование случая поворота переднего колеса трехколесного ве- лосипеда для изменения направления углов поворота задних колес и зависимости от их радиусов и траектории велосипеда. УПРАЖНЕНИЯ 7.1. Докажите, что отрезок можно преобразовать путем применения преоб- разования к его конечным точкам и проведения нового отрезка между получив- шимися в результате конечными точками. 7.2. Докажите, что два последовательных двумерных поворота аддитивны: * Л(01)-2?(02)=^(01+02). 7.3. Докажите, что двумерные поворот и масштабирование коммутативны, если Sx=Sy. Покажите, что в противном случае они не коммутируют. 7.4. Получите выражение, связывающее суммарную ошибку в уравнении (7.33) с 0 и числом выполняемых пошаговых поворотов. Проделайте то же самое для уравнения (7.34). 7.5. Для доступной вам мини-ЭВМ напишите программу, которая выполняла бы пошаговые двумерные повороты. Какое время требуется на каждую конечную точку? Сравните его с временем, необходимым для обработки бдной конечной точ- ки в случае абсолютного двумерного поворота. 7.6. Пусть имеется рисунок, состоящий из N конечных точек. Требуется по- следовательно поворачивать его вокруг некоторой оси программным способом. В вашей ЭВМ затрачивается время tm на умножение и ta на сложение. Найдите время, которое необходимо для поворота N точек (можно использовать как абсо- лютный, так и относительный повороты). При эюм не учитывайте управляющих шагов. Затем оцените полученные выражения, считая N переменной и подставляя реальные времена выполнения команд вашей ЭВМ. Пусть самая низкая скорость, с которой может поворачиваться объект (чтобы это не было раздражающе медленно), равна 360° за 30 с. Предположим также, что для достижения эффекта непрерывности поворот выполняется шагом не более 4°. Сколько точек удастся повернуть за имеющийся интервал времени, если исполь- зуется абсолютный поворот? Пошаговый поворот? 7.7. Примените преобразования, рассмотренные в разд. 7.6, к точкам Рь Рг и Р3 и убедитесь, что точки преобразуются так, как предполагалось. _ 7.8. Переработайте разд. 7.6 в предположении, что НЛ^гН— 1 и 1 > а также, что заданы направляющие косинусы для P-iP., и РуРч (направляющими косинусами прямой называются углы, которые прямая составляет с осями х, у и г). Для отрезка, соединяющего начало координат с точкой (х, у, г), направляю- щие косинусы равны (x/d, у/d, z/d), где d — длина отрезка. 7.9. Еще одна причина, по которой удобно использовать однородные коорди- наты, состоит в том, что точки трехмерного пространства, находящиеся в декарто- вой системе координат в бесконечности, можно непосредственно представить в однородных координатах. Почему?
312 Глава 7 7.10. Покажите, что уравнения (7.57) и (7.60) эквивалентны. Я 7.11. Пусть задан единичный куб, один угол которого находится в точке I (0,0,0), а противоположный ему — в точке (1, 1, 1). Найдите преобразования,! необходимые для поворота куба на 0 градусов вокруг главной диагонали (соеди- | няющей точки (0, 0, 0) и (1, 1, 1) в направлении против часовой стрелки, если | смотреть вдоль диагонали на начало координат). •' 7.12. Пусть окно может быть повернуто на угол 0 относительно оси х, как в системе Core [203]. Как при этом отобразится окно в поле вывода? Проверьте ваш ответ путем применения преобразования к каждой из угловых точек окна, чтобы быть уверенным, что онн отображаются в соответствующие угловые точки поля вывода. 7.13. Пусть задан отрезок, соединяющий начало правосторонней системы координат с точкой Р (х, у, г). Совместите этот отрезок с помощью поворотов с по- ложительной полуосью z тремя различными способами и покажите алгебраически, что все результаты эквивалентны: а) поворот вокруг оси х до совмещения с плоскостью yz, затем поворот вокруг оси у до совмещения с осью г; б) поворот вокруг оси у до совмещения с плоскостью хг, затем поворот во- круг оси х до совмещения с осью г; в) поворот вокруг оси z до совмещения с плоскостью хг, затем вокруг осн у до совмещения с осью г. Для каждого из способов вычислите синусы и косинусы углов поворота. 7.14. Некоторый объект необходимо промасштабировать с коэффициентом 5 в направлении, задаваемом направляющими косинусами (а, 0, 6). Найдите мат- рицу преобразования. 7.15. Покажите, что матрица R (0) действительно обладает свойствами, при- веденными в конце разд. 7.2. 7.16. Распространите пошаговый поворот, рассмотренный в разд. 7.4 для случая трех измерений, на сложную операцию поворота вокруг произвольной оси.
Глава 8 Изображение трехмерных объектов Процесс вывода трехмерной графической информации по суще- ству более сложный, чем соответствующий двумерный процесс. В двумерном случае просто задаются окно в двумерном мировом координатном пространстве и поле вывода на двумерной видовой поверхности. В общем случае объекты, описанные в мировых коор- динатах, отсекаются по границе видимого объема, а после этого преобразуются в поле вывода для дисплея. Сложность, характерная Нормированные коорв ина m ы Усеченнь!? мировые Преобразование в поле вывода, заданное в нормированных координатах Преобразование в физические координаты Рис. 8.1. Концептуальная модель процесса -вывода трехмерной графической информации. для трехмерного случая, возникает потому, что видовая поверхность не имеет графического третьего измерения. Несоответствие между пространственными объектами и плос- кими изображениями устраняется путем введения проекций, кото- рые отображают трехмерные объекты на двумерной проекционной картинной плоскости. Значительная часть этой главы посвящена проекциям: их характеристикам, математическим способам описа- ния, а также тому, как они используются и определяются в ПГП и в системе Соте. В процессе вывода трехмерной графической информации мы задаем видимый объем в мировом пространстве, проекцию на кар- тинную плоскость и поле вывода на видовой поверхности. В общем случае объекты, определенные в трехмерном мировом пространстве, отсекаются по границам трехмерного видимого объема и после этого проецируются. То, что попадает в пределы окна, которое само яв- ляется проекцией видимого объема на картинную плоскость, затем преобразуется (отображается) в поле вывода и отображается на графическом устройстве. На рис. 8.1 показана концептуальная модель вывода трехмерной графической информации, которая во-
314 Глава 8 площается для пользователя в многочисленных пакетах графических подпрограмм, оперирующих с трехмерными объектами. Как и в двумерном случае, для каждой конкретной реализации процесса вывода может быть использовано множество моделей. Один из под- ходов к реализации описан в разд. 8.4. 8.1. ПРОЕКЦИИ В общем случае проекции преобразуют точки, заданные в системе координат размерностью п, в точки системы координат размер- ностью, меньшей, чем п. В рассматриваемом случае с помощью прое- цирования три измерения отображаются в два. Проекция трех- мерного объекта (представленного в виде совокупности точек) стро- ится при помощи прямых проецирующих лучей, которые называются Рис. 8.2. Отрезок АВ и его центральная проекция А'В'. Рис. 8.3. Отрезок АВ и его параллельная проекция А 'В'. Проекторы АА' и ВВ. параллельны. проекторами и которые выходят из центра проекции, проходят через каждую точку объекта и, пересекая картинную плоскость, образуют проекцию. На рис. 8.2 и 8.3 показаны две различные проекции одного и того же отрезка, а также проекторы, проходящие через его конечные точки. К счастью, проекция отрезка сама яв- ляется отрезком, так что достаточно спроецировать одни лишь ко- нечные точки. Определенный таким образом класс проекций известен под на- званием плоских геометрических проекций, поскольку проецирова- ние в этом случае производится на плоскость, а не на искривлен- ную поверхность и в качестве проекторов используются прямые, а не кривые линии. В отличие от них многие картографические про-
Изображение трехмерных объектов 315 екции, как показано в работе [390], являются либо неплоскими, либо негеометрическими. Плоские геометрические проекции, которые в дальнейшем будем называть просто проекциями, можно подразделить на два основных класса: центральные и параллельные. Различие между ними опре- деляется соотношением между центром проекции и проекционной плоскостью. Если расстояние между ними конечно, то проекция будет центральной, если же оно бесконечно, то проекция будет па- раллельной. Оба этих случая проиллюстрированы на рис. 8.2 и 8.3. Параллельные проекции названы так потому, что центр проек- ции бесконечно удален и все проекторы параллельны. При описа- нии центральной проекции мы явно задаем ее центр проекции, в то время как определяя параллельную проекцию, мы указываем на- правление проецирования. Центральная проекция порождает визуальный эффект, анало- гичный тому, к которому приводят фотографические системы или зрительная система человека, и поэтому используется в случаях, когда желательно достичь определенной степени реальности. Этот эф- фект известен как перспективное укорачивание: размер центральной проекции объекта изменяется обратно пропорционально расстоянию от центра проекции до объекта. Это означает, что, хотя центральная проекция объектов является реалистичной, она оказывается не- пригодной для представления точной формы и размеров объектов: из проекции нельзя получить информацию о расстояниях; углы сохраняются только на тех гранях объекта, которые параллельны проекционной плоскости; проекции параллельных линий в общем случае не параллельны. Параллельная проекция порождает менее реалистичное изобра- жение, поскольку отсутствует перспективное укорачивание, хотя при этом могут иметь место различные постоянные укорачивания вдоль каждой из осей. Проекция фиксирует истинные размеры (с точностью до скалярного множителя), и параллельные прямые остаются параллельными. Как и в случае центральной проекции, углы сохраняются только на тех гранях объекта, которые парал- лельны проекционной плоскости. Чертежнику легче изображать параллельные проекции, чем центральные, однако что проще в слу- чае машинной графики — неясно. Различные типы центральных и параллельных проекций под- робно рассмотрены и проиллюстрированы в статье Карлбом и Па- сиорека [75]. В двух следующих подразделениях приведены основ- ные определения и характеристики наиболее распространенных проекций. В разд. 8.2 дано математическое описание проекций. 8.1.1. Центральные проекции Центральные проекции любой совокупности параллельных пря- мых, которые не параллельны проекционной плоскости, будут сходиться в точке схода. Параллельные прямые в трехмерном про-
31'6 Глава 8 Точка схова Рис. 8.4. Одноточечные центральные проекции куба на плоскость, пересекающую ось г, а также точка схода прямых, перпендикулярных проекционной плоскости. странстве пересекаются лишь в бесконечности, поэтому точку схода можно представить себе как проекцию точки, находящейся в бес- конечности. Существует, разумеется, бесконечное число точек схода. Если совокупность прямых параллельна одной из главных коор- динатных осей, то их точка схода называется главной точкой схода. Имеются только три такие точки,соответствующие пересечениям главных координатных осей с про- екционной плоскостью. Например, если проекционная плоскость пе- ресекает одну только ось г (и, сле- довательно, перпендикулярна ей), то лишь на этой оси будет лежать главная точка схода, поскольку прямые, параллельные как у-, так и х-осям, параллельны также и проекционной плоскости и поэтому не имеют точки схода. Центральные проекции клас- сифицируются в зависимости от числа главных точек схода, кото- рыми они обладают, а следователь- но, и от числа координатных осей, которые пересекает проекционная плоскость. На рис. 8.4 приведе- ны две различные одноточечные - одноточечные проекции, поскольку Рис. 8.5. Построение одноточечной центральной проекции куба на пло- скость, пересекающую ось г. Нор- маль к проекционной плоскости параллельна оси г. (Заимствовано из работы [75]. Печатается с разре- шения Association for Computing Machinery, Inc.) проекции куба. Ясно, что это прямые параллельные осям х и у, не сходятся, а сходятся только линии, параллельные оси г. На рис. 8.5 показан процесс построения одноточечной центральной проекции, некоторые из ее проекторов, а также проекционная плоскость, пересекающая одну лишь ось г. Процесс построения двухточечной центральной проекции иллю- стрируется рис. 8.6. Отметим, что прямые, параллельные оси у, в этой проекции не сходятся.
Изображение трехмерных объектов 317 V Рис. 8.6. Двухточечная центральная проекция куба. Проекционная плоскость пересекает оси х и г. Двухточечная центральная проекция широко применяется в ар- хитектурном, инженерном и промышленном проектировании и в рекламных изображениях, в которых вертикальные прямые про- ецируются как параллельные и, следовательно, не сходятся. Трех- точечные центральные проекции почти совсем не используются, во-первых, потому, что их трудно конструировать, а во-вторых, из-за того, что они добавляют мало нового с точки зрения реали- стичности п<> сравнению с двухточечной проекцией. 8.1.2. Параллельные проекции Параллельные проекции разделяются на два типа в зависи- мости от соотношения между направлением проецирования и нор- малью к проекционной плоскости. В ортографических параллель- ных проекциях эти направления совпадают, а в косоугольных па- раллельных проекциях они не совпадают. То есть в ортографических проекциях направление проецирования является нормалью к про- екционной плоскости. Наиболее широко используемыми видами ортографических про- екций являются вид спереди, вид сверху (план) и вид сбоку, в которых
318 Глава 8 Проекционная плоскость (виЭ сверху) Рис. 8.7. Построение трех ортографических проекций. картинная плоскость перпендикулярна главным координатным осям, совпадающим вследствие этого с направлением проецирова- ния. На рис. 8.7 показан процесс построения каждой из этих трех проекций, которые часто применяются в инженерной графике для описания машиностроительных деталей, агрегатов и сооружений, так как по ним можно измерять расстояния и углы. Поскольку каждая проекция отображает лишь одну сторону объекта, часто совсем непросто представить себе пространственную структуру проецируемого объекта, даже если рассматривать сразу несколько проекций одного и того же объекта. В случае аксонометрических ортографических проекций исполь- зуются проекционные плоскости, не перпендикулярные главным координатным осям, поэтому на них изображаются сразу несколько сторон объекта, так же как и при центральном проецировании, однако в аксонометрии укорачивание постоянно, тогда как в случае центральной проекции оно связано с расстоянием от центра проек- ции. При аксонометрическом проецировании сохраняется параллель- ность прямых, а углы изменяются; расстояния же можно измерить вдоль каждой из главных координатных осей (в общем случае с раз- личными масштабными коэффициентами). Широко используемым видом аксонометрической проекции яв- ляется изометрическая проекция. В этом случае нормаль к про- екционной плоскости (а следовательно, и направление проецирова- ния) составляет равные углы с каждой из главных координатных осей. Если нормаль к проекционной плоскости имеет координаты (а, Ь, с), то потребуем, чтобы |а| = |6|=|с| или ±а=±6=±с. Имеются ровно восемь направлений (по одному в каждом из октан- тов), которые удовлетворяют этому условию, однако существуют
Изображение трехмерных объектов 319 к проекционной плоскости Рис. 8.8. Построение изометрической проекции единичного куба. (Заимство- вано из работы [75]. Печатается с раз- решения Association for Computing Machinery, Inc.) лишь четыре различные изометрические проекции (если не рассмат- ривать удаление скрытых линий), поскольку векторы (а, а, а) и (—а, —а, —а) определяют нор- мали к одной и той же проекци- онной плоскости. Единичными нормалями этих направлений являются векторы (а, а, а), (—а, а, а), и (а, —а, а). На рис. 8.8 показан процесс пост- роения изометрической проек- ции с направлением (1, —1, 1.) Изометрическая проекция об- ладает следующим свойством: все три главные координатные оси одинаково укорачиваются. По- этому можно проводить измере- ния вдоль направления осей с одним и тем же масштабом (от- сюда название: азо, что означает «равно», и метрия — «измере- ние»). Кроме того, главные координатные оси проецируются так, что их проекции составляют равные углы друг с другом (рис. 8.9). Косоугольные проекции (второй тип параллельных проекций) сочетают в себе свойства ортографических проекций (видов спереди, сверху и сбоку) со свойствами аксонометрии. В этом случае проек- ционная плоскость перпендикулярна главной координатной оси, поэтому сторона объекта, параллельная этой плоскости, проециру- ется так, что можно измерять углы и расстояния. Проецирование других сторон объекта также допускает проведение линейных измерений (но не угловых) вдоль главных осей. Благодаря этим свойствам, а также простоте построения косоугольные проекции широко (хотя и не слишком) используются в этой книге. На рис. 8.10 показан процесс построения косоугольной проекции. Отметим, что нормаль к проекционной плоскости и направление проецирования не совпадают. Двумя важными видами косоугольных проекций являются про- екции кавалье (cavalier) и кабине (cabinet) п. В проекции кавалье направление проецирования составляет с плоскостью угол 45°. В результате проекция отрезка, перпендикулярного проекционной плоскости, имеет ту же длину, что и сам отрезок, т. е. укорачивание отсутствует. На рис. 8.11 приведено несколько проекций кавалье единичного куба на плоскость ху. Здесь уходящие вглубь линии *> Следуя авторам, мы сохранили американские названия этих проекций. В отечественной литературе употребляются названия: горизонтальная косоуголь- ная изометрия (военная перспектива)для проекции кавалье и фронтальная косо- угольная диметрия (кабинетная проекция) для проекции кабине.— ПриЯн. ред.
320 Ггава 8 Рис. 8.9. Изометрическая проек- ция единичных векторов. Рис. 8.10. Построение косоугольной про- екции. (Заимствовано из работы [75]. Печатается с разрешения Association for Computing Machinery, Inc.) Рис. 8.11. Проекция кавалье единичного куба на плоскость г=0. Рис. 8.12. Проекция кабине единичного куба на плоскость г=0. являются проекциями тех ребер куба, которые перпендикулярны плоскости ху\ они расположены под углом а к горизонтали. Этот угол обычно составляет 30 или 45°. Проекция кабине, показанная на рис. 8.12, имеет направление
Изображение трехмерных объектов 321 проецирования, которое составляет с проекционной плоскостью угол arcctg (1/2). При'этом отрезки, перпендикулярные проекционной плоскости, после проецирования составляют 1/2 их действительной длины. Проекции кабине являются более реалистичными, чем проекции кавалье, поскольку укорачивание с коэффициентом 1/2 больше согласуется с нашим визуальным опытом. В следующем разделе мы рассмотрим математический аппарат, необходимый для реальных вычислений центральной (одноточечной) и параллельной (ортографической, кабине и кавалье) проекций, а затем в дальнейших разделах включим проекции в графический пакет. 8.2. МАТЕМАТИЧЕСКОЕ ОПИСАНИЕ ПЛОСКИХ ГЕОМЕТРИЧЕСКИХ ПРОЕКЦИЙ Целью раздела является ознакомление с элементарным мате- матическим аппаратом плоских геометрических проекций. Для простоты будем считать, что при центральном проецировании кар- тинная плоскость перпендикулярна оси г и совпадает с плоскостью z=d, а при параллельном совпадает с плоскостью г=0. В следующем разделе мы обсудим случай про- извольных картинных плоскос- тей. Проекции рассматриваются в системе координат наблюдате- ля, которая, как показано в разд. 7„5, является левосторон- ней. Система координат, в ко- торой Ось х направлена вправо, ось у — вверх, а ось г — внутрь экрана, естественно согласуется с экраном дисплея. В следующем разделе приведено преобразо- вание объектов, заданных в пра- восторонней мировой системе ко- ординат, в левостороннюю систе- му координат, связанную с на- блюдателем. Каждую из проекций можно описать матрицей размером 4 X4. Этот способ оказывается удоб- ным, поскольку появляется воз- можность объединить матрицу проецирования с матрицей преобразо- вания, представив в результате две операции (преобразование и проецирование) в виде одной матрицы. В этом разделе мы полу- чим матрицы размером 4X4 для нескольких проекций и прежде всего для центральной. На рис. 8.13 приведены три изображения Раи) Проекционная плоскость Проекционная плоскость Вий сверху иии ииьрлу вдоль оси у Ув Вив сбоку в!оль оси х d Ра,уа) * 4 и Проекционная плоскость Рис. 8.13. Центральная проекция.
322 Глава 8 левосторонней системы координат, в которых точка Р проецируется;! на проекционную плоскость, расположенную на расстоянии cfl от начала координат. Для вычисления координат хр и ур проекции 1 точки (х, у, z) напишем отношения, полученные из подобных треугольников (рис. 8.13): = £ у?=у. (8 1) d г ’ d г • Умножая обе стороны каждого соотношения на d, получим Р г г/d ’ г г/d ' ' ' Расстояние d является в данном случае масштабным множителем, примененным к координатам хр и ур. Фактором, приводящим к то- му, что на центральной проекции более удаленные объекты выглядят мельче, чем ближние, является деление на z Отметим, что допусти- мы все значения г, кроме г=0. Точки могут располагаться как по- зади центра проекции на отрицательной части оси г, так и между центром проекции и проекционной плоскостью. Эти преобразования можно представить в виде матрицы размером 4X4: ’10 0 0 0 10 0 м == 2Г1центр 001 1/d (8.3) .0 0 0 0 Умножая точку P—{xyz\\ на матрицу Мцентр, получим общее выражение для точки в однородных координатах [X Y Z W7]: или [ХУ Z №]= [х уг^\ . (8.5) Теперь, поделив на W (которое равно z/d} для обратного перехода к трем измерениям, имеем [/W V TF = [хр гр П = -Jid d 1]- (8.6) Этот результат является корректным, поскольку содержит преобра- зованную z-координату d, соответствующую положению проекцион- ной плоскости вдоль оси z. При другом представлении центрального проецирования, при-
Изображение трехмерных объектов 323 Рис. 8.14. Другая схема построения центральной проекции. меняемом в некоторых работах, проекционная плоскость совме- щается с плоскостью г—0, а центр проекции располагается в точке г=—d (рис. 8.14). Из подобных треугольников теперь следует *р X d г-j-d ’ Ур _ d у z -j-d ' (8.7) Умножая на d, получаем d-x х d-y У (8.8) Л₽ г+d (z/d)+l ’ z-|-a' (z/d)+l ' Матрица записывается в виде '10 0 0 0 10 0 Л^центр — 0 0 0 1/d (8.9) _0 0 0 1 Эту матрицу можно получить из матрицы Мцент путем переноса центра проекции в начало координат, применения Л1це11Тр и обрат- ного переноса: м;ентр = Т(0, О, т/)-Мцентр-Т(0, О, -d). (8.10) Ортографическое проецирование на плоскость г=0 очевидно. Направление проецирования совпадает с нормалью к плоскости проекции, т. е. в нашем случае с осью г. Таким образом, точка Р имеет координаты: xv = x, У? = У, гр = 0- (8-1!)
324 Глава 8 Эта проекция описывается матрицей я ^орт - '1 о о о о о 1 о о о о о 0‘ о о L (8.12)1 Рассмотрим т,еперь косоугольную проекцию, матрица которой может быть записана исходя из значений а и I (рис. 8.15). На рис. 8.15 изображен единичный Рис. 8.15. Косоугольная параллельная проекция единичного куба. Точка Р' является проекцией точки Р (0, 0, 1). куб, спроецированный на ху-пло- скость. Из рисунка видно, чю проекцией точки Р (0, 0, 1), на- ходящейся на задней стороне единичного куба, является точка Р' (/cosa, Z sin а, 0), принадле- жащая плоскости ху. По опреде- лению это означает, что направ- ление проецирования совпадает с отрезком РР', проходящим через эти две точки (рис. 8.16). Это направление есть Р'—Р== = (/ cos а, / sin а, —1). Направ- ление проецирования составляет угол р с плоскостью ху. Теперь рассмотрим произволь- ную точку х, у, г и определим ее косоугольную проекцию (хр, ур) на плоскость ху На рис. 8 17 показаны два изображения точки и проектор, который параллелен проектору, приведенному на рис. 8.16. Уравнения для х- и у-коор- динат проектора как функций г имеют вид у=тг+Ь. Решая два уравнения относительно хр и ур, отмеченных на рис. 8.17, получаем xp = x-|-z(/cosa), yv~ y-\-z(l sin а). (8.13) Матрица размером 4X4, которая выполняет эти действия и, сле- довательно, описывает косоугольную проекцию, имеет вид о / sina 0 о о 1. (8-14) 0 о о ’ 1 Мкос = , 0 I COSO! о Применение матрицы Мкос приводит к сдвигу и последующему 2 проецированию объекта: плоскости с постоянной координатой| z=Zi переносятся в направлении х на z,Z cos а и в направлении у на! zj sin а и затем проецируются на плоскость z=0. Сдвиг сохраняет 1 параллельность прямых, а также углы и расстояния в плоскостях, j
Изображение трехмерных объектов 325 У Рис. 8.16. Косоугольная параллельная проекция Р' (I cos a, I sin а, 0) точки Р (0, 0, 1). параллельных оси г. Эффект сдвига вдоль оси у читатель может обнаружить, взглянув на рис. 8.31. Для проекции Кавалье 1—\, поэтому угол 0, показанный на рис. 8.16, составляет 45°. Для проекции кабине 1~ 1/2, а 0= = arctg (2)=63,4°. В случае ортографической проекции /=0 и 0=» =90°, поэтому /Иорт есть частный случай /Ммос.
326 Глава 8 8.3. ЗАДАНИЕ ПРОИЗВОЛЬНЫХ ПРОЕКЦИЙ ТРЕХМЕРНЫХ ОБЪЕКТОВ В предыдущем разделе при получении матриц проецированиям предполагалось, что задана левосторонняя система координат,! а проекционная плоскость перпендикулярна оси г (рис. 8.10).| В противоположность этому мировая система координат выбрана | правосторонней (рис. 8.18), и мы хотим изображать объекты, ис- > пользуя произвольные картинные плоскости. Нам желательно также, ‘ чтобы центр проекции (для центральных проекций) или направление проецирования (для параллельных проекций) были произвольными. , Рис. 8.18. Системы координат. а — правосторонняя система; б — левосторонняя система В этом разделе мы опишем основанный на системе Core способ задания произвольной плоской геометрической проекции [2031п. Эту довольно общую возможность вряд ли можно найти во многих других графических пакетах, в которых, как правило, встречаются ограничения либо на типы проекций, либо на расположение проек- ционной плоскости и центра проекции. Подобные ограничения вынуждают прикладных программистов брать на себя ответствен- ность за восполнение недостающей общности. Нам необходимо уметь задавать проекционную плоскость (кото- рую в дальнейшем, следуя работе 12031, будем называть картинной плоскостью (view plane)), видимый объем и окно. Вспомним, что сначала мы проводим отсечение в трехмерном пространстве относи- тельно видимого объема, затем выполняем поецирование на картин- ную плоскость. И наконец, для изображения спроецированных объектов используем преобразование2) окна в поле вывода. Картинная плоскость определяется некоторой точкой на пло- скости, которую будем называть опорной точкой (VRP — view refe- j W Наше изложение согласуется с работой [203] при условии, что картинная , плоскость проходит через опорную точку. То есть мы требуем, чтобы параметр | системы Core view-distance был равен нулю. Математический аппарат для бо- | лее общего случая рассмотрен в работе [322]. Реализация процесса визуализации ] Core на языке APL, основанная на общем случае, описана в работе [174], а реа- 1 лизация уровня 2 (только вывод) на этом же языке изложена в работе [335]. « 2) Применяется также термин отображение окна в поле вывода.
Изображение трехмерных объектов 327 rence point), и нормалью к картинной плоскости (VPN — view plane normal). Картинная плоскость может произвольным образом располагаться относительно проецируемых объектов, заданных в мировых координатах: она может пересекать их, проходить впереди или позади объектов. Рис. 8,19. Система uv на картинной плоскости. Картинная плоскость Рис. 8.20. Окно в координатах uv. Для того чтобы задать окно, нам необходима система координат на картинной плоскости, которую назовем системой координат uv. Началом ее служит опорная точка (VRP). Направление оси v на картинной плоскости определяет вектор вертикали (VUP): проекция VUP на картинную плоскость, параллельная VPN, совпадает с осью v (рис. 8.19). (В некоторых графических пакетах в качестве вектора вертикали используется ось у. Однако это слишком ограничивает возможности и не годится, если нормаль к картинной плоскости параллельна оси у; при этом вектор вертикали становится неопре- деленным). В любом случае направление оси и задается таким обра- зом, чтобы и, v и VPN составили левостороннюю систему коорди- нат. Опорная точка и два направляющих вектора (VPN и VUP) определяются в правосторонней мировой системе координат. Имея на картинной плоскости систему uv, можем теперь задавать минимальные и максимальные значения и и V, определяющие окно (рис. 8.20). Отметим, что окно не обязательно должно быть симмет- ричным относительно опорной точки. Видимый объем частично определяется окном и ограничивает часть мирового пространства, которая будет выделена и спроеци- рована. В случае центральных проекций видимый объем определя- ется также центром проекции. Этот параметр задается в мировых координатах относительно опорной точки. Видимый объем пред- ставляет собой неограниченную в одну сторону пирамиду, вершина которой находится в центре проекции, а боковые стороны проходят через окно1’. На рис. 8.21 и 8.22 показаны два различных видимых О Несмотря на то что наши глаза «вндят» содержимое конусондального видимого объема, пирамида математически более удобна для отсечения и больше соответствует прямоугольным областям вывода.
328 Глава 8 Pric. 8.21. Не ограниченный в одну сторону пирамидальный видимый объем для случая центральной проекции. Рис. 8.22. Не ограниченный в одну сторону пирамидальный видимый объем для случая центральной проекции. объема для случая центральной проекции. Точки, лежащие позади центра проекции, не включаются в видимый объем и, следовательно, они не будут проецироваться. В случае параллельных проекций видимый объем определяется также направлением проецирования. Он представляет собой неог- раниченный параллелепипед, стороны которого параллельны на- правлению проецирования. На рис. 8.23 и 8.24 показаны видимые объемы для параллельных проекций, а также связь между видимыми объемами, картинной плоскостью и окном. В случае ортографиче- ских параллельных проекций (но не косоугольных) боковые сторо- ны видимого объема перпендикулярны картинной плоскости. В некоторых ситуациях может потребоваться сделать видимый объем конечным, для того чтобы ограничить число примитивов вы- вода, проецируемых на картинную плоскость. Это может оказаться необходимым для удаления посторонних объектов, чтобы позволить пользователю сконцешрировать все свое внимание на определенной части мирового пространства. Для центральных проекций имеются и другие причины. Объект, удаленный от центра проекции на очень большое расстояние, будет проецироваться как «пятно» неразличи- мой формы. Перо графопостроителя в этом случае может протереть бумагу, а электронный луч — прожечь люминофор на экране элек- тронно-лучевой трубки Кроме того, объект, находящийся слишком
Изображение трехмерных объектов 329 близко к центру проекции, может выходить за пределы окна на- столько, что изображение будет похоже на не связанные друг с другом случайные отрезки, не объединенные какой-либо структу- рой. Рис. 8.23. Неограниченный параллелепи- пед для случая ортографической парал- лельной проекции. Направление проеци- рования совпадает с VPN. Рис. 8.24. Неограниченный па- раллелепипед для косоуголь- ной параллельной проекции. Направление проецирования не совпадает с VPN. Задняя секущая плоскость Рис. 8.25. Усеченный видимый объем для случая ортографической параллельной проекции. Задняя секущая плоскость F В Рис. 8.26. Усеченный видимый объем для случая косоугольной параллельной проекции Нормаль VPN наклонена относительно направления проецирования н является также нормалью к передней и задней секущим плоскостям.
330 Глава 8 На рис. 8.25—8.27 показано ограничение видимых объемов пуш тем задания передней секущей плоскости и задней секущей плоскости. | Эти плоскости, которые иногда также называются ближней и даль-1 ней плоскостями, определяются расстоянием до передней плоскости | Рис. 8.27. Усеченный видимый объем. (F) и расстоянием до задней плоскости (В) — величинами со зна- ком, отсчитываемыми от опорной точки вдоль VPN, причем положи- тельными считаются расстояния, задаваемые в направлении нор- мали к картинной плоскости. Эти плоскости параллельны картин- ной плоскости; их нормали совпадают с VPN. 8.4. ВЫЧИСЛЕНИЕ ПЛОСКИХ ГЕОМЕТРИЧЕСКИХ ПРОЕКЦИЙ Пусть заданы видимый объем и проекция и мы хотим понять, как в действительности проводится отсечение и выполняется проеци- рование. Из концептуальной модели процесса вывода (рис. 8.1) следует, что отсечение отрезков относительно видимого объема можно произвести, отыскивая прежде всего точки их пересечения с каждой из шести плоскостей, определяющих видимый объем. От- резки, оставшиеся после отсечения, следует спроецировать на кар- тинную плоскость путем вычисления пересечений проекторов, проведенных через их концы, с картинной плоскостью. Точки пе- ресечения находятся как результат решения системы линейных уравнений. Затем координаты преобразуются из трехмерной миро- вой системы координат в двумерные координаты устройства. Для этого процесса необходимо большое число вычислений, повторяе- мых для многих отрезков. К счастью, имеется более эффективный способ, основанный на разделении сложной проблемы на ряд более простых задач. Существуют видимые объемы, относительно которых отсечение проводить легче, чем относительно видимых объемов общего вида
Изображение трехмерных объектов 331 Мировые ВиЗовые морЗинаты координаты Рис. 8.28. Реализация процесса вывода трехмерной графической информации. Нормированные координаты 4 5 (известные алгоритмы рассматриваются в раад. 8.5). Например, для случая параллельной проекции вычисление пересечений отрезка с плоскостями видимого объема, т. е. с шестью плоскостями х = 0, х=1, t/ = 0, у=1, г = 0, г=1, (8.15) требует минимума операций. То же справедливо и в случае цент- ральной проекции,когда видимый объем определяется плоскостями х = г, х = — г, y — z, y — — z, 2 = 2min, 2=1. (8.16) Будем называть такие видимые объемы каноническими. Наша стратегия состоит в том, чтобы найти нормирующие пре- образования Упарал и Л/Центр, переводящие произвольные видимые объемы для параллельной и центральной проекций в соответствую- щие канонические видимые объемы. Отсечение будет осуществлять- ся в видовых координатах и сопровождаться проецированием на плоскость (с использованием матриц из разд. 8.2). Следуя этой стратегии, мы рискуем затратить усилия на преобразование точек, которые впоследствии будут отброшены операцией отсечения, од- нако само отсечение по крайней мере выполняется довольно легко. На рис. 8.28 показаны этапы процесса вывода при использовании такой стратегии. Процесс можно свести к более короткой последо- вательности «преобразование — отсечение — преобразование» путем объединения шагов 3, 4 и 5 в одну матрицу преобразования, чтобы затем использовать в качестве второго преобразования в последова- тельности. В случае центральной проекции разбиение также необ- ходимо для отображения однородных координат обратно в трехмер- ные координаты. Это можно сделать с помощью второго преобразо- вания. В двух следующих подразделах для центральной и параллельной проекций найдены нормирующие преобразования, которые исполь- зуются как шаг 1 в цепочке «преобразование — отсечение — пре- образование» для соответствующего типа проекции. 8.4.1. Параллельная проекция В этом разделе мы выведем для параллельной проекции норми- рующее преобразование Мпарал, предназначенное для отображения точек мирового координатного пространства (х, у, z) в позиции,
332 Глава 8 заданные в видовых координатах (xv, yv, zv). В результате видимым объем преобразуется в единичный куб, описываемый уравнение^! (8.15). Для преобразованных координат проводится отсечение поя каноническому видимому объему, результаты отсечения проеци-1 руются на плоскость zv=0, преобразуются в поле вывода и выводят-! ся на дисплей. 1 Преобразование Мпарал получено для наиболее общего случая, ; т. е. для косоугольной (а не ортографической) параллельной про- екции. Поэтому в Мпарал включено преобразование сдвига, которое позволяет в видовых координатах сделать направление проециро- вания параллельным zv, несмотря на то что в мировом координатном пространстве этот вектор не параллелен VPN. Используя сдвиг, проекцию на плоскость zv=0 можно реализовать путем простой установки zv=0. В случае если параллельная проекция является', ортографической, компоненты сдвига в нормирующем преобразо-; вании становятся равными 1. Преобразование Мпарал состоит из следующих шагов: 1) перенос VRP в начало координат; 2) поворот, при котором VPN совпадает с отрицательной полу- осью г; 3) поворот, при котором проекция VUP на картинную плоскость совпадает с осью у, 4) переход от правосторонних (мировых) к левосторонним (ви- довым) координатам; 5) сдвиг, при котором все грани видимого объема перпендику- лярны осям видовой системы координат; 6) перенос и масштабирование видимого объема для преобразо- вания его в единичный куб. На рис. 8.29а — 8.29ж, созданных с помощью системы BUMPS [207], показано применение шагов преобразования к видимому объему для случая параллельной проекции, а также к контуру дома. На рис. 8.30 изображена параллельная проекция, которая получи- лась бы при отсутствии отсечения по задней плоскости видимого объема. Шаги 1—3 преобразования Мпарал были рассмотрены в разд. 7.6. Для того чтобы воспользоваться результатами разд. 7.6, установим соответствия: Опорная точка: VRP=Pf, ___ Нормаль к картинной плоскости: VPN=PiP2 (направленный отре-. зок от Pi к Р2); ____ Вертикаль: VUP—PiP3 (направленный отрезок от Pi к Р3). Преобразование представляет собой композицию P-Py(0)-Rx(<p)-Rz(a) — T-R, (8-17) где R — величина, вычисленная в разд. 7.6.
Изображение трехмерных объектов 333 Рис. 8.29а. Ситуация до начала построения изображения. Задана правосторонняя мировая система координат. VUP' является проекцией VUP на картинную пло- скость (на рис. 8.296 — 8.29ж изображается только VUP). VRP лежит в начале VUP и VPN. Отметим, что нормаль (VPN) не параллельна боковым ребрам види- мого объема (направлению проецирования). Для большей наглядности дом не помещен внутрь видимого объема (в действительности после отсечения он будет полностью невидим). Рис. 8.296. Опорная точка перенесена в начало координат, а вместе с ней пере- несены VUP', VPN и видимый объем. Это соответствует шагу 1 преобразования М1араЛ- Рис. 8.29в. Поворот вокруг оси у, а за- тем вокруг оси х, в результате чего VPN совпадает с отрицательным направлением оси г, что соответствует шагу 2 преобразо- вания А'ларад.
334 Глава 8 Рис. 8.29г. Поворот вокруг оси г, в ре- зультате чего VUP' совпадает с осью у. Это соответствует шагу 3 преобразования Амарал- VPN при этом остается на отри- цательной полуоси г. Рис. 29е. Масштабирование и пере- вес, в результате чего VRP совпада- ет с вершиной видимого объема, ко- торый является теперь канониче- ским видимым объемом, т. е еди- ничным кубом. Это соответствует шагу 6 преобразования Мпарал. Рис. 8.29д. Переход к левосторонней сис- теме видовых координат и сдвиг. Ребра видимого объема теперь параллельны глав- ным координатным осям, a VPN совпадает с осью z. Это шаги 4 и 5 преобразования А^парад. Рис. 8.29ж. Дом и видимый объем, если смотреть в направлении, совпа- дающем с положительным направле- нием оси г. Построено после шага 6 преобразования А?парал- Рис. 8.30. Окончательное изобра- жение дома в предположении, что отсечение не проводилось.
Изображение трехмерных объектов 335 Рис. 8.31. Параллелограмм (а) с помощью преобразования сдвига преобразуется в прямоугольник (б); нормаль (VPN) остается неизменной, потому что она парал- лельна оси г. Четвертый шаг преобразования Мпарал состоит в переходе от правосторонней системы координат к левосторонней. Из рис. 8 18 видно, что если направление оси г изменить на противоположное, то получится левосторонняя система. Это выполняется с помощью матрицы ”10 00” 0 1 0 0 0 0—10 .0 0 01. (8 18) На пятом шаге производится сдвиг видимого объема вдоль оси z, в результат чего все его грани становятся перпендикулярными одной из осей системы координат Матрица сдвига вдоль оси г имеет вид •5Яг(а„ М = 0 «1 0 0 1 bi 0 0 0” 0 0 1 0 0 1. (8.19) В рассматриваемом случае необходимо ления проецирования после применения /?у(9)./?х(ф)-/?г(а).Т, сдвинуть вектор направ- к нему преобразования Ру(9)-Рх(ф)-Рг(а)-7ПЛ, в результате чего его х- и ^-компоненты становятся нулевыми (рис. 8.31) Отметим, что поскольку мы преоб- разуем направление, а не позицию, то в преобразование вектора на- правления проецирования (DOP) не входит начальный перенос из шага 1. Представляя преобразованный вектор направления проециро- вания как DOP'=[DOP\ DOP'y DOP'a 1]=Е)ОР-/?г/(9).рх(ф)х X Rz (а) • Тпа, найдем ах и blt удовлетворяющие уравнению DOP'.5Яг(ап &х) = [0 0 D0P'3 1]. (8.20) С помощью алгебраических преобразований можно показать, что это будет справедливо, когда _ DOPi , __ DOPy 1 DOPa 1 DOPj (8.21)
336 Глава 8 Рис. 8.32. Видимый объем после выполнения шагов 1—5 преобразования (Упарал (он соответствует рис. 8.29 е). Отметим, что в случае ортографической проекцйи DOPi=DOP^=0, поэтому a1=bl=Q и матрица сдвига сводится к единичной. На рис. 8.32 показан видимый объем после применения к нему пяти рассмотренных шагов преобразования. Границами видимого объема служат umln мтах» Цп1п У Цпах> F^Zz^ZB. (8.22) На последнем шаге производится преобразование сдвинутого види- мого объема в единичный куб Для этого точка (wmin, vmin, F) пере- носится в начало координат и после этого применяется преобразо- вание масштабирования. Матрицы этих преобразований имеют вид Лтарал = Т (— Uraln, ~ «mln, “Л, (8-23) 5парал = 5( ..2, (8.24) \ “max “min cmax cmin ° 1 / Объединяя все преобразования, получаем А^парал = Т • Ry (0) • Rx (<₽)• Рг (а)-Т пл-SH z (ах, bj ' Rпарал * ^парал- (8.25) Это преобразование переводит точки мирового координатного про- странства в точки видового координатного пространства, в котором легко проводить отсечение по границам единичного куба. 8.4.2. Центральная проекция Вычислим теперь нормирующее преобразование Мцентр для центральной проекции. МЦентр отображает точки, заданные в ми- ровых координатах, в точки видовой системы координат так, чтобы видимый объем преобразовался в канонический видимый объем для случая центральной проекции. Последний представляет собой усе- ченную пирамиду, определяемую уравнениями (8.16), с вершиной в начале координат. После применения Л/Центр отсечение будет вы-
Изображение трехмерных объектов 337 Рис. 8.33а. Ситуация до начала построения изображения. Задана правосторон- няя мировая система координат. VUP' является проекцией VUP на картинную плоскость (на рис. 8.336 — 8.33е изображается только VUP'). VRP лежит в на- чале VUP и VPN. VPN не параллельна ни оси г, ни осевой линии пирамиды, т. е. пирамида является наклонной. Для большей наглядности дом помещен вне видимого объема. Рис. 8.336. Центр проекции перенесен в начало координат, а вместе с ним перене- сены VUP', VPN и видимый объем. Это соответствует шагу 1 преобразования ^центр- Рис. 8.33в. Поворот вокруг оси у, а затем вокруг оси х, в результате чего нормаль VPN параллельна оси z и противоположна ей по направлению. Это соответствует шагу 2 преобразования /Уцентр- подняться относительно канонического видимого объема, а его результаты проецироваться на картинную плоскость с помощью преобразования Мцентр, полученного в разд. 8.2. Преобразование Л(центр состоит из следующих шагов: 1) перенос центра проекции в начало координат;
338 Глава 8 г Рис. 8.33г. Поворот вокруг оси z (в результате VUP' параллелен осн у). Это соот- ветствует шагу 3 преобразования AZueHTp. VPN остается параллельным оси г. VUP* 9 Рис. 8.33д. Переход к левосторонним видовым координатам н сдвиг. Ось пира- миды совпадает с осью z. VPN остается параллельным оси z, a VUP' — осн у. Это соответствует шагам 4 и 5 преобразования //центр- Рис. 8.33е. Масштабирование видимо- го объема до канонического. Это со- ответствует шагу 6 преобразования ^центр-
Изображение трехмерных объектов 339 2) поворот, при котором VPN ста- новится параллельным отрицательной полуоси г; 3) поворот, при котором проекция VUP на картинную плоскость становит- ся параллельной оси у, 4) переход от правосторонних (ми- ровых) координат к левосторонним (ви- довым) координатам; 5) сдвиг, при котором ось видимого объема совпадает с осью г; 6) масштабирование, при котором Рис. 8.34. Центральная про- екция дома. видимый объем принимает вид усечен- ной прямоугольной пирамиды, определяемой шестью плоскостя- ми, которые задаются уравнениями (8.16). На рис. 8.33 а — 8.33 е показано применение этой последова- тельности шагов к видимому объему для случая центральной проек- ции и к дому. На рис. 8.34 изображена центральная проекция, которая получается при условии, что не производится отсечение по задней плоскости видимого объема. Для описания начального переноса центра проекции в начало координат определим VRP = (VRPX, VRPy, VRP3). (8.26) Центр проекции задается относительно опорной точки следующим образом: СОР = (СОРХ, СОРу, СОРД. (8.27) Следовательно, центр проекции находится в точке (VRP^+COP*, VRP^+COPj,, УРРг+СОРг), поэтому начальный перенос есть Т’центр = Т (- (VRP. + СОРД, - (VRP.+СОРД, - (VRPZ4-COPZ)). (8.28) Повороты на шагах 2 и 3 снова совпадают с вычисленными в разд. 7.6, причем с теми же соответствиями, что и для параллель- ных проекций: Опорная точка: VRP=Pi. Нормаль к картинной плоскости: VPN=P1P2 (направленный отре- зок от Pt к Р2). _____ Вертикаль: VUP=PiP3 (направленный отрезок от Р± к Р3). В разд. 7.6 перенос Pi в начало координат применяется только для вычисления 0, ф и а, поэтому он не является частью преобразо- вания /Уцентр- В преобразовании МЦентр используются только повороты. Преобразование из правой в левую систему координат на шаге 4 описывается матрицей Рпд (выражение (8.18)). Для вычисления
340 Глава 8 преобразования сдвига на шаге 5 рассмотрим рис. 8.35, на котором показан вид сбоку видимого объема после выполнения шагов 1—4 преобразования NueHTp. Отметим, что ось видимого объема, про- ходящая через начало коорди- нат и центр окна, не совпадает с гв. Целью сдвига является от- ображение оси видимого объема в ось zv. Для определения сдви- га рассмотрим координаты цент- ра окна, которые в системе ко- ординат uv на кости все еще max)/2, так как до сих преобразования, не влияющие на длины отрезков. Началом системы координат шагов 1—4 служит картинной плос- имеют значения (»min+»max)/2), пор применялись Рис. 8.35. Поперечное сечение види- мого объема после выполнения шагов 1—4 преобразования ?/центр- uv, т. е. VRP, после выполнения VRP' = VRР • Тцентр. Rу (9) • Rx (ср) • Rz (а) • Тпл = VRР • Тцентр • R • Тпл, (8.29) где R — величина, полученная в разд. 7.6. Таким образом, центр окна, через который проходит ось видимого объема, находится теперь в точке с координатами CWх = VRP^ 4- 2* (umin 4- umax), CWy = VRP; + l(umin4-fmax), (8.30) cwz=vrp;. Необходимо сдвинуть центр окна в точку (0, 0, VRP0. Легко определить, что коэффициенты для SH2 есть CW VRPx-j-y (wmin4”wmax) /j — __- ---— ___ . cw* * (831) CWp VRPp-j-y (l’min4't'max) b* = ~ CWZ “ vrpI В результате применения преобразования сдвига окно (а следова- тельно, и видимый объем) центрируется относительно оси гв и опре- деляется неравенствами 5" (^max ^min) "o' (^max ^min)> 1 1 (8-32) 2 (^тах Цв1и) Уг> 2 ^min)*
Изображение трехмерных объектов 341 Рис. 8.36. Поперечное сечение видимого объема до масштабирования (а) и после масштабирования (б). На последнем шаге для создания канонического видимого объема, описываемого уравнениями (8.16), производится масштабирование вдоль всех трех осей. На рис. 8.36 показан видимый объем до и после выполнения этого шага. Масштабирование удобнее осуществлять в 2 этапа. На первом этапе масштабирование выполняется раздельно по осям xv и yv так, чтобы боковые плоскости видимого объема имели одинаковый наклон. Это достигается таким масштабированием ок- на, при котором половина его высоты и половина ширины становятся равными VRPa. Масштабные Коэффициенты по осям хк и yv равны 2-VRP;/(Mmax—итт) и 2-VRP;/(omax—omin) соответственно. На втором этапе выполняется однородное масштабирование, при кото- ром задняя секущая плоскость, имеющая 20=VRPz+B, переходит в плоскость гв = 1. Масштабный множитель в этом случае равен i/(vrp;+b). В результате получаем масштабирование в виде 2-VRPs 2-VRPz (“max “min)' (VRPz-f-ZJ) (ymax ytnin)’(VRP»"b^) ______________________!__> vrp;+b j' (8.33) Масштабирование по оси г0 переводит переднюю секущую плоскость и картинную плоскость в новые положения: _ VRP^+F VRPz mln VRPz4-B ’ ка₽т VRPz-t-B (8.34)
342 Глава 8 Полное видовое преобразование для случая центральной про- екции будет таким: Л^цеитр “ Т' центр' (®)’ Rx (ф)‘ ^2(сс) ' Т’пл ’8Нг • (а2, Ь2) ‘SaeHTp. (8.35) 8.5. ОТСЕЧЕНИЕ ОТНОСИТЕЛЬНО КАНОНИЧЕСКОГО ВИДИМОГО ОБЪЕМА В предыдущем разделе были получены нормирующие преобразо- вания, необходимые для отображения произвольных трехмерых видимых объемов в канонические объемы, удобные для отсечения: единичный куб для случая параллельных проекций и усеченная правильная прямоугольная пирамида для центральных проекций. Для обоих случаев рассматриваются аналогичные методы отсече- ния, отличающиеся лишь способами вычисления пересечений и проверками на «внутри/вне». Алгоритм отсечения по границам единичного куба полностью аналогичен двумерному алгоритму Коэна — Сазерленда, описан- ному в разд. 4.2, лишь код в этом случае является щестиразрядным, причем каждый разряд принимает значение «истина» (1), когда вы- полняется соответствующее условие: разряд 1 —точка лежит выше видимого объема: разряд 2 — точка лежит ниже видимого объема- yv < 0; разряд 3 — точка лежит справа от видимого объема: xv > 1; разряд 4 — точка лежит слева от видимого объема: х0 < 0; разряд 5 — точка лежит позади видимого объема: zv > 1; разряд 6 — точка лежит впереди видимого объема: zB < 0. Как и в случае двух измерений, отрезок принимается, если коды для обоих его концов равны нулю, и отбрасывается, когда поразряд- ное логическое И этих кодов не является нулевым. В противном случае начинается процесс деления отрезка. Может оказаться необходимым вычислять до шести пересечений, т. е. с каждой из граней видимого объема. Для определения пересечений удобно воспользоваться парамет- рическим представлением отрезка, проведенного из точки Р1(хи ylt 21) в точку Р2(х2, у2, г2): xv — (Х2 х1)' 1 “Ь xi> У1, = (У2—У1)^ + У1> (8.36) zv =(z2—zJ-Z + zp Поскольку t изменяется от 0 до 1, уравнения (8.36) задают координаты всех точек отрезка. Для вычисления точки пересечения отрезка с верхней гранью видимого объема, представляющего собой единичный куб, заменим переменную yv константой 1 и решим урав- нение относительно /:
Изображение трехмерных объектов 343 Если t выходит за границы интервала 0—1, точка пересечения ле- жит за пределами куба. В противном случае t подставляется в урав- нения для xv и г„ и определяются координаты точки пересечения: y — О—уОfa—^i) । v _ _ О—yi)fa—2i) v Уг~У1 11 ’ (8.38) У г—У1 Остальные пересечения вычисляются аналогично. Для проведения отсечения по границам канонического видимого объема в случае центральной проекции будем также использовать шестиразрядный код, каждый разряд которого определяется следую- щим образом: разряд 1 — точка лежит выше видимого объема: у„ > г0; разряд 2 — точка лежит ниже видимого объема: yv < —z0; разряд 3 — точка лежит справа от видимого объема: х„ > z0; разряд 4 — точка лежит слева от видимого объема: х„ < —zu; разряд 5 — точка лежит позади видимого объема: z0> 1; разряд 6 — точка лежит впереди видимого объема: zD < zmin. Пересечения отрезков с наклонными плоскостями вычисляются следующим образом. Рассматривается плоскость yv—zv, для которой Отсюда (уг— У1) -t + f/x = (г2—• t + Zf. (8.39) zi—yt fa—у i) — fa —21) ’ (8.40) Подставляя t в уравнения (8.36) для xv и ув, получаем У fa —Х1)(21 —У1) , .. ’ fa — У1) — fa — 21) 1 fazliH^j/i), (8>41) fa — У1)— fa— 21) 1,1 V Задача решается при условии zB—yB. Теперь понятна причина, по которой были выбраны эти канонические видимые объемы: единич- ные наклоны плоскостей упрощают вычисления пересечений. Алгоритм деления средней точкой (разд. 4.2.1), в который не входят операции деления и умножения, можно легко распростра- нить на случай трех измерений. Однако в связи с увеличивающейся распространенностью быстрых недорогих средств умножения/деле- ния для микрокомпьютеров его использование менее привлека- тельно по сравнению с трехмерным обобщением алгоритма Коэна — Сазерленда. 8.6. ПРЕОБРАЗОВАНИЯ ОБРАЗА Во многих графических приложениях возникает потребность в построении серии видов одного и того же объекта. Нередко бывает необходимо изображать эту последовательность кадров достаточно быстро, так чтобы ощущалась динамика процесса в реальном масш- табе времени. Простым примером может служить «буксировка» (т. е. перенос) образа по видовой поверхности в ответ на перемеще-
344 Глава 8 ние локатора. В гл. 2 для буксировки по экрану символов мебели использовалась подпрограмма ПГП TRANSLATE_IMAGE_2. Часто возникает желание распространить этот прием на другие динамические преобразования (двумерные или трехмерные масшта- бирование и поворот). Оказывается, что двумерные повороты необ- ходимы в чертежных системах, в которых заранее определенный шаблон требуется иногда повернуть и тем самым правильно сориен- тировать. Трехмерные повороты понадобились бы для включения каркасной модели молекулы в карту электронной плотности. В дру- гих случаях, когда динамика реального времени либо просто недо- стижима из-за аппаратных ограничений (например, при выводе на дисплей с запоминающей трубкой), либо не желательна, каждый из серии видов можно получать в ответ на явный запрос. В таких случаях необходимо выводить каждый новый вид на экран как можно быстрее. Последовательность видов (кадров) можно генерировать с по- мощью совокупности модельных преобразований, либо видовых преобразований, либо преобразований образа. Модельные преоб- разования используются для отображения объектов, описанных в мировых координатах, до применения к ним видового преобразо- вания (гл. 9). Видовое преобразование (отсечение, проецирование и геометрическое преобразование) переводит объект из мировых коор- динат в нормированные координаты. Преобразование образа (еще одно геометрическое преобразование) применяется в нормирован- ном координатном пространстве после видового преобразования. Основной проблемой при использовании модельных или видовых преобразований для отображения динамики реального времени яв- ляется выполнение всего процесса порождения образа (где приклад- ная программа задает примитивы вывода для графического пакета, который после этого их преобразует, усекает, проецирует и выдает на графическое устройство) со скоростью по крайней мере 10 коррек- тировок изображения в 1 с. Такая скорость может быть достигнута лишь в немногих частных случаях: 1. Число примитивов вывода очень мало, так что программная реализация видового преобразования может обрабатывать все при- митивы достаточно быстро. 2. Для выполнения преобразования и отсечения графическим пакетом используется высокопроизводительное дорогое графическое устройство, которое позволяет держать описания примитивов вы- вода в памяти, непосредственно доступной из процессора. Если ни одно из этих условий не выполняется (что, как правило, и бывает), то динамика реального времени недостижима при ис- пользовании модельных или видовых преобразований. Ситуация особенно усложняется, если дисплейный терминал связан с основной ЭВМ линией связи. Даже при таких скоростях передачи, как 10 000 или 20 000 битов в 1 с, невозможна пересылка сложных обновлен- ных изображений каждую 1/10 с.
Изображение трехмерных объектов 345 Возможности преодоления этих трудностей возрастают при вклю- чении в графический пакет преобразований образа аналогично тому, как это сделано в GPGS [474] и в системе Core. Преобразования об- раза выполняются быстрее, чем видовые преобразования, поскольку в последних производится отсечение, отбрасывающее некоторые примитивы вывода, а в первых отсутствуют и отсечения, и обработка невидимых примитивов. Более того, если в результате отсечения большое число примитивов отброшено, для размещения усеченных примитивов может оказаться достаточно основной памяти, в то время как для размещения неусеченных примитивов может потребо- ваться вторичная память. В подобных случаях преобразования образа обладают дополнительным преимуществом в быстродействии, даже если модельные и видовые преобразования поддерживаются аппаратно. В концепции графической рабочей станции, принятой в GKS, содержится обобщение понятия послевидового преобразова- ния, необходимое для включения второго уровня кадрирования, вследствие чего еще более замедляется процесс определения части образа, которая в конечном итоге окажется на экране [137]. Начнем рассмотрение нашей реализации с двумерных преоб- разований образа, а затем обобщим их на трехмерные. На рис. 8.37 показано, как расширить процесс вывода изображения, чтобы вклю- чить в него двумерные преобразования образа, выполняемые после отсечения и отображения в нормированные координаты (НК). Любое двумерное преобразование образа можно представить в виде матрицы размером 3x3, используя композиции матриц, рассмотренных в гл. 7. Для применения двумерного преобразова- ния образа следует вызвать процедуру1’. SET_IMAGE_XFORM (имя_сегмента, матрица) Сегмент располагается в псевдодисплейном файле, и к его коорди- натам применяется преобразование, являющееся композицией мат- рицы преобразования образа и матрицы преобразования из нор- мированных координат в физические. Получаемые физические ко- ординаты устройства используются при генерации команд ДП для вывода нового образа на дисплей. Всякий раз, когда задается пре- образование образа, первоначальное описание сегмента преобра- зуется и выводится на экран. Трехмерные преобразования образа требуют внесения более серьезных изменений в процесс визуализации (рис. 8.38). На первых двух шагах выполняются те же преобразования, что и в двумерном случае. На следующем шаге канонический видимый объем преобра- зуется в трехмерное поле вывода, которое представляет собой прямоугольный параллелепипед, находящийся в трехмерной НК- пространстве. (Это пространство, которое в точности совпадает о И Эта процедура является более общей, чем та, которая используется в системе Core, и содержит задаваемые непосредственно параметры масштабирова- ния, поворота и переноса.
Рнс. 8.37. Процесс вывода трехмерной графической информации с добавлением двумерных преобразований образа. Мировые Видовые НК НК Рис. 8.38. Процесс вывода трехмерной графической информации, расширенный для включения трехмерных преобразований образа. Глава 8
Рис. 8.39. Трехмерное НК-пространство и трехмерное поле вывода, а также проекция на видовую поверхность. единичным кубом, является трехмерным, так что псевдодисплейный файл также должен быть трехмерным.) Затем к трехмерным координатам примитивов вывода применя- ются преобразования образа, после чего примитивы изображаются путем ортографического проецирования вдоль оси г трехмерного НК-пространства и перевода в физические координаты (ФК). На рис. 8.39 показана такая проекция. Первым шагом в реализации трехмерных преобразований об- раза является преобразование видимого объема в трехмерную область вывода, заключенную по оси х между xmin и хтах и анало- гично по осям у и г. В случае видимого объема для параллельной проекции, т. е. для единичного куба, это преобразование представ- ляет собой масштабирование, за которым следует перенос. С помо- щью масштабирования единичный куб сжимается до размеров трех- мерного поля вывода и путем переноса уменьшенный куб перемеща- ется в соответствующую позицию. Масштабирование описывается функцией “^1s ('Ч.шах //v.max i/v.niltH 2v.max 2v.min)> (8.42) а последующий перенос — функцией ~ T (Xv.mini i/v.min, 2v.mln)- (8-43) Преобразование канонического видимого объема для случая центральной проекции в трехмерную область вывода более сложно. Имеется, однако, простая матрица размером 4x4, с помощью кото- рой усеченная пирамида преобразуется в объем, описываемый неравенствами (8.44)
348 Глава 8 Центр проекции Рис. 8.40. Виды сбоку на нормализованный видимый объем для случая централь- ного проецирования до применения (а) и после применения (б) преобразования, описываемого матрицей М. На рис. 8.40 показаны желаемые результаты преобразования, когда точка А переходит в точку А' и т. д. Матрица этого преобразования имеет вид 0 0 0 " 1 0 0 zv.min (8.45) о о . - ^ш!п о I 1 2v.min _ Более подробно это преобразование, называемое перспективным преобразованием (в отличие от центрального проецирования), рас- смотрено в гл. 15, посвященной удалению скрытых поверхностей. Здесь отметим лишь, что [х у z l]-2d-M-MopT = [x у г 1]• МценТр• Морт, (8.46) где d определяет местоположение картинной плоскости Это озна- чает, что, используя 2d-M вместо Л4центр до ортографического проецирования на двумерную плоскость, мы получим ге же визу- альные результаты, как и при использовании матрицы централь- ного проецирования Л4цеНтр. ОднаКо если мы воспользуемся трех- мерным поворотом образа вокруг осей х или у, то увидим, что полу- ченное изображение отличается от того, которое следовало бы ожи- дать, так как объекты, близкие к передней плоскости видимого объема, при применении матрицы М увеличиваются, т. е. матрица Л4 И трехмерные повороты не коммутируют.
Изображение трехмерных объектов 349 Если канонический видимый объем для случая центральной проекции преобразован в объем, описываемый уравнениями (8.44), то следующими тремя шагами, с помощью которых осуществляется отображение в трехмерную область вывода, являются: перенос объема, который описывается уравнениями (8.44) и при котором вершина (—1, —1, 0) перемещается в начало координат; масштаби- рование до размеров трехмерной области вывода; перенос в пози- цию, предназначенную для поля вывода, т. е. Та = Т(1, 1, 0); (8.47) So (^v.max— *v.min f/v.max—f/v.min ~ /Q /tQ\ a = <-> I --2---- ’ -----2----- ’ 2v-max — 2v-min b (O.4OJ 7\ = T(Xv.min, yV.mln, Zv.min). (8-49) Таким образом, преобразования, приводящие к трехмерным пре- образованиям образа, имеют вид Лгарал = • 7\ (для параллельной проекции), /центр = M-7'a-Sa-7'1 (для центральной проекции). Что произойдет, если zv, mjn=zv. max? Это означает, что трех- мерное поле вывода не имеет глубины и матрицы St и Sa будут иметь нулевые коэффициенты масштабирования вдоль оси г. Заклю- чительный перенос устанавливает в трехмерном НК-пространстве z=zv>min. Если, кроме того, окажется, что ?v. min=0, то результат отобразится в стандартное двумерное поле вывода в двумерном НК- пространстве. Таким образом, мы убедились, что трехмерные пре- образования образа вполне пригодны и в двумерном пространстве. Трехмерное преобразование образа можно представить в виде матрицы размером 4X4. Для преобразования образа сегмента, как и в случае двух измерений, требуется вызвать процедуру графиче- ского пакета SET _I MAGE „XF0RM_3(umh сегмента, матрица) При обращении к этой процедуре трехмерные НК в псевдодисплейном файле каждый раз умножаются на матрицу, вычисленную как ре- зультат объединения матриц преобразования образа, ортографиче- ского проецирования и преобразования из нормированных координат в физические. С другой стороны, в псевдодисплейном файле могли разместиться усеченные видовые координаты до их отображения в трехмерную область вывода. Затем все преобразования, выполняе- мые после отсечения (рис. 8.38), объединяются в одну общую матри- цу. В любом случае при каждом изменении преобразования образа матрица объединенного преобразования вычисляется вновь и при- меняется к псевдодисплейному файлу, преобразованные примитивы вывода которого изображаются на экране.
350 Главе 8 8.7. ВЫВОД ТРЕХМЕРНОЙ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ В ПГП *> Теперь включим процессы построения изображений трехмерных объектов в ПГП, чтобы последний стал полным пакетом трехмерной машинной графики. Для этого добавим две совокупности возмож- ностей: Трехмерные примитивы вывода. Задание плоских геометрических проекций. Рис. 8.41. Двухточечная цент- ральная проекция дома. Рис. 8.42. Изометрическая проекция дома. Имея эти возможности, мы сможем порождать изображения, по- добные показанным на рис. 8.41 и 8.42. Так же как и в гл. 2, рас- ширения ПГП будут строиться по образцу системы Core [203]. Про- цедуры, требуемые для расширений, будут вводиться в этом разделе по мере необходимости. Примитивы вывода в трехмерной мировой системе координат, которая в ПГП является правосторонней системой, представляет собой прямые расширения двумерных примитивов. В имени про- цедуры «2» заменяется на «3» и добавляется третий параметр — координата г. Например, имеется LI NE_ABS_3(x, у, г). Кроме того, чтобы включить z-компоненту, расширяется текущая позиция (ТП). Возможно одновременное использование двумерных и трех- мерных примитивов вывода. Двумерные примитивы просто не ока- зывают воздействия на г-компоненту ТП. Таким образом, если ТП есть (5.0, 10.0, 4.0) и вызывается LINE_ABS_2(\2.0, 17.0) то отрезок проводится из ТП в точку о координатами (12.0, 17.0, 4.0), которая становится новой текущей позицией. Такая сокращен- J) Этот раздел взят из гл. 3 работы [32].
Изображение трехмерных объектов 351 procedure HOUSE begin {изображаем переднюю грань дома, лежащую на плоскости г = 30.0} Л1ОУ£_Л55_3(0.0, 0.0, 30.0); L1NE-REL_2(16.O, 0.0); L1NE_REL_2(O.O, 10.0); L1NE_REL_2(—8.0, 6.0); LlNE-REL-2(—8.0, —6.0); LlNE-REL-2(0.0, —10.0); {изображаем грань, лежащую на плоскости г = 54.0} MOVE-ABS-3(0.0, 0.0., 54.0); LINE-REL_2(\6.0, 0.0); LJNE-R EL-2(0.0, 10.0); L1NE-REL_2(—8.0, 6.0); LINE-REL_2(—8.0, —6.0); LINE-REL_2(0.0, —10.0); {теперь соединяем переднюю и заднюю грани} MOVE-ABS-3(0.0, 0.0, 30.0); LINE-REL_3(0.0, 0.0, 24.0); MOVE-ABS-3(16,0, 0.0, 30.0); LINE-REL-3(0.0, 0.0, 24.0); MOVE-ABS-3(16.0, 10.0, 30.0); LINE_REL_3(0.0, 0.0, 24.0); MOVE-ABS-3(8.0, 16.0, 30.0); LlNE_REL_3(0.0, 0.0, 24.0); MOVE-ABS-3(0.0, 10.0, 30.0); LlNE-REL_3(0.0, 0.0, 24.0); end {HOUSE} Рис. 8.43. Процедура построения дома. ная запись удобна при описании объектов, находящихся на плоско- сти с постоянной координатой г. Процедура на рис. 8.43 описывает дом, изображенный на рис. 8.44, и показывает, как одновременно использовать двумерные и трехмерные примитивы вывода. Ширина дома равна 16 футам, длина — 24 футам, его высота до вершины со- ставляет 16 футов (в этом примере предполагается, что мировые координаты задаются в футах). 8.7.1. Центральные проекции Как построить центральную проекцию дома? В ПГП централь- ная проекция определяется! центром проекции; картинной плоскостью (плоскостью проекции); окном на картинной плоскости; полем вывода на видовой поверхности. Эти понятия полностью соответствуют общему описанию, изложен- ному в разд. 8.1 и 8.2. Кроме того, предполагается, что будут ис- пользоваться такие понятия, как VRP, VPN, VUP, и система координат uv из разд. 8.3. Читателям, которым непонятно, как все эти понятия связаны друг с другом, рекомендуем приобрести набор «Умелые руки» и с
352 Глава 8 его помощью соорудить домик, мировую систему координат и коор- динатную систему и, v, VPN аналогично тому, как показано на рис. 8.45. VRP является началом системы координат и, v, VPN. Идея заключается в том, чтобы расположить эту координатную систему относительно мировых координат так, как это делалось в примере, иллюстрирующем процесс вывода, и затем представить себе проекторы, проходящие через точки домика и пересекающие картинную плоскость. Опыт показывает, что это полезный способ, облегчающий понимание (и обучение) концепций процесса трехмер- ного вывода. В ПГП, так же как и в системе Core, для всех параметров, опи- сывающих изображение, существуют значения, устанавливаемые по умолчанию. Для опорной точки таким значением является начало координат, а для нормали к картинной плоскости — вектор, на- правленный по отрицательной оси г Поэтому для картинной пло- скости «стандартным» значением является плоскость г=0. Более того, по умолчанию в качестве вектора вертикали берется вектор, совпадающий по направлению в осью у, и устанавливается режим параллельного проецирования с направлением вдоль оси г. В ре- зультате оси и и v будут совпадать с осями х и у соответственно. Значения, устанавливаемые по умолчанию, говорят о том, что про- цесс двумерного вывода является частным елучаем процесса трех- мерного вывода Все двумерные примитивы лежат на плоскости г=0, которая является проекционной плоскостью. Для окна и об- ласти вывода по умолчанию устанавливаются диапазоны 0—I по обеим осям. Предполагается, что если не будет явно установлено про- * тивное, то эти «стандартные» значения будут использоваться в каж- ' дом из следующих примеров. Для того чтобы построить одноточечную центральную проекцию! дома спереди (если смотреть на начало координат вдоль положителм!
Изображение трехмерных объектов Рис. 8.45. Каркасные модели, которые облегчают понимание процесса вывода трехмерной графической информации. (С разрешения JDF и MHF.) а — Дом и правосторонние системы координат; б — дом и левосторонняя система координат. ного направления оси z), центр проекции (который можно отожде- ствлять с глазом наблюдателя) можно поместить в точку с коорди- натами х=8.0, i/=6.0 и z=84.0. Значение х выбрано совпадающим о горизонтальным центром дома, значение у приблизительно соответ- ствует уровню глаз высокого наблюдателя, стоящего на плоскости хг, значение же z произвольно. В нашем случае г отнесено на 30 еди- ниц от передней стены дома (плоскость z=54). С помощью обращения SET_PROJECTION(«PERSPECTIVE», 8.0, 6.0, 84.0) определяется центр проекции о1носительно опорной точки. Исполь- зуя значение опорной точки, установленное по умолчанию, найдем, что в результате центр проекции будет помещен в точку о коорди- натами х=8.0, у=6.0 и г=84.0. С помощью обращения W1NDOW(0.0, 100.0, 0.0, 100.0) на картинной плоскости (в нашем случае на плоскости z=0.0) зада- ется окно со сторонами длиной 100 единиц. Окно определяет часть картинной плоскости, которая будет отображена в поле вывода. Большое окно требуется потому, что дом находится между центром проекции и картинной плоскостью. По этой же причине при прое- цировании на картинную плоскость дом увеличивается. Как пока- зано ниже, с помощью этих двух обращений можно построить проекцию, такую, как на рис. 8.46: SET-PROJECT/ON ("PERSPECTIVE", 8.0, 6,0, 84.0); WINDOWQ.O, 100.0, 0.0, 100.0); CREATESEGMENT (1); HOUSE-, CLOSE-SEGMENT
Глава 8 рис. 8.46. Нецентрироваиная цент- ральная проекция дома. Рис. 8.47. Центрированная цент- ральная проекция дома. Хотя на рис. 8.46 изображена центральная проекция дома, однако она слишком мала и, кроме того, находится не в середине экрана дисплея. Предпочтительнее была бы проекция дома, более центри- рованная и полнее заполняющая поверхность экрана (рис. 8.47). Этого достичь проще, если картинная плоскость совпадает с перед- ней плоскостью дома. Тогда, поскольку передняя грань дома про- стирается от 0.0 до 16.0 как по к-, так и по у-осям, для получения удовлетворительных результатов потребуется окно протяженностью от —1.0 до 17.0 по осям х и у. Для изменения местоположения (но не ориентации) картинной плоскости, чтобы добиться ее совпадения с передней плоскостью дома, сменим опорную точку путем вызова процедуры SET_VIEW_REFERENCE,POINT(0.0, 0.0, 54.0) Центр проекции, который задается относительно опорной точки, может продолжать оставаться в той же позиции, но уже относи- тельно новой опорной точки. С помощью следующего фрагмента программы строится рис. 8.47: SET-VIEW-REFERENCE-POINT (0.0, 0.0, 54.0); S£7’_PROJ£'C77OW(”PERSPECTIVE”, 8.0, 6.0, 30.0); WINDOW!—1.0, 17.0, —1.0, 17.0); CREATE-SEGMENT{2)- HOUSE-, CLOSE-SEGMENT Тот же результат можно получить и многими другими способами. Например, если бы опорная точка находилась в (8.0, 6.0, 54.0), то относительно этой точки центр проекции следовало бы поместить в (0.0, 0.0, 30.0), Окно тоже требовалось бы переопределить, по- скольку его описание основывается на системе координат и, V, VPN, началом которой является опорная точка. (В системе Core, но не в ПГП, это начало может находиться в любой точке прямой, .проходящей через VRP параллельно VPN.) На рис. 8.48 показаны
Изображение трехмерных объектов 355 У Рис. 8.48. Система координат и, v, VPN. оси и, v и VPN, образующие систему координат и, v, VPN, перед- няя грань дома, центр проекции и окно протяженностью от —9.0 до 9.0 по и и от —7.0 до 11.0 по v. По отношению к дому это то же самое окно, что и в предыдущем примере, однако теперь оно задано в другой системе координат и, v. Поскольку в нашем случае вер- тикальное направление по умолчанию устанавливается совпадаю- щим с осью у, координатные оси и и х, а также v и у параллельны. Фрагмент программы, приведенный ниже, задает это новое описание изображения: SET.VI EW-REFERENCE-POI NT18.0, 6.0, 54.0); S£7_PR0J£'C'77CW(”PERSPECTIVE”, 0.0, 0.0, 30.0); WIND0W(—9.0, 9.0, —7.0, 11.0); CREA ТЕ- SEGMEN 7(3); HOUSE-, CLOSE-SEGMENT Отметим, что видовые параметры могут определяться в произволь- ном порядке. Какими бы они ни были на самом деле, используются эти параметры лишь при создании сегмента. Теперь постараемся построить изображение, показанное на рис. 8.41. Можно считать, что в центр проекции помещена вообра- жаемая фотокамера, которая делает снимки объектов, заданных в мировых координатах. Имея в виду эту аналогию, рассмотрим рис. 8.41. Ясно, что центр проекции расположен несколько выше дома и справа от него, если смотреть с положительного направле- ния оси z. Точное значение центра проекции есть (36, 25 , 74). Если в качестве опорной точки выбрать угол дома с координа- тами (16.0, 0.0, 54.0), то относительно нее центр проекции будет находиться в точке (20.0, 25.0, 20.0). Для картинной плоскости, совпадающей с передней гранью дома (плоскостью z=54.0), и начала видовой системы координат, расположенного в опорной точке.
356 Глава 8 окно протяженностью от —20.0 до 20.0 по и и от —5.0 до 35.0 по Й достаточно велико, чтобы внутри него разместилась вся проекция. Во фрагменте программы, приведенном ниже, содержится описаний изображения, которое соответствует рис. 8.49: SET-VIEW-REFERENCE-POI NT(\GS), 0.0, 54.0): SET-PROJ ECTION ("PERSPECTIVE”, 20.0, 25.0, 20.0); WINI)0W(—20.0, 20.0, —5.0, 35.0); CREATE SEGMENT^); HOUSE-, CLOSE-SEGMENT Приведенная проекция аналогична проекции, показанной на рис. 8.41, однако ясно, что это не одно и то же. Прежде всего на Рис. 8.49. Центральная проек- ция дома из точки с координа- тами (36, 25, 74) в случае, ког- да нормаль VPN параллельна оси г. кость, которая получается рис. 8.41 изображена двухточечная центральная проекция, в то время как на рис. 8.49 — одноточечная. Очевидно, что одного лишь простого перемещения центра проекции недо- статочно для построения рис. 8.41. На самом деле необходимо изменить ориентацию картинной плоскости, что- бы она пересекала оси х и z. С по- мощью обращения SET_V1EW PLANE NORMAL (—1.0, 0.0, —1.0) устанавливается новая нормаль, та- кая, что картинная плоскость пере- секает оси z и х под углом 45° и при этом остается параллельной оси у. На рис. 8.50 показана картинная плос- при таком задании VPN. Существуют два способа выбора окна, которое полностью бы содержало проекцию, как в случае, показанном на рис. 8.41. Раз- меры проекции дома на картинную плоскость можно либо вычис- лить, либо воспользоваться методом проб и ошибок. В нашем случае для определения пересечений картинной плоскости с двумя проеци- рующими лучами была использована схема, показанная на рис. 8.51. Она позволила установить соответствующие границы окна по оси и от —12 до -}-13. Затем с помощью метода проб и ошибок были найдены удовлетворительные границы по оси v от —2 до 4-23. Следующий фрагмент программы порождает рис. 8.41: SET-VIEW-REFERENCE-POINT(16.Q, 0.0, 54.0); .4 SET-VIEW-PLANE „NORM AL(—1.0, 0.0, —l>0); fi SET_PROJEC77CW(”PERSPECTIVE”, 20.0, 25.0, 20.0); J WIND0W(—12.0, 13.0, —2.0, 23.0); Э CREATE_SEGMENT(Sy, t HOUSE-, Л jCLOSE-SeGMENT
Изображение трехмерных объектов 357 Рис. 8.50. Картинная плоскость и система координат и, V. Рис. 8.51. Рис. 8.52 почти идентичен рис. 8.41, хотя он получен с помощью той же самой проекции, но с использованием окна, имеющего другую ориентацию. И это действительно так. Во всех предыдущих приме- рах ось v системы координат и, v была параллельна оси у мировой системы координат. Поэтому окно (две граничные прямые которого параллельны оси и) было хорошо выровнено относительно верти- кальных сторон дома. Хотя мы н не приводим здесь программы,
358 Глава 8 Рис. 8.52. Повернутая двух- точечная центральная про- екция дома. рис. 8.52, в самом деле, был построен « использованием обращения к процедур^ SET _V IEW-U Р _3, с помощью котоЗ рого выполнялся поворот оси v путеьЁ задания нового вектора вертикали. 8.7.2. Пример программы Как видно из рассмотренных выше примеров, вычисление видовых парамет- ров, необходимых для получения же- лаемого изображения, может оказаться нелегким делом. Одна из возможностей интерактивной графики состоит в том, чтобы позволить пользователю изменять изображения в диалоге и получать в результате то, что наибо- лее применимо (так делается обычно в пакетах, ориентиро- SET_VIEW_REFERENCE-POINT(10.0, 0.0, 54.0); SET-VIEW-PLANE-NORMAL^—1.0, 0.0, —1.0); root_2i= SQRT(2.0); {Строим исходную центральную проекцию с центром, удаленным на 50 единиц (в плоскости хг) от опорной точки! SET-PROJECTION(”PERSPECTIVE”, 50.0/roof_2,25.0, 50.0/гоо(_2); WIND0W(—20.0, 20.0, —5.0, 35.0), CREATE-SEGMENTS); HOUSE, CLOSE-SEGMENT; {Теперь зацикливаемся и реагируем на изменения значения валюатора; выхо- дим при нажатии кнопки) old_distan.ce := 50.0; temp = 20; {имя временного сегмента) repeat {интерактивный цикл) READ-VALUATOR (1, distance); distance := distance * 100 {масштабируем в диапазоне от 0 до 100} if ABS(distance—old-distance) >1.0 then begin SET-PROJECTION^'PERSPECTIVE", distance!root_2, 25.0, distance/root _2j), old_distance := distance; CREATE_SEGMENT(temp); SET-V1S! BI LITY(temp, false); HOUSE; CLOSE-SEGMENT; SET-VISIBILITY (10, false); SET-VISIBILITY (temp, true); DELETE-SEGMENT (10); RENAME-SEGMENT(temp, 10) end; WAIT-BUTTON(0.033, number) {ждем 1/30 c) until number <> 0 {завершаем интерактивный цикл, если нажата кнопка) Рис. 8.53. Программа, с помощью которой интерактивным образом изменяется центр проекции.
Изображение трехмерных объектов 359 ванных на предварительный просмотр изображений). Таким образом, создаются наилучшие условия визуализации перед изго- товлением твердой копии. Пусть имеется исходное изображение на рис. 8.41 и мы хотим, чтобы пользователь мог управлять расстоя- нием от картинной плоскости до центра проекции. В примере про- граммы, приведенном на рис. 8.53, считывается значение в диапа- зоне от 0.0 до 1.0, умножается на 100 и результат используется для настройки х- и г-компонент центра проекции. Компонента у все время остается равной 25.0. Диалог с оператором заканчивается при нажатии кнопки. Двойная буферизация между сегментами 10 и 20 производится с помощью процедуры RENAME, поэтому образ объекта практи- чески всегда находится на экране. Быстродействие и частота, с кото- рой может изменяться образ в ответ на смену значений валюатора, зависят от многих деталей реализации ПГП, от аппаратных возмож- ностей дисплея и конфигурации главной ЭВМ. Для немногих систем изменения могут производиться практически мгновенно, а следова- тельно, и непрерывно. Для большинства систем заметно отсутствие непрерывности при переходе от изображения одного образа к сле- дующему. На рис. 8.54 показаны три проекции дома для различных значений расстояния. 8.7.3. Параллельные проекции Параллельная проекция задается с помощью вызова: SET .PROJECT IO N(”PARALLEL”, dx, dy, dz) где (dx, dy, dz) — направление проецирования. Вид дома спереди (рис. 8.55) можно построить с помощью программы SET_PROJECTJON("PARALLEL”, 0.0, 0.0, —1.0); WINDOW(—1.0, 17.0, —1.0, 17.0); CREATE SEGMENT®)-, HOUSE-, CLOSE-SEGMENT а Расстояние = юо Рис. 8.54. Изображения дома, построенные при помощи интерактивной программы с различных расстояний.
360 Глава 8 Рис. 8.56. Параллельная проекция боковой стороны дома. Вид сбоку (рис. 8.56) строится следующим образом: SET -VIEW -REFERENCE _POINT(0.0, 0.0, 54.0); SET.VIEW.PLANE.NORMAL(—1.0, 0 0, 0.0); SET-PROJ ECTION("PNRNLLEL", —1.0, 0.0, 0,0); WIND0W(—1.0, 25.0, —5 0, 21.0); CREATE-SEGMENTCI); HOUSE-, CLOSE .SEGMENT При построении вида дома сверху плоскость у=0 используется в качестве картинной плоскости Таким образом, VPN по направле- нию противоположно оси у. Отсюда следует, что устанавливаемую по умолчанию вертикаль, совпадающую по направлению с осью у, больше использовать нельзя, поэтому направление вертикали сле- дует задать явно — выберем в качестве него ось х. VRP поместим в угол дома, чтобы легче было определять соответствующее окно. Программа будет следующей: SET_VIEW_REFERENCE.POINT(\6.0, 0.0, 54.0); SET_VIEW_PLANE_NORMAL(0 0, —1.0, 0.0); SET.VIEW.UР-3(—1.0, 0.0, 0.0), SET.PROJECTION(”PARNLVEL", 0.0, —1,0, 0.0); WINDOW^—1.0, 25.0, —5.0, 21.0); CREATE SEGMENT^); HOUSE] CLOSE-SEGMENT На рив. 8.42 показана изометрическая (параллельная ортогра-j фическая) проекция с направлением (—1.0, —1.0, —1.0), которое? является одним из четырех возможных направлений для изометрии * (разд. 8.1.2). Этот рисунок можно построить с помощью следующего^ фрагмента программы: J
Изображение трехмерных объектов 361 SET-VIEW „REFERENCE-POINT(lO.O, 8.0, 54.0); SET-VIEW„PLANE„NORMAL(—1.0, —1.0, —1.0); SET -PRO J ECTI0N("P AR ALLEL”, —1.0, —1.0, —1.0); WIND0W(—15.0, 25.0, —15.0, 25.0); CREATESEGMENT®)-, HOUSE-, CLOSE-SEGMENT Проекцию Кавалье под углом alpha к картинной плоскости, установленной по умолчанию, можно задать с помощью процедуры SET_PROJECT/OV(”PARALLEL”, COS (alpha), SIN (alpha),-1.0) Если имеется некоторая другая картинная плоскость, направление проецирования следует преобразовать в прикладной программе, применяя матрицу поворота, переводящую мировые координаты х, у, z в координаты и, v, VPN: это последовательность Ry-Rx-Rz, используемая в разд. 8.4. Если же направление проецирования интерпретируется в ПГП так, как-будто оно уже задано в системе координат и, v, VPN, то выполнять это преобразование в приклад- ной программе не надо. 8.7.4. Конечные видимые объемы С помощью передней и задней секущих плоскостей, описанных в одном из предыдущих разделов, можно задать конечный видимый объем. Эти плоскости, каждая из которых параллельна картинной плоскости, определяются расстоянием от опорной точки до передней плоскости front-distance и до задней плоскости back-distance. Эти расстояния задаются с помощью процедуры SET „VIEW-DEPTH (front-distance, back-distance) и отсчитываются от VRP вдоль направления VPN. Во избежание ошибок накладывается ограничение; front „distance не должно пре- вышать back „distance. Отсечение по передней и задней плоскостям Рис. 8.57. Центральная проекция дома, по- строенная с использованием задней секущей плоскости, совпадающей с плоскостью г=31.
362 Глава 8 может быть включено и выключено е помощью процедур я SET_FRONT_PLANE CLIPPING (flag) 1 SET _BACK_PLANE-CLIPPING (flag) | По умолчанию считается, что отсечение по этим плоскостям выклю-1 чено. i Следующий фрагмент программы позволяет построить централь- < ную проекцию дома спереди с отсеченной дальней стеной (рис. 8.57): SET-BACK-PLANE-CLIPPI NG(true); SET-VIEW-REFERENCE-POINT(0.0, 0.0, 54.0); WIND0W(—1.0, 17.0, —1.0, 17.0); SE7_PR0JEC77CW(”PERSPECTIVE”, 8.0, 6.0, 30.0); SET-VIEW-DEPTH (—1,0, 23.0); CREATE-SEGMENT(10); HOUSE-, CLOSE-SEGMENT 8.7.5. Использование преобразований образа Ниже показано, как с помощью трехмерных преобразований образа (рассмотренных в разд. 8.6) поворачивать в трехмерном НК-пространстве усеченную часть молекулы вокруг прямой, па- раллельной оси у экрана и проходящей через точку с координатами х=0.5, z—0.5. Фрагмент программы приведен на рис. 8.58. Вначале молекула изображается с использованием параллельного проеци- рования и видимого объема протяженностью 10.0X10.0X10.0. При этом предполагается, что молекула имеет большие размеры. Видимый объем отображается в трехмерное поле вывода, которое {процедура, формирующая молекулу) {ПГП} {интерактивный цикл) {переводим в радианы) {Прежде всего определим видимый объем размером 10X10X10} SET_V1EW_DEPTH(3O.O, 40.0); WINDOW(15.0, 25.0, 23.0, 33.0); {Установим другие видовые параметры} SET-FRONT-PLANE-CL1 PPI NG(trw); SET-BACK-PLANE-CL1 PPI NG(trwy, SET -PROJECT I ON (”P ARALLEL”, 0.0, 0.0, —1.0); {параллельно оси г} SET-VIEWPORT-3(0.15, 0.85, 0.15, 0.85, 0.15, 0.85); CR EA ТЕ - SE GMENT(molecu le); MOLECULE; CLOSE-SEGMENT repeat READ-VALUATOR(1, angle); angle := angle» 6.28; {Вычисляем матрицу размером 4x4, состоящую из} xform := Т(—0.5, 0.0, -0.5) * RY(angle) * 7(0.5, 0.0, 0.5); SET-IMAGE-XFORM-3(molecule, xform); WAIT-BUTTON(0,033, number); {ждем 1/30c} until number <> 0 {завершаем интерактивный цикл, если нажата кнопка} Рис. 8.58. Фрагмент программы, предназначенный для вращений молекулы с помощью преобразований образа.
Изображение трехмерных ..объектов 363 меньше трехмерного НК-пространства настолько, что усеченная молекула при повороте всегда будет полностью оставаться в пре- делах этого пространства. Угол в программе считывается с помощью валюатора. Новое пре- образование образа вычисляется и используется каждую 1/30 с, до тех пор, пока нажатием кнопки диалог не завершится. Применяе- мое преобразование образа является композицией переноса цен- тра вращения в начало координат, поворота вокруг оси у и еще одного переноса назад в центр вращения, 8.8. ЗАКЛЮЧЕНИЕ В этой главе подробно рассмотрен процесс вывода трехмерной графической информации: даны определения плоских геометриче- ских проекций, математические основы проекций, описаны действи- тельная реализация и применения в современном графическом па- кете. К сожалению, не все графические системы поддерживают полный набор проекций, поэтому не исключено, что прикладному программисту в действительности придется реализовать некоторые части математического аппарата, изложенного выше. УПРАЖНЕНИЯ 8.1. Напишите программу, которая принимает спецификации процесса вывода и вычисляет Л/парал и Ацентр- 8.2. Напишите программы для трехмерных алгоритмов отсечения для парал- лельной и центральной проекций. 8.3. Полагая F=—со и В=-|-со, покажите, что трехмерное отсечение по бес- конечному прямоугольному объему и последующее параллельное проецирование эквивалентны параллельному проецированию и затем двумерному отсечению. 8.4. Покажите, что если все объекты расположены перед центром проекции и F=—со, а В=-|-со, то трехмерное отсечение по усеченной пирамиде, за кото- рым следует центральное проецирование, эквивалентно ситуации, когда вначале производится центральное проецирование, а после этого двумерное отсечение. 8.5. Проверьте, что SaeHTp (разд. 8.4.2) преобразует видимый объем, пока- занный на рис. 8.36, а, в видимый объем, изображенный на рис. 8.36, б. 8.6. Напишите программу для трехмерного отсечения по границам единич- ного куба. Обобщите ее, чтобы можно было проводить отсечение относительно лю- бого прямоугольного тела, грани которого перпендикулярны главным координат- ным осям. Оцените, какая из двух программ более эффективна: обобщенная про- грамма или программа для частного случая единичного куба? 8.7. Напишите программу для трехмерного отсечения по границам канониче- ского видимого объема для центральной проекции. Обобщите ее на случай видимо- го объема, определяемого неравенствами —a-zo<xo<h-zo, —c-zo<t/o<d-zo, ztninCzz,Czmax- Так задается видимый объем после шагов 1—4 нормирующего преобразования для центральной проекции. Какой из случаев более эффективен? 8.8. Напишите программу для трехмерного отсечения по границам произ- вольного шестигранного видимого объема, грани которого определяются уравне- ниями AfX-f- Bzz/4-Czz4-£> = 0, 1 i 6.
364 Глава 8 Сравните вычислительные затраты в данном случае с теми, которые требуютсж а) для отсечения по каждому из канонических видимых объемов; б) для применения Амарал и отсечения по границам единичного куба. 8.9. Пусть в трехмерном пространстве задан отрезок, соединяющий точки*, Pi (6, 10, 3) и Р2 (—3, —5, 2), и пирамида видимости, определяемая плоскостями! г—+х, z — — х, z= + y, г = —у. Картинная плоскость совпадает с плоскостью zv=l. а) Проведите трехмерное отсечение отрезка (используя параметрические урав- нения прямой), затем спроецируйте его на картинную плоскость. Каковы усечен- ные крайние точки на этой плоскости? б) Спроецируйте отрезок на картинную плоскость, затем проведите отсече- ние с использованием двумерных вычислений. Каковы усеченные крайние точки на плоскости? Если ответы в п. а) и б) будут не одинаковы, подумайте, почему. 8.10. Покажите, что произойдет, если объект при проецировании с помощью •Мцентр и при последующем отсечении будет находиться «позади» центра про- екции. 8.11. Покажите, что если rv. min=rv. 1пах=0, то трехмерные преобразования, используемые для отображения канонического видимого объема в трехмерное поле вывода, приводят к тем же результатам в трехмерном нормированном простран- стве, что и при полном отсутствии преобразований образа. Рис. 8.59. 8.12. Напишите интерактивную программу, аналогичную приведенной на рис. 8.53, которая позволяла бы «облетать» мировое координатное пространство путем управления параметрами VRP и VPN, т. е. основываясь на шести вводимых значениях. Воспользуйтесь окном постоянного размера и центром проекции, уда- ленным на фиксированное расстояние от VRP и находящимся на прямой, которая проходит через VRP параллельно VPN. Примите три величины, используемые для управления «направлением» (параметр VPN), в качестве направляющих косину- сов, тогда вычисление положения центра проекции по отношению к VRP станет тривиальным. 8.13. Напишите процедуру, для которой вводимыми значениями являются I, а (для задания косоугольной параллельной проекции), VUP и VPN, а выводимы- ми — направление проецирования, необходимое для построения желаемой косо- угольной проекции иа плоскости, перпендикулярной VPN, при «вертикали», которая определяется вектором VUP. Отметим, что в этом случае VRP не тре- буется, поскольку для решения необходимы только повороты, но не переносы. 8.14. Рассмотрите двумерную видовую операцию с повернутым окном. Пред- ложите нормирующее преобразование для отображения окна в единичный квад- рат. Окно задается с помощью umjn, wmin, «max- «шах в системе координат uv (рис. 8.59). Покажите, что результат будет тот же, что и при использовании об-
Изображение трехмерных объектов 36Jr щего трехмерного преобразования Амарал в случае, если проекционной плос- костью является плоскость ху, a VUP имеет х-компоненту, равную —cos 0, и (/-компоненту, равную sin 0. 8.15. Матрица Л4центр из разд. 8.2 описывает одноточечную центральную проекцию. Найдите матрицу размером 4X4, определяющую двухточечную и трех- точечную центральные проекции. Указание. Попробуйте умножить Л4центр на различные матрицы поворота. 8.16. Найдите результат применения Л4центр к точкам, координаты г которых меньше нуля? 8.17. Придумайте алгоритм отсечения относительно видимого объема, имею- щего форму конуса (кругового). Вершина конуса находится в начале координат и имеет внутренний угол, равный 90°. Ось конуса совпадает с положительным на- правлением оси г. Рассмотрите возможность использования сферической системы координат. 8.18. Разработайте и реализуйте набор вспомогательных подпрограмм для построения матрицы преобразования размером 4X4 из произвольной последова- тельности элементарных преобразований R, S и Т. 8.19. Изобразите дерево решений, используемое для исследования проекции с целью определения ее типа. Примените это дерево к различным рисункам в дан- ной главе. 8.20. В конце раздела, посвященного преобразованиям образа, говорилось о двух альтернативных подходах к применению /центр илн /парал (соответствую- щего из них). В первом случае преобразование применяется лишь одни раз, сразу после отсечения примитивов, во втором — используется всякий раз, когда задается преобразование образа. Какой из этих случаев более эффективен? 8.21. Оцените соотношения быстродействия, с которыми выполняются трех- мерные отсечения с использованием алгоритмов Коэна — Сазерленда и деления средней точкой при различных предположениях об относительных скоростях вы- полнения операций сдвига/сложения в сравнении с операциями умножения/де- ления.
ОГЛАВЛЕНИЕ Предисловие редактора перевода ....................................... 5 Предисловие авторов................................................... 7 Глава 1. Что такое интерактивная графика?......................... 11 1.1. Введение................................................. 11 1.2. Обработка образов как анализ изображений................. 14 1.3. Достоинства интерактивной графики 15 1.4. Типичные примеры использования машинной графики.......... 18 1,5. Классификация применений................................. 24 1.6. Интерактивная графика в будущем — обычный вид взаимодейст- вия .......................................................... 26 1.7. Краткая история машинной графики......................... 31 1.8. Программистская модель интерактивной графики............. 39 Упражнения.................................................... 43 Глава 2. Основы интерактивного графического программи- рования ........................................................... 45 2.1. Модели, описание изображения и интерактивность........... 45 2.2. Простой графический пакет ............................... 52 2.3. Вывод графиков . . .................................... 54 2.4. Окна и отсечение......................................... 58 2.5. Сегментация............................................ 61 2.6. Простой график........................................... 63 2.7. Поля вывода............................................ 64 2.8. Цепочки литер............................................ 67 2.9. Возможности ПГП при формировании изображений............. 69 2.10. Интерактивная графическая программа -размещения символов 69 2.11. Генерация изображения по структуре данных................ 70 2.12. Интерактивное программирование........................... 74 2.13. Программа, использующая кнопки для вызова функций .... 79 2.14. Меню для вызова функций.................................. 81 2.15. Задание заголовка........................................ 86 2.16. Добавление символа к структуре данных............... 90 2.17. Стирание (удаление) символов.............................. 99 2.18. Изменение вида путем увеличения части изображения .... 101 2.19. Добавление сплошных областей на растровых дисплеях .... 110 2.20. Альтернативная реализация............................... 111 2.21. Заключение............................................... 112 Упражнения...........................’......................... 113 Глава 3. Технические средства машинной графики .... 116 3.1. Графический вывод......................................... 118 3.2, Дисплеи . . .............................................. 126 3.3. Дисплейный процессор с произвольным сканированием .... 139
Изображение трехмерных объектов 367 3.4. Устройство ввода-для диалога с оператором................... 156 3.5. Дисплейный процессор с растровым сканированием.............. 159 Упражнения....................................................... 165 Глава 4. Реализация простого графического пакета .... 16? 4.1. Общее описание простого графического пакета................. 167 4.2. Видовая операциц............................................ 174 4.3. Генерация программы дисплейного процессора.................. 186 4.4. Синхронизация центрального и дисплейного процессоров .... 201 4.5. Обработка прерываний........................................ 204 4.6. Сегментирование дисплейных программ для других устройств . . 206 4.7. Обработка ошибок............................................ 209 4.8. Независимость пакета от графических устройств............... 211 4.9. Заключение.................................................. 214 Упражнения....................................................... 216 Глава 5. Диалоговые устройства и интерактивные методы 219 5.1. Классы логических устройств................................. 219 5.2. Физические диалоговые устройства............................ 220 5.3. Методы моделирования логических устройств................... 235 5.4. Интерактивные методы........................................ 248 Упражнения....................................................... 255 Глава 6. Проектирование графического диалога......................... 256 6.1. Языковая аналогия........................................... 258 6.2. Языковая модель............................................. 260 6.3. Принципы проектирования..................................... 263 6.4. Процесс проектирования...................................... 282 Упражнения....................................................... 288 Глава 7. Геометрические преобразования .............................. 290 7.1. Двумерные преобразования.................................... 290 7.2. Однородные координаты и матричное представление двумерных преобразований............................................... 293 7.3. Композиция двумерных преобразований......................... 296 7.4. Вопросы эффективности....................................... 299 7.5. Матричное представление трехмерных преобразований...... 300 7.6. Композиция трехмерных преобразований . . ................... 304 7.7. Преобразование как изменение систем координат .............. 307 Упражнения....................................................... 311 Глава 8. Изображение трехмерных объектов............................. 313 8.1. Проекции.................................................... 314 8.2. Математическое описание плоских геометрических проекций . . . 321 8.3, Задание произвольных проекций трехмерных объектов........... 326 8.4. Вычисление плоских геометрических проекций.................. 330 8.5. Отсечение относительно канонического видимого объема .... 342 8.6. Преобразования образа....................................... 343 8.7. Вывод трехмерной графической информации в ПГП............... 350 8.8. Заключение.................................................. 363 Упражнения....................................................... 363