|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[43] Операции высших порядков В дополнение к абстрагированию схем комбинирования рисовалок, мы можем работать и на более высоком уровне, абстрагируя схемы комбинирования операций над рисовалками. А именно, мы можем рассматривать операции над рисовалками в качестве элементов, подлежащих манипуляции, и писать средства комбинирования этих элементов - операции, которые принимают операции над рисовалками как аргументы и создают новые операции. Например, и flipped-pairs, и square-limit располагают определенным образом в виде квадрата четыре копии порождаемого рисовалкой изображения; они отличаются только тем, как они ориентируют эти копии. Один из способов абстрагировать такую схему комбинирования рисовалок представлен следующей процедурой, которая принимает четыре одноаргументных операции и порождает операцию над рисовалками, которая трансформирует данную ей рисовалку с помощью этих четырех операций и расставляет результаты по квадрату. Tl, tr, bl и br - это трансформации, которые следует применить к верхней левой, верхней правой, нижней левой и нижней правой копиям, соответственно. (define (square-of-four tl tr bl br) (lambda (painter) (let ((top (beside (tl painter) (tr painter))) (bottom (beside (bl painter) (br painter)))) (below bottom top)))) Тогда в терминах square-of-four можно определить flipped-pairs следующим образом:24 (define (flipped-pairs painter) (let ((combine4 (square-of-four identity flip-vert identity flip-vert))) (combine4 painter))) а square-limit можно выразить как25 (define (square-limit painter n) (let ((combine4 (square-of-four flip-horiz identity rotate180 flip-vert))) (combine4 (corner-split painter n)))) Упражнение 2.45. Right-split и up-split можно выразить как разновидности общей операции разделения. Определите процедуру split с таким свойством, что вычисление (define right-split (split beside below)) (define up-split (split below beside)) порождает процедуры right-split и up-split с таким же поведением, как и определенные ранее. 24 Мы также могли бы написать (define flipped-pairs (square-of-four identity flip-vert identity flip-vert)) 25Rotate180 поворачивает рисовалку на 180 градусов (см. упражнение 2.50). Вместо rotate180 мы могли бы сказать (compose flip-vert flip-horiz) , используя процедуру compose из упражнения 1.42. вектор edge2 рамки вектор edge1 рамки вектор origin рамки Точка (0,0) на экране Рис. 2.15: Рамка представляется в виде трех векторов двух краев. начальной точки и Рамки Прежде, чем мы сможем показать, как реализуются рисовалки и средства их комбинирования, нам нужно рассмотреть рамки. Рамку можно описать как три вектора - вектор исходной точки и два вектора краев рамки. Вектор исходной точки Origin указывает смещение исходной точки рамки от некой абсолютной начальной точки, а векторы краев Edget и Edge2 указывают смещение углов рамки от ее исходной точки. Если края перпендикулярны, рамка будет прямоугольной. В противном случае рамка будет представлять более общий случай параллелограмма. На рис. 2.15 показаны рамка и соответствующие ей вектора. В соответствии с принципами абстракции данных, нам пока незачем указывать, каким образом представляются рамки; нужно только сказать, что есть конструктор make-frame, который принимает три вектора и выдает рамку, и что есть еще три селектора, origin-frame, edge1-frame и edge2-frame (см. упражнение 2.47). Для определения изображений мы будем использовать координаты в единичном квадрате (0 < x,y < 1). Каждой рамке мы сопоставляем отображение координат рамки (frame coordinate map), которое будет использоваться, чтобы сдвигать и масштабировать изображения так, чтобы они умещались в рамку. Это отображение трансформирует единичный квадрат в рамку, переводя вектор v = (x,y) в сумму векторов Origin(Frame) + x • Edgex (Frame) + y • Edge2(Frame) Например, (0, 0) отображается в исходную точку рамки, (1, 1) в вершину, противоположную исходной точке по диагонали, а (0.5, 0.5) в центр рамки. Мы можем создать отображение координат рамки при помощи следующей процеду-ры:26 26Frame-coord-map использует векторные операции, определенные ниже в упражнении 2.46, и мы предполагаем, что они реализованы для какого-нибудь представления векторов. Благодаря абстракции данных, неважно, каково это представление; нужно только, чтобы операции над векторами вели себя правильно. (define (frame-coord-map frame) (lambda (v) (add-vect (origin-frame frame) (add-vect (scale-vect (xcor-vect v) (edge1-frame frame)) (scale-vect (ycor-vect v) (edge2-frame frame)))))) Заметим, что применение frame-coord-map к рамке дает нам процедуру, которая, получая вектор, возвращает тоже вектор. Если вектор-аргумент находится в единичном квадрате, вектор-результат окажется в рамке. Например, ((frame-coord-map a-frame) (make-vect 0 0)) возвращает тот же вектор, что и (origin-frame a-frame) Упражнение 2.46. Двумерный вектор v, идущий от начала координат к точке, можно представить в виде пары, состоящей из x-координаты и y-координаты. Реализуйте абстракцию данных для векторов, написав конструктор make-vect и соответствующие селекторы xcor-vect и ycor-vect. В терминах своих селекторов и конструктора реализуйте процедуры add-vect, sub-vect и scale-vect, которые выполняют операции сложения, вычитания векторов и умножения вектора на скаляр: (Х1 ,У1) + (Х2 ,У2 ) = (Х1 + Х2 ,У1 + Jft) (Х1, yi) - (Х2, У2) = (Х1 - Х2, yi - Jft) s • (х, y) = (sx, sy) Упражнение 2.47. Вот два варианта конструкторов для рамок: (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) (define (make-frame origin edge1 edge2) (cons origin (cons edge1 edge2))) К каждому из этих конструкторов добавьте соответствующие селекторы, так, чтобы получить реализацию рамок. Рисовалки Рисовалка представляется в виде процедуры, которая, получая в качестве аргумента рамку, рисует определенное изображение, отмасштабированное и сдвинутое так, чтобы уместиться в эту рамку. Это означает, что если есть рисовалка p и рамка f, то мы можем получить изображение, порождаемое p, в f, позвав p с f в качестве аргумента. Детали того, как реализуются элементарные рисовалки, зависят от конкретных характеристик графической системы и типа изображения, которое надо получить. Например, пусть у нас будет процедура draw-line, которая рисует на |
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | ||