РЕФЕРАТ
Отчет по НИРС: __ с., __ рис., __ источников
Объектом данного НИРС является процесс моделирования, который подразумевает под собой определённую группу действий или событий. Целью исследования является построения систем визуализации моделей раскроя и их модификации.
При выполнении данной работы необходимо: проанализировать способы и методы создание универсального хранилища данных, на примере построения динамически формируемого информационного файла или же другими словами - метафайл. Исследовать основные графические возможностей языка высокого уровня С#, а также рассмотреть возможность построения криволинейных поверхностей, основываясь на графической библиотеке GDI+.
В дальнейшем необходимо будет изучить и реализовать систему интерактивного конструирования моделей одежды, разработать возможность изменять модель на усмотрение пользователя.
ХРАНИЛИЩЕ, ГРАФИКА, СПЛАЙН, МЕТАФАЙЛ, ШАБЛОН, OPENGL
СОДЕРЖАНИЕ
Введение
1. Способы и методы создание хранилищ данных
2. Выбор библиотеки визуализации
2.1. Библиотека Direct3D
2.2. Библиотека OpenGL
2.3. Библиотека GDI+
3. Обзор языков высокого уровня
3.1. Язык высокого уровня С++
3.2. Язык высокого уровня С#
4. Построения криволинейных поверхностей
4.1. Сплайн Безье
4.2. Кубические сплайны
Выводы
Список использованных источников
ВВЕДЕНИЕ
Цель НИРС – исследование построения систем визуализации моделей и их модификации. В связи с поставленной целью необходимо выполнить следующие главные задачи.
Исследовать методы построения чертежей выкроек.
Изучить существующие системы визуализации.
Проанализировать способы реализации выкроек моделей одежды для создания системы индивидуального пошива.
Одним из наиболее популярных направлений разработки программного обеспечения на сегодняшний день является разработка систем поддержки принятия решений. Как известно, структурно любая СППР состоит из базы данных, базы моделей и средств визуализации. База данных содержит начальную информацию о решаемой задаче и результаты выполнения промежуточных шагов поиска решений. База шаблонов содержит правила и ограничения, по которым входная информация преобразуется в выходную. Средства визуализации позволяют пользователю в интерактивном режиме задавать начальную информацию о решаемой задаче, контролировать процесс выполнения реализуемых методов и алгоритмов, а также оценивать полученные решения. СППР на сегодняшний день применяются практически во всех областях знаний. В данной работе проводятся исследования возможности построения СППР для решения задачи интерактивного конструирования моделей одежды, когда пользователь по выбранному шаблону проектирует модель, добавляя к шаблону выбранные детали и преобразовывая её в соответствии с заданными размерами.
1. СПОСОБЫ И МЕТОДЫ СОЗДАНИЕ ХРАНИЛИЩ ДАННЫХ
Работая с графикой, рано или поздно возникнет задача в передаче информации от одной программы к другой. Для того чтобы наша программа могла быстро и с наименьшими трудностями сохранить данные, необходимо воспользоваться стандартом Windows - WMF. WMF - аббревиатура от "Windows Metafile Format"(Метафайл Windows). Используется для обмена графической информацией между приложениями, а также для компактного хранения информации рисования. Поддерживает векторую и растровую графику. В метафайле записаны команды интерфейса графических устройств (GDI-команды), каждая из которых описывает одну графическую функцию. Для того, чтобы отобразить метафайл, программа передает эти команды специальной функции, которая воспроизводит изображение. Метафайлы обеспечивают независимые от устройства средства хранения и выборки графической информации. В отличие от растровых файлов, хранящих графическую информацию непосредственно, а в виде пикселов, метафайлы идеально подходят для таких изображений, как карты, диаграммы, архитектурные чертежи и другие рисунки, состоящие из перекрывающихся фрагментов. Так, например, в САПР, метафайлы могут применяться для запоминания данных. Они также полезны при передаче изображений в их собственных форматах в системный буфер, для использования их другими приложениями. Если изображение может быть нарисовано с помощью команд GDI, оно может быть передано другой программе как метафайл. При этом подразумевается, что программа знает, как интерпретировать команды метафайла. Все наиболее популярные приложения используют WMF-файлы для хранения графической информации. Исходя из выше описанного, можно сказать, что для реализации универсального хранилища данных, необходимо применить метафайл-структуру, которая формируется динамически в процессе создания и дальнейшей модернизации моделей одежды. Процесс формирования можно разбить на два этапа: формирование в процессе создания шаблона, и дополнение или корректировка в дальнейшем. Первый подразумевает под собою создание некоторой информации для рисования, после того как будет создан шаблон модели по указанным размерам. Второй этап, это корректировка уже существующей информации в метафайле, т.е. когда необходима визуальная модернизация, или же дополнение новой как следствие присоединения новых, некоторых отдельно заданных деталей.
2 ВЫБОР БИБЛИОТЕКИ ВИЗУАЛИЗАЦИИ
OpenGL и Direct3D - две основные на сегодняшний день аппаратно-ускоряемые библиотеки для создания компьютерной трехмерной графики, а также библиотека GDI+ (дополненная GDI), предназначенная для работы в рамках Microsoft .NET Framework, также основанная на OpenGL и Direct3D, и представляет собою набор классов. Эти классы инкапсулируют поведение объектов и инструментов, предназначенных для рисования. Рассмотрим более подробно каждую из них.
2.1 Direct3D
Фундаментальная задача аппаратно-ускоряемого графического API — дать возможность прикладным программистам использовать последние достижения быстро развивающейся технологии ускорителей трехмерной графики и в то же время добиться хоть какой-то совместимости и унификации решений на разных аппаратных платформах.
В DirectX 9.0 функциональность DirectDraw и Direct3D объединена в единый API, названный DirectX Graphics. Direct3D — часть этого компонента и будет в центре нашего внимания. Microsoft Direct3D предоставляет программисту выбор из двух вариантов: использовать конвейер стандартных функций (fixed-function pipeline) или программируемый конвейер (programmable pipeline). Первый полагается на существующие алгоритмы, стандартизированные в Direct3D. Стандартные функции (fixed functions) предоставляются через фиксированный набор перечислимых значений по аналогии с OpenGL. Это подразумевает, что конвейеры стандартных функций и в Direct3D, и в OpenGL используют внутренние операторы switch. Некоторые из блоков case, соответствующих перечислимому значению в операторе switch, могут выполняться с аппаратным ускорением в зависимости от функциональности (возможностей) графической платы, с которой имеет дело исполняющая среда (runtime). При использовании конвейера стандартных функций в Direct3D программист сначала проверяет через исполняющую среду, поддерживает ли данная графическая плата конкретную функциональность.
Поскольку некоторые графические платы поддерживают не все функции, доступные через Direct3D, предусмотрен механизм проверки возможностей аппаратного обеспечения. Если данная функция не поддерживается аппаратно, проверка заканчивается неудачей, что позволяет программисту переключиться на другой алгоритм с аппаратным ускорением. Главное — помнить, что Direct3D-конвейер стандартных функций предоставляет доступ к аппаратной функциональности. Хотя в Direct3D есть режим чисто программной эмуляции (software-only emulation mode), также называемый эталонным устройством (reference device), он предназначен только для отладки и тестирования.
Другой, более интересный подход к проблеме параллельной эволюции аппаратного и программного обеспечения — применение программируемого конвейера. В этом случае вместо выбора предопределенного перечислимого значения и запроса к Direct3D на выполнение соответствующего алгоритма программист определяет собственный алгоритм. Исполняющая среда Direct3D динамически компилирует этот алгоритм для нижележащего аппаратного обеспечения, взаимодействуя с JIT-компилятором, который является частью драйвера устройства. За создание JIT-компиляторов для конкретных графических устройств отвечают поставщики оборудования. Таким образом, Direct3D выступает в роли графической виртуальной машины (graphics virtual machine), которая фактически виртуализирует графический процессор (GPU) на основе пользовательского набора команд для графических операций.
Хотя оба программных уровня Direct3D (управляемый и неуправляемый) предоставляются через группы объектов, не следует считать их инфраструктурой программирования прикладного уровня. Основная роль архитектуры Direct3D — обеспечить доступ к базовой функциональности решениям более высокого уровня, например API игровых движков. Чтобы упростить реализацию таких решений, библиотека расширений Direct3D (Direct3D extension library) явным образом предоставляет дополнительную функциональность. Для лучшего понимания архитектуры Direct3D вы должны разобраться не только в абстрагируемой функциональности, но и в том, как эта функциональность структурирована и как к ней обращаться. В нескольких следующих разделах мы дадим обзор основных элементов архитектуры Direct3D и обсудим, каким образом организован доступ к ним из неуправляемого COM API и управляемого уровня абстракции .NET. Как это нередко бывает в архитектурах компьютерного аппаратного обеспечения, в архитектурах аппаратного ускорения трехмерной графики применяются два способа оптимизации: конвейеризация (pipelining) и параллелизация (parallelizing). Алгоритмы, доступные через Direct3D, логически организованы в конвейер.
Конвейер Direct3D следует рассматривать как набор алгоритмов, выполняющих операции над трехмерными геометрическими величинами (3D geometric quantities), каковыми в случае Direct3D являются предопределенные вершины (vertices) и примитивы (primitives). Основное предназначение конвейера — преобразование геометрических данных в изображение, формируемое на экране. Этап тесселяции в Direct3D — разбиение на треугольники фиксированного набора предопределенных примитивов более высокого порядка, в том числе треугольных (triangle patches), прямоугольных (rectangle patches) и полигональных участков поверхностей (N patches) (хотя треугольные участки поверхности остаются наиболее распространенной формой). В настоящее время этап тесселяции нельзя программировать, поэтому Direct3D не предоставляет никаких механизмов для генерации геометрических данных на основе программируемых процедур. А такая возможность позволила бы резко уменьшить объемы данных, пересылаемых по шине. Аппаратная поддержка программирования этапа тесселяции, видимо, появится в ближайшем будущем [4].
Этап трансформаций и освещения (transform and lighting, T&L) обеспечивает преобразование позиций вершин и трансляцию системы координат модели в мировую систему координат и систему координат камеры. Вычисления освещенности для каждой вершины выполняются для определения отраженной и рассеянной цветовых компонент (specular and diffuse color components). Затем позиции вершин модифицируются в ходе трансформации проекции (projection transformation), чтобы получить перспективную проекцию (perspective projection), ортогональную (orthographic projection) или другого типа. Хотя конвейер стандартных функций по-прежнему предоставляет эти алгоритмы T&L через тот же API, что и раньше, в большинстве графических плат они могут быть реализованы на уровне микрокода графического процессора. Так, в процессоре Radeon 9700 весь модуль T&L можно и нужно реализовать в программируемом конвейере как вершинные шейдеры (vertex shaders).
Для большего быстродействия на этапе растеризации любые вершины невидимых камере объектов вырезаются (clip). А чтобы избежать растеризации треугольников, отвернутых от камеры, может выполняться операция отсечения невидимых поверхностей (back-face culling). Более того, для выбора и настройки реальных алгоритмов, которые будут задействованы на этапе растеризации, используется оценка атрибутов (attribute evaluation). Наконец, после всех этих оптимизаций начинается собственно растеризация, в ходе которой осуществляется рендеринг пикселов.
На этапе обработки пикселов вы можете использовать для определения значения цвета (color value) пиксела либо мультитекстурирование на основе стандартных функций (fixed-function multi-texturing), либо программируемые пиксельные шейдеры (pixel shaders). Мультитекстурирование на основе стандартных функций реализуется за счет многопроходного наложения текстур, причем на каждом проходе над значениями цвета и прозрачности (color and alpha values) пиксела можно выполнять фиксированный набор операций. Пиксельные шейдеры дают гораздо большую гибкость, позволяя оперировать значениями цвета и прозрачности на собственном языке ассемблера (custom assembly language). Алгоритмы, реализованные на этапе обработки пикселов, включают наложение рельефа (bump mapping), затенение (shadowing), наложение карты среды (environment mapping) и т. д.
При обработке буфера кадра (frame buffer processing) используется набор регионов памяти, известных как поверхность рендеринга (render surface), буфер глубины (depth buffer) и буфер шаблонов (stencil buffer). На этом этапе выполняется серия вычислений для определения таких параметров, как глубина, прозрачность (alpha) и шаблон (stencil). Буфер глубины — это еще один метод оптимизации рендеринга, применяемый для удаления скрытых линий и поверхностей. Проверка глубины позволяет выяснить, какие пикселы скрыты и не нуждаются в рендеринге. При этом используется либо z-буфер, либо w-буфер (у каждого из них свои плюсы и минусы). Обработка буфера кадра дает возможность создавать ряд эффектов, в том числе прозрачность (transparency), туман (fog) и тени (shadows).
В конвейере Direct3D, — его поведение можно изменять через состояние графики (graphics state). Это состояние используется для настройки многих алгоритмов трансформации, освещения, растеризации, обработки пикселов и буфера кадра, предоставляемых Direct3D для рендеринга кадра. Оно включает состояния рендеринга (render state), трансформации (transformation state), сэмплера (sampler state) и наложения текстур (texture stage state) [5].
2.2 OpenGL
Сейчас трёхмерные изображения можно увидеть везде, начиная от компьютерных игр и заканчивая системами моделирования в реальном времени. Раньше, когда трёхмерная графика существовала только на суперкомпьютерах, не существовало единого стандарта в области графики. Все программы писались с "нуля" или с использованием накопленного опыта, но в каждой программе реализовывались свои методы для отображения графической информации. С приходом мощных процессоров и графических ускорителей трёхмерная графика стала реальностью для персональных компьютеров. Но в тоже время производители программного обеспечения столкнулись с серьёзной проблемой - это отсутствие каких-либо стандартов, которые позволяли писать программы, независимые от оборудования и операционной системы. Одним из первых таких стандартов, существующий и по сей день является OpenGL.
OpenGL - это графический стандарт в области компьютерной графики. На данный момент он является одним из самых популярных графических стандартов во всём мире. Ещё в 1982 г. в Стенфордском университете была разработана концепция графической машины, на основе которой фирма Silicon Graphics в своей рабочей станции Silicon IRIS реализовала конвейер рендеринга. Таким образом была разработана графическая библиотека IRIS GL. На основе библиотеки IRIS GL, в 1992 году был разработан и утверждён графический стандарт OpenGL. Разработчики OpenGL - это крупнейшие фирмы разработчики как оборудования так и программного обеспечения: Silicon Graphics, Inc., Microsoft, IBM Corporation, Sun Microsystems, Inc., Digital Equipment Corporation (DEC), Evans & Sutherland, Hewlett-Packard Corporation, Intel Corporation и Intergraph Corporation.
OpenGL переводится как Открытая Графическая Библиотека (Open Graphics Library), это означает, что OpenGL - это открытый и мобильный стандарт. Программы, написанные с помощью OpenGL можно переносить практически на любые платформы, получая при этом одинаковый результат, будь это графическая станция или суперкомпьютер. OpenGL освобождает программиста от написания программ для конкретного оборудования. Если устройство поддерживает какую-то функцию, то эта функция выполняется аппаратно, если нет, то библиотека выполняет её программно.
Что же представляет из себя OpenGL? С точки зрения программиста OpenGL - это программный интерфейс для графических устройств, таких как графические ускорители. Он включает в себя около 150 различных команд, с помощью которых программист может определять различные объекты и производить рендеринг. Говоря более простым языком, вы определяете объекты, задаёте их местоположение в трёхмерном пространстве, определяете другие параметры (поворот, масштаб, ...), задаёте свойства объектов (цвет, текстура, материал, ...), положение наблюдателя, а библиотека OpenGL позаботится о том чтобы отобразить всё это на экране. Поэтому можно сказать, что библиотека OpenGL является только воспроизводящей (Rendering), и занимается только отображением 3Д обьектов, она не работает с устройствами ввода (клавиатуры, мыши). Также она не поддерживает менеджер окон.
OpenGL имеет хорошо продуманную внутреннюю структуру и довольно простой процедурный интерфейс. Несмотря на это с помощью OpenGL можно создавать сложные и мощные программные комплексы, затрачивая при этом минимальное время по сравнению с другими графическими библиотеками.
В некоторых библиотеках OpenGL (например под X Windows) имеется возможность изображать результат не только на локальной машине, но также и по сети. Приложение, которое вырабатывает команды OpenGL называется клиентом, а приложение, которое получает эти команды и отображает результат - сервером. Таким образом можно строить очень мощные воспроизводящие комплексы на основе нескольких рабочих станций или серверов, соединённых сетью [6]. Что предоставляет библиотека в распоряжение программиста? Основные возможности:
1) геометрические и растровые примитивы. На основе геометрических и растровых примитивов строятся все объекты. Из геометрических примитивов библиотека предоставляет: точки, линии, полигоны. Из растровых: битовый массив(bitmap) и образ(image)
2) использование В-сплайнов. B-сплайны используются для рисования кривых по опорным точкам.
3) видовые и модельные преобразования. С помощью этих преобразований можно располагать обьекты в пространстве, вращать их, изменять форму, а также изменять положение камеры, из которой ведётся наблюдение.
4) работа с цветом. OpenGL предоставляет программисту возможность работы с цветом в режиме RGBA (красный-зелёный-синий-альфа) или, используя индексный режим, где цвет выбирается из палитры.
5) удаление невидимых линий и поверхностей. Z-буферизация.
Двойная буферизация. OpenGL предоставляет как одинарную, так и двойную буферизацию. Двойная буферизация используется для того, чтобы устранить мерцание при мультипликации, т.е. изображение каждого кадра сначала рисуется во втором (невидимом) буфере, а потом, когда кадр полностью нарисован, весь буфер отображается на экране.
6) наложение текстуры. Позволяет придавать объектам реалистичность. На объект, например шар, накладывается текстура(просто какое-то изображение), в результате чего наш объект теперь выглядит не просто как шар, а как разноцветный мячик.
7) сглаживание. Сглаживание позволяет скрыть ступенчатость, свойственную растровым дисплеям. Сглаживание изменяет интенсивность и цвет пикселей около линии, при этом линия смотрится на экране без всяких зигзагов.
8) освещение. Позволяет задавать источники света, их расположение, интенсивность, и т.д.
9) атмосферные эффекты. Например туман, дым. Всё это также позволяет придать объектам или сцене реалистичность, а также "почувствовать" глубину сцены.
10) прозрачность объектов.
2.3 Библиотека GDI+
GDI+ - это набор программных средств, которые используются в .NET.
GDI+ позволяют создателям приложений выводить данные на экран или на принтер без необходимости обеспечивать работу с определенными типами устройств отображения. Для отображения информации программисту достаточно вызывать нужные методы классов GDI+. При этом автоматически учитываются типы определенных устройств и выполняются вызовы соответствующих драйверов. Интерфейс GDI+ является развитием GDI (Graphic User Interace), использованного в ранних версиях Windows. Таким образом, модификация GDI для .NET называется GDI+.
При создании ОС Microsoft Windows компания Microsoft избавила программистов от необходимости учитывать аппаратные особенности видеоадаптеров, переложив эту задачу на драйверы видеоадаптеров. Эти драйверы создаются разработчиками видеоадаптеров и наилучшим образом реализуют возможности аппаратуры.
Что же касается приложений, то для них в составе ОС Microsoft Windows был предусмотрен набор системных функций, реализующих интерфейс графических устройств (Graphics Device Interface, GDI).
Интерфейс графических устройств GDI, как это можно предположить из названия, предназначен для взаимодействия приложений Microsoft Windows с графическими устройствами, такими как видеоадаптер, принтер или плоттер.
Когда приложения обращаются к GDI для выполнения операции вывода графического изображения, они работают не с реальными (физическими) устройствами вывода, а с логическими устройствами. Приложения Microsoft Windows не определяют тип видеоадаптера (EGA, VGA, SVGA и т.п.), а работают с логическим видеоадаптером, имеющим феноменальные характеристики: способность отображать практически любой цвет, имеющим огромное разрешение и т. д.
Выполняя запрос приложения, GDI обращается к драйверу соответствующего устройства вывода, работающему, в свою очередь, непосредственно с физическим устройством вывода. В процессе выполнения запроса GDI (или драйвер) учитывает ограниченные возможности видеоадаптера и его аппаратные особенности, делая необходимые приближения.
Например, приложение может указать для цвета линии любой из примерно 16 млн. цветов, однако не всякое устройство обладает таким цветовым разрешением (ограничения на количество одновременно отображаемых цветов присутствуют, например, в карманных компьютерах). В зависимости от типа физического устройства, используемого для вывода, GDI может выбрать для отображения цвет, наиболее соответствующий запрошенному цвету, и допустимый для устройства.
Например, если устройство вывода монохромное, вместо различных цветов могут использоваться градации серого цвета. Поэтому приложение может запросить для вывода любой цвет, но для рисования будет использован только такой, который может использовать данное физическое устройство [4].
Такая ситуация, когда приложение запрашивает у ОС Microsoft Windows одно, а получает другое, возникает не только при работе с цветом. Приложение может запросить для вывода шрифт, описав его характеристики. Интерфейс GDI подберет для вывода наиболее подходящий (с его точки зрения) шрифт, соответствующий описанию, и предоставит его приложению.
Приложения Microsoft Windows способны работать в неизменном виде на любом оборудовании, лишь бы был соответствующий драйвер. Чем лучше используемая аппаратура, чем большими возможностями она обладает, тем ближе будут параметры полученного шрифта и цвета соответствовать запрошенным.
Поэтому даже если сейчас в нашем распоряжении есть только видеоадаптер с ограниченным количеством отображаемых цветов, при разработке приложений Microsoft Windows Вы можете не ограничивать себя дюжиной цветов. Ваше приложение должно быть сделано так, чтобы оно могло использовать любой цвет. Со временем, когда у Вас появится современный видеоадаптер, окно Вашего приложения засветится всеми цветами радуги, причем для этого не придется вносить никаких изменений в само приложение.
С точки зрения приложений, интерфейс GDI состоит из контекста отображения и инструментов, предназначенных для рисования.
Контекст отображения можно сравнить с листом бумаги, на котором приложение рисует то или иное графическое изображение, а также пишет текст. Инструменты для рисования — это перья, кисти (а также шрифты и даже целые графические изображения), с помощью которых создается изображение.
Кроме контекста отображения и инструментов для рисования, приложениям доступны десятки функций программного интерфейса GDI, предназначенные для работы с контекстом отображения и инструментами. Что же касается приложений Microsoft .NET Framework, то они реализуют возможности интерфейса GDI+ с помощью набора соответствующих классов и интерфейсов.
В терминах ОС Microsoft Windows контекст отображения (display context) представляет собой структуру данных, описывающую устройство отображения. В этой структуре хранятся различные характеристики устройства и набор инструментов для рисования, выбранный по умолчанию. Приложение может выбирать в контекст отображения различные инструменты (например, перья различной толщины и цвета, с различными «наконечниками»). Поэтому если Вам надо нарисовать линию красного или зеленого цвета, перед выполнением операции следует выбрать в контекст отображения соответствующее перо.
Заметим, что функции рисования GDI, входящие в программный интерфейс Win32 API, не имеют параметров, указывающих цвет или толщину линии. Такие параметры хранятся в контексте отображения.
Приложение может создать контекст отображения не только для окна приложения, но и для любого другого графического устройства вывода, например, для принтера. В последнем случае оно может рисовать на принтере различные изображения, используя те же функции, что и для рисования в окне приложения.
Можно создать контекст отображения для метафайла. Метафайл — это обычный файл или файл в памяти, в котором хранятся последовательности команд интерфейса GDI. Приложение может выполнять графический вывод в метафайл как в обычное устройство вывода, а затем «проигрывать» метафайл на реальном устройстве вывода.
Контекст устройства в терминах ОС Microsoft Windows выступает в роли связующего звена между приложением и драйвером устройства (рис. 1) и представляет собой структуру данных размером примерно 800 байт. Эта структура данных содержит информацию о том, как нужно выполнять операции вывода на данном устройстве (цвет и толщину линии, тип системы координат и т. д.).
Рисунок 2.1 - Вывод данных через контекст устройства
Если приложение получает или создает контекст для устройства отображения, такой контекст называется контекстом отображения (display context). Поэтому когда, например, приложение получает контекст для отображения в одном из своих окон, такой контекст называется контекстом отображения. Если же ему требуется выполнять операцию вывода для устройства (для принтера или для экрана дисплея), приложение должно получить или создать контекст устройства (device context).
Следует понимать, что контексты устройства и отображения содержат описания одних и тех же характеристик и имеют одинаковую структуру. Название контекста определяется только тем, относится ли контекст к окну отображения или устройству вывода.
Концепция графического интерфейса GDI+ несколько отличается от концепции «классического» графического интерфейса GDI, с которым привыкли иметь дело разработчики приложений Microsoft Windows.
Прежде всего, это касается класса Graphics, реализующего в себе как свойства контекста отображения, так и инструменты, предназначенные для рисования в этом контексте [4].
Для того чтобы приложение могло что-нибудь нарисовать в окне, оно должно, прежде всего, получить или создать для этого окна объект класса Graphics. Далее, пользуясь свойствами и методами этого объекта, приложение может рисовать в окне различные фигуры или текстовые строки.
3. ОБЗОР ЯЗЫКОВ ВЫСОКОГО УРОВНЯ
На сегодняшний день существуют множество языков программирование, но самые популярные из них это – С++, и С#. Рассмотрим их более детально.
3.1 Язык высокого уровня С++
Страуструп начал работать над «Си с классами» в 1979 году. Идея создания нового языка принадлежит Страуструпу. Он обнаружил, что язык моделирования Симула (Simula) имеет такие возможности, которые были бы очень полезны для разработки большого программного обеспечения, но работает слишком медленно.
В то же время язык BCPL достаточно быстр, но слишком близок к языкам низкого уровня и не подходит для разработки большого программного обеспечения. Страуструп начал работать в «Bell Labs» над задачами теории очередей (в приложении к моделированию телефонных вызовов). Попытки применения существующих в то время языков моделирования оказались неэффективными. Вспоминая опыт своей диссертации, Страуструп решил дополнить язык Си (преемник BCPL) возможностями, имеющимися в языке Симула. Язык Си, будучи базовым языком системы UNIX, на которой работали компьютеры «Bell» является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами. В результате, практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию Симула-подобных классов) так и с точки зрения времени вычислений (благодаря быстродействию Си). В начале в Си были добавлены классы (с инкапсуляцией), производные классы, строгая проверка типов, inline-функции и аргументы по умолчанию. Разрабатывая Си с классами (позднее С++), Страуструп также написал программу Cfront, транслятор, перерабатывающий исходный код Си с классами в исходный код простого Си. Новый язык, неожиданно для автора, приобрел большую популярность среди коллег и вскоре Страуструп уже не мог лично поддерживать его, отвечая на тысячи вопросов.
В 1983 г. произошло переименование языка из Си с классами в С++ по соображениям маркетинга. Кроме того, в него были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Его первый коммерческий выпуск состоялся в октябре 1985 г.. В 1985 г. вышло первое издание «Языка программирования С++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта. В 1989 г. состоялся выход С++ версии 2.0. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены. В 1990 г. вышло «Комментированное справочное руководство по C++», положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и булевский тип. Стандартная библиотека С++ также развивалась вместе с ним. Первым добавлением к стандартной библиотеке С++ стали потоки ввода/вывода, обеспечивающие средства для замены традиционных функций Си printf и scanf. Позднее самым значительным развитием стандартной библиотеки стало включение в неё Стандартной библиотеки шаблонов.
После многих лет работы совместный комитет ANSI-ISO стандартизировал С++ в 1998 г. (ISO/IEC 14882:1998). В течение нескольких лет после официального выхода стандарта комитет обрабатывал сообщения об ошибках и в итоге выпустил исправленную версию стандарта С++ в 2003 году.
C++ - компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования. В 1990-х годах язык стал одним из наиболее широко применяемых языков программирования общего назначения. При создании С++ стремились сохранить совместимость с языком С. Большинство программ на С будут исправно работать и с компилятором С++. С++ имеет синтаксис, основанный на синтаксисе С [4]. Нововведениями С++ в сравнении с Си являются:
- поддержка объектно-ориентированного программирования через классы;
- поддержка обобщённого программирования через шаблоны;
- дополнения к стандартной библиотеке;
- дополнительные типы данных;
- исключения;
- пространства имён;
- встраиваемые функции;
- перегрузка операторов;
- перегрузка имён функций;
- ссылки и операторы управления свободно распределяемой памятью.
3.2. Язык высокого уровня С#
C# - язык программирования, сочетающий объектно-ориентированные и аспектно-ориентированные концепции. Разработан в 1998—2001 годах группой инженеров под руководством Андерсa Хейлсбергa в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET. Компилятор с C# входит в стандартную установку самой .NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств вроде Visual Studio.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к С++ и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML. Переняв многое от своих предшественников — языков С++, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++) или вывода типов (реализовано в .NET Framework 3.0). C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает FCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR.
Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем. (Однако эта закономерность будет нарушена с выходом C# 3.0, представляющим собой расширения языка, не опирающиеся на расширения платформы .NET.) CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др [4].
4 ПОСТРОЕНИЯ КРИВОЛИНЕЙНЫХ ПОВЕРХНОСТЕЙ
Существуют два метода построения криволинейных поверхностей: первый это – сплайн Безье, второй – канонические сплайны. Рассмотрим более детально способы построения каждого их них.
4.1 Сплайн Безье
Кривы́е Безье́ были разработаны в 60-х годах XX века независимо друг от друга Пьером Безье (Bйzier) из автомобилестроительной компании «Рено» и Полем де Кастелье (de Casteljau) из компании «Ситроен», где применялись для проектирования кузовов автомобилей. Впервые кривые были представлены широкой публике в 1962 году французским инженером Пьером Безье, который, разработав их независимо от де Кастелье, использовал их для компьютерного проектирования автомобильных кузовов. Кривые были названы именем Безье, а именем де Кастелье назван разработанный им рекурсивный способ определения кривых (алгоритм де Кастелье). Впоследствии это открытие стало одним из важнейших инструментов систем автоматизированного проектирования и программ компьютерной графики [1].
Кривая Безье — параметрическая кривая, задаваемая выражением
где — функция компонент векторов опорных вершин, а - базисные функции кривой Безье, называемые также полиномами Бернштейна.
где n — степень полинома, i — порядковый номер опорной вершины.
Сплайны Безье бывают:
1) линейные кривые - при n = 1 кривая представляет собой отрезок прямой линии, опорные точки P0 и P1 определяют его начало и конец. Кривая задаётся уравнением:
2) квадратные кривые Безье (n = 2) задаётся 3-я опорными точками: P0, P1 и P2.
3) кубические кривые Безье (n = 3) описывается следующим уравнением:
Четыре опорные точки P0, P1, P2 и P3, заданные в 2-х или 3-мерном пространстве определяют форму кривой [2].
Рисунок 4.1 - Кубическая кривая Безье (n = 3)
Линия, берёт начало из точки P0 направляясь к P1 и заканчивается в точке P3 подходя к ней со стороны P2. То есть кривая не проходит через точки P1 и P2, они используются для указания её направления. Длина отрезка между P0 и P1 определяет, как скоро кривая повернёт к P3.
В матричной форме кубическая кривая Безье записывается следующим образом:
где называется базисной матрицей Безье:
Построение кривых.
1) Линейные кривые. Параметр t в функции, описывающей линейный случай кривой Безье, определяет, где именно на расстоянии от P0 до P1 находится B(t). Например, при t = 0,25 значение функции B(t) соответствует четверти расстояния между точками P0 и P1. Параметр t изменяется от 0 до 1, а B(t) описывает отрезок прямой между точками P0 и P1.
Рисунок 4.2 - Линейные кривые
2) Квадратные кривые. Для построения квадратных кривых Безье требуется выделение двух промежуточных точек Q0 и Q1 из условия, чтобы параметр t изменялся от 0 до 1:
Точка Q0 изменяется от P0 до P1 и описывает линейную кривую Безье.
Точка Q1 изменяется от P1 до P2 и также описывает линейную кривую Безье.
Точка B0 изменяется от Q0 до Q1 и описывает квадратную кривую Безье.
Рисунок 4.3 - Квадратные кривые
3) Кривые высших степеней. Для построения кривых высших порядков соответственно требуется и больше промежуточных точек. Для кубической кривой это промежуточные точки Q0, Q1 и Q2, описывающие линейные кривые, а также точки R0 и R1, которые описывают квадратные кривые:
Рисунок 4.4 - Кривые высших степеней
Для кривых четвертой степени это будут точки Q0, Q1, Q2 и Q3, описывающие линейные кривые, R0, R1 и R2, которые описывают квадратные кривые, а также точки S0 и S1, описывающие кубические кривые Безье:
Рисунок 4.5 - Кривые четвертой степени
Благодаря простоте задания и возможности удобно манипулировать формой, кривые Безье нашли широкое применение в компьютерной графике для моделирования гладких линий. Поскольку кривая полностью определяется своей выпуклой оболочкой из опорных точек, последние могут быть отображены и использоваться для наглядного управления формой линии. Кроме того, аффинные преобразования кривой (перенос, масштабирование, вращение) также легко могут быть осуществлены путём применения трансформаций к опорным точкам. Наличие выпуклой оболочки значительно облегчает задачу о точках пересечения кривых Безье: если не пересекаются выпуклые оболочки, то не пересекаются и сами кривые .
Наибольшее значение имеют кубические кривые Безье [1]. Кривые высших степеней при обработке требуют большего объёма вычислений и для практических целей используются реже. Для построения сложных по форме линий отдельные кривые Безье могут быть последовательно соединены друг с другом в сплайн Безье. Для того чтобы обеспечить гладкость линии в месте соединения двух кривых, смежные опорные точки обеих кривых должны лежать на одной линии [4]. Существует три программного метода построения:
public void DrawBezier(Pen, Point, Point, Point, Point);
public void DrawBezier(Pen, PointF, PointF, PointF, PointF);
public void DrawBezier(Pen, float, float, float, float, float, float, float, float);
Рисунок 4.6 - Программная реализация
4.2 Кубические сплайны
В отличие от только что описанных кривых линий Безье, линии кубического сплайна (cardinal spline) проходит через все заданные точки [3]. Построение осуществляется по шагам приведенным ниже: запишем для удобства Si(x) в виде:
тогда
.
Для выполнения условия непрерывности
Отсюда получаем формулы для вычисления коэффициентов сплайна:
Рисунок 4.1 - Пример кубического сплайна
Если учесть, что c0 = cn = 0, то вычисление с можно провести с помощью метода прогонки для трехдиагональной матрицы. Существует два программного метода построения кубических сплайнов: метод DrawCurve и DrawClosedCurve [3]. Первый из этих методов рисует незамкнутую кривую линию (открытый сплайн), а второй — замкнутую (закрытый сплайн).
public void DrawCurve(Pen, Point[]);
public void DrawCurve(Pen, PointF[]);
Рисунок 4.2 - Пример закрытого сплайна
ВЫВОДЫ
В результате выполнения НИРС, были изучены: возможность создание универсального хранилища данных, принципы графического построения объектов рисования, способы реализации криволинейных поверхностей, а также сделан ряд выводов.
1) Что касается выбора библиотеки визуализации, то можно остановиться на GDI+, поскольку две остальные предназначены для выполнения куда белее сложных задач, к примеру, написания компьютерных игр, или каких либо других сложных графических комплексов. Ещё одним аргументом GDI+, является, проста в использовании, и реализации;
2) Проанализировав языки высоко уровня можно сказать что язык С# наиболее подходит для выполнения нашей задачи, так как он обладает высоким быстродействием, простотой написания кода, возможностью подключения всех трёх библиотек визуализации;
3) C# решает проблему построения криволинейных поверхностей, используя два вида сплайнов: Безье и кубические;
4) Что касается выбора типа сплайнов, то я остановился на сплайнах Безье, аргументируя это тем, что они оба выполняют одну и ту же функцию, но входные данные различны по сложности, для построения сплайнов Безье необходимы четыре значения, а для кубических – набор точек прохождения всей поверхности.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Лебедев С. А., Мельников В. А. Общее описание методов раскроя. М., 1999;
Глушкова В.М. Кройка и Шитьё. М., 1995;
Юрьев А.А. Системы визуального моделирования. Д.,2005
Шрус О.В. Калмыга В.Г. Основы языков программирования. М., 2002
Краинберг А. Управляемый DirectX, 856с., том 2.
SiliconGraphics Help 3.1 - “OpenGL”. 1250c.