Разработка программы, моделирующей муаровый эффект

 












ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по дисциплине: «Проектирование микропроцессорных систем»

на тему: «Разработка программы, моделирующей муаровый эффект»


Задание на курсовое проектирование


Спроектировать и написать программу, моделирующую муаровый эффект, рассчитать вершины, построить исследуемую плоскость. В работе предполагается использование современного языка программирования Visual Basic 2005 и новых технологий DirectX 9.



Реферат


Курсовой проект содержит 80 страниц, 13 рисунков, 4 приложения, было использовано 5 источников.

МУАР, МУАРОВЫЙ ЭФФЕКТ, СЕТКИ, РАСТР, ОПТИЧЕСКАЯ ОСЬ, МАТЕМАТИЧЕСКАЯ МОДЕЛЬ, МОДЕЛИРОВАНИЕ, ТОПОЛОГИЯ ОБЪЕКТА, АЛГОРИТМ, ПРОГРАММА, МОДУЛЬ.

Объектом исследования является модель электронно-проекционного метода определения топологии объектов.

Цель исследования: изучение и разработка программного обеспечения для моделирования электронно-проекционного метода.

В процессе исследования и разработки модели электронно-проекционного метода использовались следующие программные приложения: Visual Basic 2005, DirectX 9.0с SDK, MathCAD 13, 3D Studio Max 6.0. Была разработана программа по моделированию муарового эффекта. Были получены различные муаровые картины.

Область применения: данная разработка может быть использована в исследовании муаровых методов, демонстрации муарового эффекта, определения деформаций на различных поверхностях.


Содержание


Введение5

1.Муаровый эффект6

1.1Природа муарового эффекта6

1.2Классификация муаровых методов8

1.3Муаровые методы10

1.4Математическая модель исследования топологии поверхностей электронно-проекционным муаровым методом15

2.Выбор аппаратно-программных средств разработки19

3.Разработка программного обеспечения для моделирования муарового эффекта20

3.1Основной алгоритм программы, модулирующий муаровый эффект20

3.2Интерфейс программы23

Заключение33

Список использованных источников34

Приложение А35

Приложение Б63

Приложение В80

Приложение Г81


Введение


В нашей стране и за рубежом ведутся широкие работы по развитию существующих и разработке новых методов экспериментального исследования напряжений и деформаций. В последние годы получил распространение новый метод экспериментального исследования деформаций и напряжений, в котором используется муаровый эффект, возникающий при наложении одной на другую достаточно мелких сеток (решеток Френеля) и состоящий в образовании картины чередующихся темных и светлых муаровых полос, которые несут информацию о топологии объекта и перемещениях. Благодаря ряду замечательных свойств муаровый эффект может быть использован в качестве основы для точного и наглядного способа измерений.

В связи с развитием вычислительной техники получил распространение электронно-проекционный муаровый метод.

Для дальнейшего развития метода необходимы исследования. Особенно требуется анализ методов обработки муаровых картин для получения более точной информации о топологии исследуемой поверхности. Для этого необходимо собирать установку в минимальном комплекте (проектор, камера, ЭВМ) и проводить ряд экспериментов. Что бы уменьшить затраты на установку и проведения экспериментов, стоит разработать программу, которая будет моделировать муаровый эффект при заданных параметрах.

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

1. Муаровый эффект


.1 Природа муарового эффекта


Муар - это картина, состоящая из чередующихся темных и светлых полос, возникающая при наложении двух или более решеток Френеля, состоящих из линий, точек или иных геометрических элементов. В повседневной жизни его можно наблюдать в шелковых тканях, которые получили аналогичное название. Явление это обусловлено ограниченной разрешающей способностью устройства наблюдения, будь то человек или камера. При наложении двух систем линий интенсивность света по поверхности изображение меняется, и это изменение интенсивности и является причиной возникновения муаровой картины.

На рисунке 1 показаны картины муаровых полос, возникающие при наложении двух сеток прямых параллельных линий одинакового шага, повернутых на небольшой угол одна относительно другой (рисунок 1.а), а также имеющих небольшую разность в шаге, наложенных параллельно (рисунок 1.б).


а) б)

Муаровый эффект


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

Центр темной муаровой полосы совпадает с точкой, в которой темная линия одной сетки перекрывает, светлую линию другой. Средняя интенсивность проходящего или отраженного света непрерывно меняется от первой точки ко второй (в зависимости от величины зазора). Расстояние между центрами двух соседних темных (или светлых) муаровых полос является шагом полос[1].

При наложении двух систем прямых параллельных линий одинакового шага, повернутых на небольшой угол одна относительно другой, середина темной муаровой полосы совпадает с тем местом, где темные линии обеих сеток накладываются одна на другую. Между линиями средняя интенсивность меняется линейно и составляет 0.5 для белой муаровой полосы и 0.0 для темной муаровой полосы при условии, что темные и светлые линии сеток имеют одинаковую ширину [1].

Вообще распределение интенсивности света между светлыми и темными линиями зависит от соотношения ширины светлых и темных линий сетки. Полосы наибольшего контраста, то есть наибольшей разности интенсивности света, проходящего через середины светлой и темной полос, получаются при одинаковой ширине светлых и темных линий. При любом соотношении ширины светлых и темных линий максимальная интенсивность получается в центре светлой муаровой полосы, что облегчает построение центральных линий полос при измерениях. Муаровый эффект, таким образом, есть оптическое явление, возникающее при механическом наложении сеток сравнительно крупного шага, частота которых гораздо меньше частоты световых волн. Физическая природа света (длина волны) не имеет в этом явлении особого значения, поэтому его иногда называют «механической интерференцией».


.2 Классификация муаровых методов


Муаровый эффект может быть использован при исследовании перемещений и деформаций сложных механизмов и конструкций. В частности, на использовании этого эффекта основаны некоторые очень точные и чувствительные приборы для измерения деформаций (механические тензометры, использующие муаровый эффект). Однако больший интерес представляет получение топологии поверхностей, на основе которых возможно получение поля деформаций по поверхности исследуемого объекта. Здесь муаровый эффект позволяет создать по существу новый метод исследования деформаций, существенно дополняющий имеющиеся экспериментальные методы. Известно несколько методов муаровых полос, применяемых к исследованию перемещений и деформаций, различающихся видом сеток, используемых для образования картин муаровых полос, и характером решаемых задач.

Сетка наносится непосредственно на исследуемую поверхность детали.

Нанесенная на экране сетка отражается от зеркальной поверхности исследуемого объекта.

Сетка с помощью проекционного устройства проектируется на поверхность исследуемого объекта.

Муаровая картина получается с помощью сетки, наложенной на поверхность исследуемого объекта, и теней или отражений этой сетки, в этом случае исследуется профиль поверхности.

В качестве сеток используются семейства линий оптической интерференции.

Используется изображение сетки, искаженное в результате преломления при прохождении света через прозрачную исследуемую деталь.

Необходимо отметить, что если первые два метода получили уже широкое применение, то остальные имеют пока незначительное распространение.

Все перечисленные выше методы исследования деформаций имеют много общего, поэтому их можно рассматривать как разновидности метода муаровых полос. Общим для них, прежде всего, является использование картин муаровых полос, возникающих в результате механического наложения систем сеток. Наиболее удобным вариантом являются проецируемые сетки. Искажение (деформация) одной (или обеих) из налагаемых сеток связано с деформациями исследуемой поверхности. Возникающие муаровые полосы являются линиями уровня некоторых геометрических величин (перемещений, углов наклона, прогибов, кривизны и так далее, или их комбинаций). Исследуемая величина оказывается заданной в виде картины своих линий уровня. Вдоль линий уровня она остается постоянной, а при переходе от одной муаровой полосы к соседней изменяется на некоторую постоянную величину.

Все операции, связанные с обработкой муаровых картин являются общими для всех методов, а именно:

определение линий, вдоль которых частные производные функции обращаются в нуль и которые разделяют всю исследуемую область на области с одинаковым знаком производных;

методы построения графиков изменения функций в различных направлениях;

способы графического или численного дифференцирования и интегрирования функций;

способ определения частных производных путем наложения со сдвигом в направлении дифференцирования изображений линий уровня функции (механическое дифференцирование);

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

Общими для всех указанных выше методов являются экспериментальные способы получения картин муаровых полос:

двукратное фотографирование сетки до и после деформирования;

фотографирование картины муаровых полос, наблюдаемой непосредственно в процессе эксперимента путем наложения эталонной сетки или на поверхности детали, или на матовое стекло фотоаппарата;

полученные картины муаровых полос после проведения эксперимента путем наложения;

электронная обработка.

Много общего имеет метод муаровых полос с поляризационно-оптическим методом. Методика обработки картин полос, определения порядка полос и вычисления по порядкам полос тех или иных величин в этих методах вполне аналогичны. Однако при обработке картин муаровых полос пока используется лишь дискретная информация, представляемая средними линиями полос. В методе муара картины полос содержат и непрерывную информацию, то есть в любой точке поля интенсивность света определенным образом связана с измеряемыми функциями. В последние годы предпринята попытка установления такой зависимости, и для измерения интенсивности света в промежутках между серединами светлых и темных муаровых полос могут быть использованы специальные приборы.


.3 Муаровые методы


А) Метод муаровых полос с использованием сетки, нанесенной на деталь. Сущность метода состоит в том, что сетка линий наносится непосредственно на поверхность исследуемой детали и деформируется вместе с поверхностью. При наложении изображений сеток до и после деформации возникает картина муаровых полос. Наложение осуществляется или фотографированием деформированной сетки через недеформированную «эталонную» сетку, нанесенную на прозрачную пластинку и наложенную на поверхность детали, или фотографированием сетки, нанесенной на поверхность детали до и после деформации на один и тот же или на различные негативы. При этом можно использовать как отраженный, так и проходящий (в случае прозрачной детали) свет. Вообще говоря, могут быть использованы различные семейства линий, нанесенные на поверхность деталей сложной формы. Однако наиболее просто определяются деформации плоских поверхностей, на которые нанесены сетки прямых параллельных линий. Этот случай представляет наибольший практический интерес.

Данная разновидность метода является наиболее универсальной, и получила наиболее широкое распространение за рубежом, в то время как в отечественной литературе она освещена пока недостаточно. Впервые исследование деформаций этим методом осуществлено, по-видимому, Веллером и Шеппардом в 1948 году. Начиная с этого времени, в основном за последнее десятилетие опубликовано значительное число работ, в которых излагаются различные подходы к анализу муаровых картин и различные применения метода.

Б) Метод муаровых полос с использованием отраженной сетки. Если нанести на экран сетку прямых параллельных линий и сфотографировать отражение этой сетки сначала от плоской зеркальной поверхности, а затем от искривленной на один и тот же негатив, то в результате наложения двух семейств отраженных линий образуется картина муаровых полос, по которой можно судить о характере искривления поверхности. Графическим или численным интегрированием углов можно определить профиль поверхности (то есть расстояния по вертикали между различными точками поверхности или точками поверхности и некоторой отсчетной плоскостью). Метод позволяет определять углы поворота нормали, кривизны и профили слабоизогнутых поверхностей.

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

Этот метод является естественным развитием зеркально-оптических методов исследования углов и метода отраженной сетки. Зеркально-оптический метод точного измерения углов известен очень давно. При повороте плоского зеркала на небольшой угол, выбрав соответствующий «оптический рычаг» (расстояние от зеркала до некоторой отсчетной шкалы, по которой перемещается отраженный от зеркала луч) и измерив перемещение отраженного луча, можно определить величину угла поворота зеркала практически с любой требуемой точностью. Этот принцип используется как для непосредственного измерения углов, так и в различных измерительных приборах, например, зеркально-оптическом тензометре.

В) Метод муаровых полос с использованием отражения спроецированной сетки. Аналогично предыдущему методу муаровые картины могут быть. Получены наложением отраженной сетки, проектируемой на поверхность исследуемой детали с помощью проекционного аппарата. Однако эта разновидность получила пока значительно меньшее распространение, чем предыдущие методы.

Сетка проецируется с помощью проектора на поверхность исследуемой детали и отражается от нее на экран, покрытый светочувствительной фотобумагой. Наложенные отражения сетки до и после нагружения детали образуют картину муаровых полос, которые, как и в методе Лигтенберга (схемы различаются лишь направлением хода лучей), являются линиями уровня углов поворота нормали к исследуемой поверхности. Данный метод так же, как и предыдущий, применим для исследования изгиба пластин и изогнутых поверхностей, и формулы для подсчета углов, кривизны и прогибов поверхности по картинам муаровых полос совершенно аналогичны.

Более удобный метод описан Теокарисом. Сетка на исследуемую поверхность проецируется параллельным пучком монохроматического света под углом поверхности, и появляется возможность фотографировать отражение сетки. Муаровые полосы представляют собой также линии уровня углов поворота нормали в направлении, перпендикулярном к направлению линий сетки.

Г) Электронно-проекционный метод. Рассмотренные методы получения муарового эффекта приведены здесь в обзорном порядке. В сущности, они похожи и обрабатываются с использованием одной и той же математической модели, однако применяются, как уже было сказано выше, в разных эксплуатационных условиях.

Электронно-проекционный метод имеет ряд преимуществ перед уже рассмотренными методами и состоит в следующем: рабочая сетка проецируется на объект проектором, далее она сканируется камерой и обрабатывается с помощью ЭВМ. Это наиболее общее описание метода. Ранее для его реализации предполагалось использование аналоговой техники проектора и камеры, но на современном этапе развития технических средств, с появлением мультимедийных проекторов и цифровых камер, применение которых позволяет повысить точность получаемых результатов и легко интегрировать их в единую систему, возникла необходимость пересмотреть математическую модель. Рассмотрим подробнее схему электронно-проекционного способа определения топологии поверхностей на основе использования цифровой.

Минимально необходимый набор компонентов системы включает компьютер, мультимедийный проектор и цифровую фотокамеру. Для осуществления масштабного сканирования поверхности к системе необходимо добавить элементы, обеспечивающие ей мобильность, но в рамках данной работы главным образом будет рассмотрен минимальный набор. Функциональная схема такой системы представлена на рисунке 3.


Функциональная схема


Цифрами обозначены следующие элементы системы:

Исследуемая поверхность;

Цифровая фотокамера;

Мультимедийный проектор;

Компьютер.

ЭВМ синтезирует решетку с заданными параметрами, после чего подготовленная сетка проецируется на объект мультимедийным проектором

Далее, изображение на объекте фотографируется цифровой камерой и передастся в компьютер, где сначала происходит первичная обработка изображения приведение его к монохромному виду. Синтез мнимого растра на основе параметров отснятого объектного. Вычленение центров светлых полос объектного растра и центров темных полос мнимого растра, их наложение и определение муаровой картины.

Заключительным этапом обработки является расчет высот, расстояний от плоскости мнимого растра до соответствующих точек поверхности объекта.

Таким образом; получаем дискретную картину топологии поверхности.

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


.4 Математическая модель исследования топологии поверхностей электронно-проекционным муаровым методом


Перейдем к описанию математической стороны метода.

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

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

Таким образом, главной задачей математической модели является преобразование виртуальной матрицы данных в информацию о физическом объекте. Оптическая схема, поясняющая электронно-проекционный муаровый метод, представлена на рисунке 3.

Оптическая модель


На поверхность объекта проецируется матрица рабочего растра. Вынесенная на расстояние r камера совмещена оптической осью с осью проектора в точке O, принадлежащей поверхности объекта исследования. При этом камера имеет наклон ? по отношению к креплению. Картина полос на объекте преобразуется цифровой камерой в матрицу пикселей рабочего растра. В компьютере, на основе информации о толщине полос рабочего растра и избранного расстояния d от точки O до плоскости мнимого растра, генерируется сам мнимый растр. Далее, центры светлых полос проектного растра и центры темных полос мнимого растра совмещаются на предмет совпадения. Точки, где имеет место такое совпадение это точки центров мировых полос.

Рассмотрим, как формируются координаты точек центров темных мнимого растра в зависимости от параметров r, ?, d и шага полос рабочего растра s.

Определим угол ? как угол между оптическими осями проектора и камеры. Тогда ? = 90° - ?.

Координаты центров:


где


,.

При расчете координат используется значение функции масштаба для изображения, даваемого проектором. Предполагается, что разрешения проектора и камеры совпадают. Функция Q имеет линейный характер и проецируемая картина изменяет свои физические размеры в зависимости от расстояния до плоскости проецирования линейно.

После обработки объектного растра мы получаем значения центров светлых полос и для извлечения информации о топологии поверхности, сравниваем координаты центров полос мнимого растра и объектного. В этих точках интенсивность света равна нулю - это и есть центры муаровых полос. Значения высот вычисляются по формуле:


, при , при .

Таким образом, получена законченная математическая модель определения топологии поверхностей электронно-проекционным муаровым методом.


2.Выбор аппаратно-программных средств разработки


Сейчас доступно множество средств разработки приложений по моделированию, выбор встал на следующем программном обеспечение:

Новые технологии позволяют использовать модули, написанные на разных языках программирования, в одной программе[5]. Эту технологию поддерживает Microsoft Visual Studio .NET 2005 в состав которой входит Visual Basic 2005. VB 2005 - язык программирования высокого уровня, отвечает всем требованиям безопасности приложений, современный, легко изменяемый код, объектно-ориентированное программирование и работа с 3D-приложениями дает новые возможности по созданию высокотехничных приложений.

Средство 3D-моделирования DirectX 9.0c, использует современные наработки, обеспечивает связь между средством программирования и драйвером видеокарты. Компонент Direct3D обеспечивает широкие возможности при построении 3Д пространство.

Пакет Microsoft .Net Framework необходим для корректного функционирования программ написанных на VB 2005 или выше. Включает в себя ряд компонентов, таких как компиляторов, программ тестирования и защиты приложений.

Для быстрой и надежной работы выбранного программного обеспечения необходим современный компьютер. Требования к аппаратной части:

Системный блок со следующими характеристиками:

Процессор Intel Pentium IV 2.0ГГц

Оперативной памяти 256Мб

Свободное место на жестком диске 100Мб

Видеокарта NVidia GeforceFX5200 128Мб с поддержкой DirectX9.0

Монитор с поддержкой расширения не меньше чем 800x600x24

3. Разработка программного обеспечения для моделирования муарового эффекта


Проект разработан в Visual Basic 7.0 [3]. Программное обеспечение для гибкости состоит из трех модулей:- модуль графического интерфейса и управления, расчета;- модуль, работающий с 3Д миром;- модуль для отображения растровых данных.

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


.1 Основной алгоритм программы, модулирующий муаровый эффект


Последовательность действий:

Создаем рабочий растр с заданным углом поворота вокруг центра растра и шагом линий. Этот пункт выполняется вызовом функций CreatLine(ByVal TResol As Byte, ByRef Mas2D(,) As Byte, ByVal Stp As Integer, ByVal Pix4 As Integer, ByVal Alpha As Single), где:

TResol - выбор разрешающей способности, соответствует элементам массивов fWidth() и fHeight(), текущее разрешение хранится в нулевой ячейке;D(,) - двухмерный выходной массив, объектный растр;- шаг растра;- длина шаг черных полос, в текущем проекте Pix4 = Stp/2;- угол поворота задается в градусах.

Затем данные из массива сохраняется в bmp-файле с помощью процедуры SaveToFile(ByVal TResol As Byte, ByVal Mas2D(,) As Byte, ByVal FName As String), где :- выбор разрешающей способности;D(,) - двухмерный массив, является входным параметром, объектный растр;- переменная содержащая имя файла, в который необходимо сохранить.

Накладываем его на объект с позиции проектора. Перед этим используя процедуру Camera() получаем растр с учетом искажений. Процедура имеет следующие параметры Camera(ByVal TResol As Byte, ByVal Mas2D(,) As Byte, ByRef MasCam(,) As Byte, ByVal h As Integer), где:

Mas2D(,) - двухмерный массив, является входным параметром, объектный растр;(,) - двухмерный массив, является выходным параметром, растр с учетом искажений;- расстояние от проектора до поверхности.

Так же данные из MasCam(,) сохраняются в bmp-файл, процедурой SaveToFile(). После чего переменную NewRast устанавливаем в положение True, это означает, что модуль rendering должен принять новый рабочий растр и наложить его на объект(поверхность). Поверхность создается, процедурой CreateVertexBuffer(ByVal sender As Object), где sender - это объект VertexBuffer(набор вершин примитивов).

Снимаем камерой образовавшиеся линии. Для этого передаем управление модулю rendering, с помощью переменной createcameraview = True. Модуль rendering устанавливает вид с позиции камеры и, используя соответствующую команду Direct3D.SurfaceLoader.Save(), сохраняем содержимое слоя (видимая часть) в файл с расширением bmp.

Создаем мнимый растр с заданным углом, шагом и снятие его на камеру в плоскости перпендикулярной оптической оси проектора. Этот пункт аналогичен первому этапу, только входные и выходные данные относятся к мнимому растру. После создания файла с мнимым растром необходимо передать модулю rendering необходимость смоделировать его, это делается с помощью переменных createcameraviewM=True и операций аналогичных пункту 3. Результат получаем bmp-файл с эталонным растром.

Получения муаровой картины (наложением). Для этого необходимо загрузить с помощью процедуры LoadFromFile(ByVal TResol As Byte, ByVal FName As String, ByRef MasOut(,) As Byte), где:- содержит имя файла с которого необходимо загрузить данные;() - двухмерный выходной массив, данные.

Загрузили картины получившиеся в пункте 3 и 4 в соответствующие массивы. После чего необходимо передать данные процедуре Myar(ByVal TResol As Integer, ByVal MasIn1(,) As Byte, ByVal MasIn2(,) As Byte, ByRef MasOut(,) As Byte), где:(,), MasIn2(,) - двухмерные входные массивы, соответственно загруженным картинам;(,) - двухмерный выходной массив содержащий картину совмещенных линий - муар.

Эта процедура попиксельно сканирует обе картины и результирует в выходной массив. После получения муара, его сохраняем с помощью процедуры SaveToFile(), описанной выше.

Обработка изображения (поиск центров линий). Необходимо обработать картины полученные в пунктах 3 и 4. Так же как и в пункте 5 необходимо с начало загрузить данные из файлов с помощью функции LoadFromFile(). Затем используя процедуру поиска линий CenterLine (ByVal TResol As Byte, ByVal MasIn(,) As Byte, ByRef MasOut(,) As Byte, ByVal Alpha As Integer), где:

MasIn(,), MasOut(,) - двухмерные массивы данных вход / выход соответственно;(,) - угол наклона растра, задается для определения метода поиска центров полос.

Далее выходные массивы подаются на вход процедуре Myar() в итоге получаем муар центров полос. Все выходные массивы сохраняются в bmp-файл с помощью команды SaveToFile().

Вычисляем высоты исследуемой поверхности.


.2 Интерфейс программы


Рассмотри интерфейс модуля model. При запуске программы мы увидим два окна, показаны на рисунке 4. Справа блок управления, слева окно отображения 3D мира. На странице «1.Общие» можно менять расширения для окна 3D-моделирования и растров - чем больше, тем точнее картинка.


Вкладка «1.Общие»

Так же имеется функция перерасчета всех пунктов программы. Регуляторы нужны для изменения позиции наблюдения. Переходим на следующую вкладку.

На вкладке «2.Проектор и растр» можно выбрать исследуемую поверхность (один из семи вариантов: шар, плоскость, конус, цилиндр, пользовательский файл, синусоида).


Вкладка «2.Проектор и растр»


Далее надо ввести параметры рабочего растра, такие как шаг полос, угол поворота вокруг центра, расстояние от проектора до плоскости. После нажатия на кнопку «Создать» программа синтезирует рабочий растр с заданными параметрами, корректирует его с учетом искажений из-за расходящихся лучей проектора, накладывает растр на объект. Получаем следующий вид (рисунок 5). Далее необходимо сфотографировать поверхность с проецированными линиями.


Вкладка «3.Камера»

На вкладке «3.Камера», перед тем как сделать снимок, необходимо установить камеру в нужное место, это делается тремя регуляторами соответственно координатам в пространстве X,Y,Z. После нажатия на кнопку «Сделать снимок» программа создает вид с заданной позиции. Получаем картину вид спереди на рисунке 6.

Следующий этап создание мнимого растра, вкладка «4.Мнимый растр». Так же как и для рабочего растра задаем параметры мнимого растра, такие как шаг растра, угол поворота вокруг центра. После нажатия на кнопку «Создать» программа синтезирует растр с заданными параметрами. Справа на рисунке 7 показан пример.

Далее переходим к вкладке «5.ПК», получение самого муара. Для этого необходимо нажать кнопку «Муар», программа совмещает изображение снимка из камеры и мнимого растра.


Вкладка «4.Мнимый растр»


Вкладка «5.ПК»

Для вычислений высот необходимо нажать оставшиеся три кнопки: «центр полос изображения», «центр полос мнимого растра», «Муар центр полос».

На вкладке «Создание поверхности» производится создание файла с пользовательскими настройками поверхности (рисунок 9).


Вкладка «Создание поверхности»


Для просмотра полученных картин необходимо запустить BMP Браузер соответствующей кнопкой.

После запуска BMP Браузера, слева выбирается необходимый ресурс, например можно посмотреть исходный рабочий растр (рисунок 10) или мнимый (рисунок 11).


Рабочий растр

Для облегчения операций обработки изображения муара переводится в режим оттенки черного. Муаровый эффект изображен на рисунке 12. Он получился в результате наложения мнимого растра на рисунке 10 на снимок исследуемой плоскости на рисунке 6.

программа муаровый эффект изображение

Мнимый растр


Для вычисления центров полос найдем центры светлых полос снимка и мнимого растра. Получим рисунки 13.а и 13.б. Совместив их, получим муар центров линий на рисунке 13.в.


Муаровый эффект


а)

б)

в)

Картины центров полос инвертирование


Заключение


В данном курсовом проекте был разработан алгоритм, который был реализован в программе моделирующий муаровый эффект. Проект был разработан на системе Pentium IV, 512Мб ОЗУ и видеокартой с поддержкой DX9.

Был разработан удобный программный интерфейс.

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

Программа получилась много функциональной и гибкой, минимальные вмешательства могут кардинально преобразить продукт. Некоторые алгоритмы функционирования программы можно улучшить, например поиск центров полос, это может повысить точность измерения.

Программа требует основательной доработки подпрограммы вычисления вершин.

Список использованных источников


Кузяков О.Н., Кучерюк В.И. Методы и средства измерения топологий поверхностей, перемещений и деформаций. - Тюмень: ТюмГНГУ,2002.-172с.

Основы 3D - #"justify">Microsoft Visual Basic 2005 - #"justify">Приложение А


Листинг модуля «Options.vb»


Imports System.Windows.FormsClass OptionsSystem.Windows.Forms.FormResel As Boolean = True

'Определяет было ли изменение вида поверхности

Public statW As String = "Show"

Переменная статуса окна 3d моделированияsavef As Boolean = False

Параметр сохранения окна 3d моделирования в файлcreatecameraviewA As Byte = 0

Переменная создания кадров в автоматическом режимеcreatecameraview As Boolean = False

Переменная создания кадра рабочей поверхности и сохранение в файлcreatecameraviewM As Boolean = False

'Переменная создания кадра мнимой поверхности и сохранение в файл refreshwindow As Boolean = False

Переменная состояния обновить окна 3d моделированияMRast As Boolean = False

Переменная состояния обработки мнимого растраNewRast As Boolean = False

Переменная состояния обработки рабочего растраNewResolution As Boolean = False

Переменная состояния новое расширениеFace As Integer 'Номер поверхностиUserSur(1280 - 1, 960 - 1) As Int32 'массив пользовательской поверхностиSurSize As New RecSize 'размер пользовательской поверхности

Public Mas(1280, 960) As Byte 'рабочий растрMasM(1280 - 1, 960 - 1) As Byte 'мнимый растр Mas2(1280 - 1, 960 - 1) As Byte 'вид с проектораMas3(1280 - 1, 960 - 1) As Byte 'центры полос

Public Mas4(1280 - 1, 960 - 1) As Byte 'центры полос мнимой поверхности

Public MasC(1280 - 1, 960 - 1) As Byte 'Вид от камеры MasCM(1280 - 1, 960 - 1) As Byte 'Вид от камеры м-растрMasMyar(1280 - 1, 960 - 1) As Byte 'Вид муара MasMyarC(1280 - 1, 960 - 1) As Byte 'Вид муар. центр линий

Public fWidth() As Integer = {400, 400, 640, 800, 1024, 1280} 'Поддерживаемые разрешения по XfHeight() As Integer = {300, 300, 480, 600, 768, 960} 'Поддерживаемые разрешения по YfSize() As Single = {1, 1.6, 2, 2.56, 3.2}

Коэфициент маштабирования в зависимости от разрешенияSomeChange As Boolean = False 'Переменная состояния "что-то изменено"FType As Int16 = &H4D42 'Константа BM - объевления тип файла BMP

Const XpM As Int32 = 10000YpM As Int32 = 10000bitperpix As Byte = 24Rez As Int16 = 0Off As Int32 = &H36HSize As Int32 = &H28planes As Int16 = 1Compr As Int32 = 0ISize As Int32 = 0CUsed As Int32 = 0CImp As Int32 = 0R1 As Byte = &HFFG1 As Byte = &HFFB1 As Byte = &HFFR2 As Byte = 0G2 As Byte = 0B2 As Byte = 0RR As Byte = &H0

'Все константы нужны для работы с файлами формата BMP

'Процедура создания растра с углом Alpha, шагом Stp, результат сохраняет в Mas2D(,)

Sub CreatLine(ByVal TResol As Byte, ByRef Mas2D(,) As Byte, ByVal Stp As Integer, ByVal Pix4 As Integer, ByVal Alpha As Single)maxx As Integer = fWidth(TResol) 'разрешение по X и Уmaxy As Integer = fHeight(TResol)xc As Integer = maxx \ 2 'центр X и Yyc As Integer = maxy \ 2

Dim ax, ay As Int16 'свободные переменные

Dim freevarible As Single.Maximum = maxy 'Показывать индикацию прогресса

'Цикл создания растра, производится сканирование по X и Y

'узнается, где находилась эта точка до вращения и затем

'определяется темная/светлая полосаay = 0 To maxy - 1

For ax = 0 To maxx - 1= yc + (ax - xc) * Math.Sin(-1 * Alpha / 180 * Math.PI) + (ay - yc) * Math.Cos(-1 * Alpha / 180 * Math.PI)Math.Abs((freevarible + yc + Pix4 \ 2) Mod Stp) >= Pix4 Then Mas2D(ax, ay) = &HFF Else Mas2D(ax, ay) = &H0.Value = ay.Value = 0Sub

'Процедура генерации поверхностейTelo(ByVal axisX As Integer, ByVal axisY As Integer) As Singlefs As Single = fSize(CB_Res.SelectedIndex)

'определяется ф-я маштабирования в зависимости от выбранного расширения

Dim axisZ As Singlet1 As Single= 0 плоскость(Face = 1) Then цилиндр1(axisX > -50 * fs) And (axisX < 50 * fs) Then= Math.Sqrt((50 * fs) ^ 2 - axisX ^ 2)IfIf(Face = 2) Then цилиндр2(axisX > -100 * fs) And (axisX < 100 * fs) Then= Math.Sqrt((100 * fs) ^ 2 - axisX ^ 2)IfIf(Face = 3) Then конус= (100 * fs - Math.Sqrt(axisY ^ 2 + axisX ^ 2)) * 2axisZ < 0 Then= 0IfIf(Face = 4) Then шар= (100 * fs) ^ 2 - axisY ^ 2 - axisX ^ 2t1 >= 0 Then= Math.Sqrt(t1)IfIf(Face = 5) Then new= axisY ^ 2 + axisX ^ 2(t1 < (20 * fs) ^ 2) Then= 100If(t1 > (20 * fs) ^ 2) And (t1 < (100 * fs) ^ 2) Then= -Math.Sqrt(0.25 * t1 - (10 * fs) ^ 2) + 100IfIf(Face = 6) ThenOffX As Integer = SurSize.X / 2OffY As Integer = SurSize.Y / 2(Math.Abs(axisX) <= OffX) And (Math.Abs(axisY) <= OffY) Then= UserSur(axisX + OffX, axisY + OffY)IfIf(Face = 7) Thenamp As Byte = NUDSyn.Value= amp * Math.Cos(axisX * Math.PI / 50) + amp

End IfaxisZ возращает значение высоты

End Function

'Процедура расчета искаженийCamera(ByVal TResol As Byte, ByVal Mas2D(,) As Byte, ByRef MasCam(,) As Byte, ByVal h As Integer)maxx As Integer = fWidth(TResol) 'разрешение по X и Уmaxy As Integer = fHeight(TResol)xc As Integer = maxx \ 2 'центр X и Yyc As Integer = maxy \ 2

Dim ax, ay As Int16 'свободные переменные

Dim x1, y1 As Integerfreevarible, az, thaz As Single

ProgressBar1.Maximum = fHeight(TResol)

'Цикл создания растра, производится сканирование по X и Y

'узнается, где должна находиться эта точка, затем, где она находится

For ay = 0 To maxy - 1ax = 0 To maxx - 1= Telo(ax - xc, ay - yc)= h - azthaz = 0 Then thaz = -0.000000000000001= ((ax - xc) * h) / thaz + xc= ((ay - yc) * h) / thaz + yc(x1 < fWidth(0)) And (y1 < fHeight(0)) And (x1 >= 0) And (y1 >= 0) Then(ax, ay) = Mas2D(x1, y1): MasCam(ax, ay) = 0If.Value = ay.Value = 0

End Sub

'Процедура сохранения двух мерного массива Mas2D в файл с именем FName

Sub SaveToFile(ByVal TResol As Byte, ByVal Mas2D(,) As Byte, ByVal FName As String)FSize As Int32 = fWidth(TResol) * fHeight(TResol) * (bitperpix / 8) + Off

размер файлаBitCount As Int16 = bitperpix количество бит на цветfs As IO.FileStream = New IO.FileStream(FName, IO.FileMode.Create)

создание файлаw As IO.BinaryWriter = New IO.BinaryWriter(fs)

открытие файла на запись

'Запись заголовка.Write(FType) 'Тип файла.Write(FSize) 'Размер

w.Write(Rez).Write(Rez).Write(Off) 'Смещение.Write(HSize) 'Размер заголовка

w.Write(fWidth(TResol)) 'Расширение по X

w.Write(fHeight(TResol)) по Y

w.Write(planes) число битовых плоскостей.Write(BitCount) 'число битов на пиксель.Write(Compr) 'способ упаковки 0 - отсутствует.Write(ISize) 'размер изображения.Write(XpM) 'количества точек на метр.Write(YpM) 'количества точек на метр.Write(CUsed) 'количества цветов использовано.Write(CImp) 'количества цветов нужно

Запись данных из массива в файл

Dim ax, ay As Int16i As Integer.Maximum = fHeight(TResol)ay = fHeight(TResol) - 1 To 0 Step -1ax = 0 To fWidth(TResol) - 1.Write(Mas2D(ax, ay)) 'R.Write(Mas2D(ax, ay)) 'G.Write(Mas2D(ax, ay)) 'B.Value = ay.Value = 0.Close() закрытие файла..Close()

End Sub

Процедура загрузки данных из BMP файла в массив.

Sub LoadFromFile(ByVal TResol As Byte, ByVal FName As String, ByRef MasOut(,) As Byte)fs As IO.FileStream = New IO.FileStream(FName, IO.FileMode.Open)

открытие файлаr As IO.BinaryReader = New IO.BinaryReader(fs)

установка на чтение.BaseStream.Seek(&HA, IO.SeekOrigin.Begin)beginData As Int32= r.ReadInt32() чтение где начало данных.BaseStream.Seek(&H12, IO.SeekOrigin.Begin)MaxX, MaxY As Int32= r.ReadInt32() чтение разрешение по X= r.ReadInt32() по Y.BaseStream.Seek(&H1C, IO.SeekOrigin.Begin)BperP As Byte= r.ReadByte чтение количество bit на точку

Dim MasTemp(MaxX, MaxY) As Byte 'Создание временного массива

ClearMas(0, MasTemp) очистка массиваb1, b2, b3, b4 As Integer.BaseStream.Seek(beginData, IO.SeekOrigin.Begin) переход на начало данных

'Чтение данных в массивx, y As Integer

For y = MaxY - 1 To 0 Step -1x = 0 To MaxX - 1= r.ReadByteBperP >= 16 Then b2 = r.ReadByteBperP >= 24 Then b3 = r.ReadByteBperP >= 32 Then b4 = r.ReadByte(x, y) = b1

первичная обработка данныхlx, ly As Integer

lx = (MaxX - fWidth(TResol)) \ 2= (MaxY - fHeight(TResol)) \ 2x = 0 To fWidth(TResol) - 1y = 0 To fHeight(TResol) - 1(x, y) = MasTemp(lx + x, ly + y).Close() закрытие файла.Close()

End Sub

'Процеду выделения центров линий

Sub CenterLine(ByVal TResol As Byte, ByVal MasIn(,) As Byte, ByRef MasOut(,) As Byte, ByVal Alpha As Integer)ax, ay As Int16i As Integerly As IntegerLine As Booleannotdel As Booleant As Integer

'Обнуление массиваax = 0 To fWidth(TResol) - 1ay = 0 To fHeight(TResol) - 1

MasOut(ax, ay) = 0

Если угол меньше 45 градусов то сканировать по Y

If Alpha <= 45 Thenax = 0 To fWidth(TResol) - 1= False= 0ay = 0 To fHeight(TResol) - 1(MasIn(ax, ay) >= 200) And (Line = False) Then =1= True= ay(MasIn(ax, ay) <= 100) And (Line = True) Then '=0(ax, (ly + ay) \ 2) = &HFF= False= ayIf

Else

Если угол больше 45 градусов то сканировать по X

For ay = 0 To fHeight(TResol) - 1= False= 0ax = 0 To fWidth(TResol) - 1(MasIn(ax, ay) >= 200) And (Line = False) Then =1= True= ay(MasIn(ax, ay) <= 100) And (Line = True) Then '=0(ax, (ly + ay) \ 2) = &HFF= False= ayIfIfSub

'Процедура очистки массиваClearMas(ByVal TResol As Integer, ByRef Mas(,) As Byte)ax, ay As Integerax = 0 To fWidth(0) - 1ay = 0 To fHeight(0) - 1(ax, ay) = 0

NextSub

'Процедура создания мнимого растраCreatMRast().Text = "Создание м-растра"

ClearMas(0, MasM)(0, MasM, NumericUpDownMRS.Value, NumericUpDownMRS.Value - NumericUpDownMRS1.Value, NumericUpDownMRA.Value).Value шаг сетки.Value ширина темных полос.Value угол поворота;.Text = "Сохранение растра"(0, MasM, ".\Мнимый растр.bmp")Sub

'Процедура получения муараMyar(ByVal TResol As Integer, ByVal MasIn1(,) As Byte, ByVal MasIn2(,) As Byte, ByRef MasOut(,) As Byte)ax, ay As Integerax = 0 To fWidth(0) - 1ay = 0 To fHeight(0) - 1(MasIn1(ax, ay) > MasIn2(ax, ay)) Then(ax, ay) = MasIn1(ax, ay)(ax, ay) = MasIn2(ax, ay)IfSub

'Процедура Центры линий рабочей поверхностиCwline()

ClearMas(0, MasC)(0, Mas3)(0, ".\Вид рабочей поверхности.bmp", MasC)(0, MasC, Mas3, NumericUpDown.Value)

SaveToFile(0, Mas3, ".\Центры линий рабочей поверхности.bmp")Sub


'Процедура Центры линий мнимой поверхности

Sub Cmline()(0, MasCM)(0, Mas4)(0, ".\Вид мнимой поверхности.bmp", MasCM)(0, MasCM, Mas4, Me.NumericUpDownMRA.Value)

SaveToFile(0, Mas4, ".\Центры линий мнимой поверхности.bmp")Sub

'Процедура получения муара центров линий

Sub MyarEffectLine()(0, Mas3)(0, Mas4)(0, MasMyarC)(0, ".\Центры линий рабочей поверхности.bmp", Mas3)

LoadFromFile(0, ".\Центры линий мнимой поверхности.bmp", Mas4)(0, Mas3, Mas4, MasMyarC)(0, MasMyarC, ".\Муаровый эффект центров линий.bmp")Sub

'Процедура получения муараMyarEffect()

ClearMas(0, MasC)(0, MasCM)(0, MasMyar)(0, ".\Вид мнимой поверхности.bmp", MasCM)(0, ".\Вид рабочей поверхности.bmp", MasC)(0, MasC, MasCM, MasMyar)(0, MasMyar, ".\Муаровый эффект.bmp")

End Sub

'Процедура авто создания муаров и поиска центров линий

Public Sub autocreatall()()()()()SubSub Options_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load_Res.SelectedIndex = 0_Pov.SelectedIndex = 0.Location = New System.Drawing.Point(10, 0).TopMost = TrueSubSub ButtonBMP(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click= "CreateBMPbrowser"SubSub TabControl1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged.Refresh()CheckBoxAuto.Checked = True ThenSomeChange = True Then_Click(sender, e)()= 3If= FalseIf= TrueSubSub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click

LoadFromFile(0, ".\Центры линий рабочей поверхности.bmp", Mas3)(0, ".\Центры линий мнимой поверхности.bmp", Mas4)

Dim h, cosf1, cosf2 As Doublefs As IO.FileStream = New IO.FileStream("test", IO.FileMode.Create)w As IO.TextWriter = New IO.StreamWriter(fs)ax, ay As Integerax = 0 To fWidth(0) - 1ay = 0 To fHeight(0) - 1(Mas3(ax, ay) = &HFF) And (Mas4(ax, ay) = &HFF) Then= NumericUpDownPZ.Value / Math.Sqrt(NumericUpDownPZ.Value ^ 2 + ax ^ 2 + ay ^ 2)= NumericUpDownCH.Value * Math.Cos(NumericUpDownCA.Value * Math.PI / 180) / Math.Sqrt(NumericUpDownCH.Value ^ 2 + ax ^ 2 + ay ^ 2 + 2 * ax * NumericUpDownCH.Value * Math.Cos(NumericUpDownCA.Value * Math.PI / 180))= NumericUpDownWRS.Value() / (Math.Tan(Math.Acos(cosf1)) + Math.Tan(Math.Acos(cosf2))).WriteLine(" X:" + CStr(ax) + " Y:" + CStr(ay) + " H:" + CStr(h))If.Close().Close()SubSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click_Click(sender, e)()= 3.Text = ""SubSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click.Text = "Создание растра"(0, Mas)(0, Mas, NumericUpDownWRS.Value, NumericUpDownWRS.Value - NumericUpDownWRS1.Value, NumericUpDownWRA.Value).Text = "Сохранение растра"(0, Mas, ".\Рабочий растр.bmp").Text = "Сохранение растра2"(0, Mas2)(0, Mas, Mas2, NumericUpDownPZ.Value * fWidth(0) / 16)

SaveToFile(0, Mas2, ".\Искажения рабочего растра.bmp")

NewRast = True.Text = "Наложение растра"= TrueSubSub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click= True= TrueSubSub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click()= True= True= True.Text = "Наложение растра"= True.Text = ""SubSub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click()SubSub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click()SubSub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click()SubSub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click()SubOverrides Sub Finalize() 'Процедура завершения.Finalize()SubSub NumericUpDownWRS_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownWRS.ValueChanged= True.Value = NumericUpDownWRS.Value \ 2SubSub NumericUpDownPZ_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownPZ.ValueChanged= True.Value = NumericUpDownPZ.Value= TrueSubSub TrackBarPZ_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarPZ.Scroll= True.Value = TrackBarPZ.Value= TrueSubSub TrackBarCX_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarCX.Scroll= True.Value = TrackBarCX.ValueCheckBox1.Checked Then= TrueIf= TrueSubSub NumericUpDownCX_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownCX.ValueChanged= True.Value = NumericUpDownCX.Value.Value = Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2).Value = Math.Acos(NumericUpDownCZ.Value / Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2)) * 180 / Math.PICheckBox1.Checked Then= TrueIf= TrueSubSub TrackBarCY_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarCY.Scroll= True.Value = TrackBarCY.ValueCheckBox1.Checked Then= TrueIf= TrueSubSub NumericUpDownCY_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownCY.ValueChanged= True.Value = NumericUpDownCY.Value.Value = Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2).Value = Math.Acos(NumericUpDownCZ.Value / Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2)) * 180 / Math.PICheckBox1.Checked Then= TrueIf= TrueSubSub TrackBarCZ_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBarCZ.Scroll= True.Value = TrackBarCZ.ValueCheckBox1.Checked Then= TrueIf= TrueSubSub NumericUpDownCZ_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownCZ.ValueChanged= True.Value = NumericUpDownCZ.Value.Value = Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2).Value = Math.Acos(NumericUpDownCZ.Value / Math.Sqrt(NumericUpDownCX.Value ^ 2 + NumericUpDownCY.Value ^ 2 + NumericUpDownCZ.Value ^ 2)) * 180 / Math.PICheckBox1.Checked Then= TrueIf= TrueSubSub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll, TrackBar3.Scroll, TrackBar2.Scroll= TrueSubSub NumericUpDownMRS1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownMRS1.ValueChanged, NumericUpDown.ValueChanged, NumericUpDownMRA.ValueChanged, NumericUpDownWRA.ValueChanged= TrueSubSub CB_Pov_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Pov.SelectedIndexChanged= True= CB_Pov.SelectedIndex(Face = 6) And (Resel) Then.ShowDialog()FName As String = OFD.FileName(FName = "") Then= 0_Pov.SelectedIndex = 0Iffs As IO.FileStream = New IO.FileStream(FName, IO.FileMode.Open)

'создание(файла)r As IO.BinaryReader = New IO.BinaryReader(fs)

'открытие файла на запись.X = r.ReadInt32()

SurSize.Y = r.ReadInt32()ix, iy As Integeriy = 0 To SurSize.Yix = 0 To SurSize.X(ix, iy) = r.ReadInt32().Close() закрытие файла..Close().Text = Path.GetFileNameWithoutExtension(FName).FileName = ""If(Face = 7) Then.Visible = True.Visible = True.Visible = False.Visible = FalseIfSubSub CB_Res_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_Res.SelectedIndexChanged= True(0) = fWidth(CB_Res.SelectedIndex + 1)(0) = fHeight(CB_Res.SelectedIndex + 1)= True= TrueSubSub NumericUpDownMRS_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownMRS.ValueChanged= True.Value = NumericUpDownMRS.Value \ 2SubSub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OFD.FileOkSubSub BCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCreate.Click()FName As String = TBFileName.Text & ".txt"MaxH As Integer = NUDH.ValueX As Integer = NUDX.ValueY As Integer = NUDY.Valueix, iy As Integerh As Integerfs As IO.FileStream = New IO.FileStream(FName, IO.FileMode.Create)

создание файлаw As IO.BinaryWriter = New IO.BinaryWriter(fs)

открытие файла на запись.Write(X)

w.Write(Y)Sur(X, Y) As Integer(RBRnd.Checked) Theniy = 0 To Yix = 0 To X()(ix, iy) = MaxH * Rnd()If(RBRndOff.Checked) Theniy = 0 To Y(0, iy) = 0ix = 1 To X()= Sur(ix - 1, iy) + (-1) ^ (CInt(2 * Rnd()))(ix, iy) = h(h < 0) Then Sur(ix, iy) = 0(h > MaxH) Then Sur(ix, iy) = MaxHIf(RBRndOff2.Checked) Theniy = 0 To Y(0, iy) = 0ix = 1 To X()= Sur(ix - 1, 0) + (-1) ^ (CInt(2 * Rnd()))(ix, 0) = h(h < 0) Then Sur(ix, 0) = 0(h > MaxH) Then Sur(ix, 0) = MaxHiy = 1 To Y(ix, iy) = Sur(ix, 0)If(RBRndOff3.Checked) Then(0, 0) = 0ix = 1 To X()= Sur(ix - 1, 0) + (-1) ^ (CInt(2 * Rnd()))(ix, 0) = h(h < 0) Then Sur(ix, 0) = 0(h > MaxH) Then Sur(ix, 0) = MaxHOffs As Integeriy = 1 To Y()= (-1) ^ (CInt(2 * Rnd()))ix = 0 To X= Sur(ix, iy - 1) + Offs(ix, iy) = h(h < 0) Then Sur(ix, iy) = 0(h > MaxH) Then Sur(ix, iy) = MaxHIf(RBSyn.Checked) Thenix = 0 To X= MaxH * Math.Cos((ix - SurSize.X / 2) * Math.PI / 50) + MaxH(ix, 0) = h(h < 0) Then Sur(ix, 0) = 0iy = 1 To Y(ix, iy) = Sur(ix, 0)If(RBSyn2.Checked) Thenix = 0 To X(ix, 0) = MaxH * Math.Cos((ix - SurSize.X / 2) * Math.PI / 50) + MaxHOffs As IntegerS0, S1 As Integeriy = 1 To Y= MaxH * Math.Cos((iy - 1) * Math.PI / 50) + MaxH= MaxH * Math.Cos((iy) * Math.PI / 50) + MaxH= S1 - S0ix = 0 To X= Sur(ix, iy - 1) + Offs(ix, iy) = h(h < 0) Then Sur(ix, iy) = 0Ifiy = 0 To Yix = 0 To X.Write(Sur(ix, iy)).Close() закрытие файла..Close()SubSub RBRnd_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBRnd.CheckedChanged.Text = "RunSuf" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub RBRndOff_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBRndOff.CheckedChanged.Text = "RunSufOff" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub RBRndOff2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBRndOff2.CheckedChanged.Text = "RunSufOff2_" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub RBRndOff3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBSyn.CheckedChanged.Text = "Syn" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub NUDX_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NUDX.ValueChanged, NUDY.ValueChangedtext As String = "RunSuf"(RBRndOff.Checked) Then text = text + "Off"(RBRndOff2.Checked) Then text = text + "Off2_"(RBRndOff3.Checked) Then text = text + "Off3_"(RBSyn.Checked) Then text = "Syn"(RBSyn2.Checked) Then text = "Syn2_"= text + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value)).Text = textSubSub RBRndOff3_CheckedChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBRndOff3.CheckedChanged.Text = "RunSufOff3_" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub RBSyn2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RBSyn2.CheckedChanged.Text = "Syn2_" + Trim(Str(NUDX.Value)) + "_" + Trim(Str(NUDY.Value))SubSub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click()()()()SubClass

Приложение Б


Листинг модуля «Rendering.vb»SystemSystem.DrawingSystem.Windows.FormsMicrosoft.DirectXMicrosoft.DirectX.Direct3DDirect3D = Microsoft.DirectX.Direct3DMyarClass renderingForm

'Глобальные переменные для модуляdevice As Device = Nothing наше 3D устройствоvertexBuffer As VertexBuffer = Nothing 'рабочая поверхностьvertexBuffer2 As VertexBuffer = Nothing 'стена, полtexture As Texture = Nothing 'рабочая поверхностьtexturefloor As Texture = Nothing 'стена, полtexturecamera As Texture = Nothing 'текстура камерыtextureM As Texture = Nothing 'мнимая поверхностьvertexBufferM As VertexBuffer = Nothing 'мнимая поверхностьpresentParams As New PresentParameters() 'параметры для 3D pause As Boolean = Falsemx As Integer = 120 'Количество точек по Xkol_y As Integer = 90 'Количество точек по Ymx2 As Integer = 6my2 As Integer = 6RA, RC, RB As Single 'Точка обзораmmn As New Options() 'Создаем окно Options nv As IntegerconeMesh As Mesh = Nothing КамераcylMesh As Mesh = Nothing Штатив

'Основная процедура при создании окнаSub New()

mmn.Show().ClientSize = New System.Drawing.Size(400, 300).Location = New System.Drawing.Point(0, 0).Text = "3D моделирование".AutoScaleBaseSize = New System.Drawing.Size(0, 0).MaximizeBox = False.MinimizeBox = True.TopMost = True.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow.Location = New System.Drawing.Point(301, 0).StartPosition = System.Windows.Forms.FormStartPosition.Manual

End Sub

Попытка проинициализировать 3D устройство

Public Function InitializeGraphics() As Boolean.BackBufferCount = 1 'Один задний буффер.Windowed = True 'В окне.SwapEffect = SwapEffect.Discard 'Выключить swap эффект.EnableAutoDepthStencil = True.AutoDepthStencilFormat = DepthFormat.D16 = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)device.DeviceCreated, AddressOf Me.OnCreateDevicedevice.DeviceReset, AddressOf Me.OnResetDevice.OnCreateDevice(device, Nothing).OnResetDevice(device, Nothing)= FalseTruee As DirectXException 'Ошибка при создании!FalseTryFunction 'InitializeGraphics

'При создании устройстваSub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)dev As Device = CType(sender, Device)

'Создаем вертекс рабочей поверхности= New VertexBuffer(GetType(CustomVertex.PositionNormalTextured), 3 * 2 * mx * kol_y, dev, Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default)= New VertexBuffer(GetType(CustomVertex.PositionNormalTextured), 3 * 2 * mx * kol_y, dev, Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default)= New VertexBuffer(GetType(CustomVertex.PositionNormalTextured), 3 * 2 * mx2 * my2, dev, Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default)

'AddHandler vertexBuffer.Created, AddressOf Me.CreateVertexBuffer

mmn.LStatus.Text = "Генерация объекта"

nv = 0(vertexBuffer)

'Создаем вертекс стен

mmn.LStatus.Text = "Генерация Объектов"= 1(vertexBuffer2)

'Создаем вертекс мнимой поверхности

nv = 0(vertexBufferM).LStatus.Text = ""Sub 'OnCreateDevice

'Настройка 3D устройстваSub OnResetDevice(ByVal sender As Object, ByVal e As EventArgs)dev As Device = CType(sender, Device)

'отключение обрезаний поверхностей.RenderState.CullMode = Cull.None

Включение света.RenderState.Lighting = True

Включение ZBuffer.RenderState.ZBufferEnable = True

'Настройка источника света.Lights(0).Type = LightType.Point

dev.Lights(0).Position = New Vector3(0, 8, 10).Lights(0).Direction = New Vector3(0, 0, 0).Lights(0).Diffuse = System.Drawing.Color.White.Lights(0).Range = 100.0F.Lights(0).Attenuation1 = 0.1F.Lights(0).Commit().Lights(0).Enabled = True

'Включение основного источника.RenderState.Ambient = System.Drawing.Color.FromArgb(&H646464)= Mesh.FromFile(".\1.x", MeshFlags.Managed, device)= Mesh.Cylinder(device, 0.05F, 0.05F, 40, 20, 20)

'Настройка материалаmtrl As Microsoft.DirectX.Direct3D.Material.Ambient = System.Drawing.Color.White.Diffuse = System.Drawing.Color.White.Material = mtrl= TextureLoader.FromFile(device, Application.StartupPath + "\Текстура стен.bmp")= TextureLoader.FromFile(device, Application.StartupPath + "\Текстура объектов.bmp")TrySub 'OnResetDevice

'Функция определения высоты для плоскостиFunction fZ(ByVal X As Single, ByVal Y As Single) As SingleZ As Single = 0Dx, Dy As Single= mmn.fWidth(0) / 16= mmn.fHeight(0) / 12= -mmn.Telo(X * Dx - Dx * 8, Y * Dy - Dy * 6) / Dx

Return ZFunction


'Процедура создания вертекса, 3Д-объекта

Public Sub CreateVertexBuffer(ByVal sender As Object)vb As VertexBuffer = CType(sender, VertexBuffer)verts As CustomVertex.PositionNormalTextured() = CType(vb.Lock(0, 0), CustomVertex.PositionNormalTextured()) Начать обработку структурыdX As Single = ((16 + 4 * nv) * (1.0F)) / (mx * (1 - nv) + mx2 * nv)dY As Single = ((12 + 4 * nv) * (1.0F)) / (kol_y * (1 - nv) + my2 * nv)k As Integer = 0x As Integer.ProgressBar1.Value = 0.ProgressBar1.Maximum = mx * (1 - nv) + mx2 * nv - 1x = 0 To mx * (1 - nv) + mx2 * nv - 1y As Integer.ProgressBar1.Value = xy = 0 To kol_y * (1 - nv) + my2 * nv - 1(k).X = x * dX(k).Y = y * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1(k).X = x * dX(k).Y = (y + 1) * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1(k).X = (x + 1) * dX(k).Y = (y + 1) * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1(k).X = x * dX(k).Y = y * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1(k).X = (x + 1) * dX(k).Y = (y + 1) * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1(k).X = (x + 1) * dX(k).Y = y * dYnv = 0 Then(k).Z = fZ(verts(k).X, verts(k).Y)(k).Tu = verts(k).X / 16(k).Tv = 1 - verts(k).Y / 12(k).Z = 0(k).Tu = verts(k).X / 20(k).Tv = verts(k).Y / 16If(k).SetNormal(New Vector3(0, 0, 1))+= 1.ProgressBar1.Value = 0.Unlock() 'Закрыть структуруSub 'OnCreateVertexBuffer

'Процедура рендерига 3D сцены, построение самой сцены с необходимыми параметрами

Private Sub Render()mmn.NewRast = True Then= 1(vertexBuffer2)= 0(vertexBuffer).NewRast = False.LStatus.Text = ""= TextureLoader.FromFile(device, Application.StartupPath + "\Искажения рабочего растра.bmp")TryIfmmn.MRast = True Then.Resel = Falsetemp As Integer= mmn.CB_Pov.SelectedIndex.CB_Pov.SelectedIndex = 0= 0(vertexBufferM)= TextureLoader.FromFile(device, Application.StartupPath + "\Мнимый растр.bmp").CB_Pov.SelectedIndex = temp.Resel = TrueIfdevice Is Nothing ThenIf(pause = True) Or (mmn.refreshwindow = False) ThenIf.refreshwindow = False.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Color.Blue, 1.0F, 0).BeginScene() 'Начало сцены.VertexFormat = CustomVertex.PositionNormalTextured.Format() 'Настройка камеры.SetTexture(0, texturefloor).SetStreamSource(0, vertexBuffer2, 0).Transform.World2 = Matrix.Multiply(Matrix.RotationY(0), Matrix.Translation(-10, 0, 0)).Transform.World = Matrix.Multiply(device.Transform.World2, device.Transform.World1).DrawPrimitives(PrimitiveType.TriangleList, 0, 2 * mx2 * my2).Transform.World2 = Matrix.Multiply(Matrix.RotationX(-Math.PI / 2), Matrix.Translation(-10, 0, 0)).Transform.World = Matrix.Multiply(device.Transform.World2, device.Transform.World1).DrawPrimitives(PrimitiveType.TriangleList, 0, 2 * mx2 * my2)mmn.MRast = False Then.SetTexture(0, texture).TextureState(0).ColorOperation = TextureOperation.Modulate.TextureState(0).ColorArgument1 = TextureArgument.TextureColor.TextureState(0).ColorArgument2 = TextureArgument.Diffuse.Transform.World2 = Matrix.Multiply(Matrix.RotationY(0), Matrix.Translation(-10 + (20 - 16) / 2, 2, -0.5)).Transform.World = Matrix.Multiply(device.Transform.World2, device.Transform.World1).SetStreamSource(0, vertexBuffer, 0).DrawPrimitives(PrimitiveType.TriangleList, 0, 2 * mx * kol_y).SetTexture(0, textureM).TextureState(0).ColorOperation = TextureOperation.Modulate.TextureState(0).ColorArgument1 = TextureArgument.TextureColor.TextureState(0).ColorArgument2 = TextureArgument.Diffuse.Transform.World2 = Matrix.Multiply(Matrix.RotationY(0), Matrix.Translation(-10 + (20 - 16) / 2, 2, -0.5)).Transform.World = Matrix.Multiply(device.Transform.World2, device.Transform.World1).SetStreamSource(0, vertexBufferM, 0).DrawPrimitives(PrimitiveType.TriangleList, 0, 2 * mx * kol_y).MRast = FalseIfmmn.createcameraview = False Then.SetTexture(0, texturecamera)vecFrom As New Vector3(mmn.NumericUpDownCX.Value, 10 + mmn.NumericUpDownCY.Value, 1 - mmn.NumericUpDownCZ.Value)vecAt As New Vector3(0, 10, 0)vecUp As New Vector3(0, 1, 0)matWorldInv As MatrixmatWorld As Matrix= Matrix.LookAtLH(vecFrom, vecAt, vecUp)= Matrix.Invert(matWorldInv).SetTransform(TransformType.World, matWorld).DrawSubset(0)vecFrom2 As New Vector3(mmn.NumericUpDownCX.Value, 20, 1 - mmn.NumericUpDownCZ.Value)vecAt2 As New Vector3(mmn.NumericUpDownCX.Value, 0, 1.1 - mmn.NumericUpDownCZ.Value)= Matrix.LookAtLH(vecFrom2, vecAt2, vecUp)= Matrix.Invert(matWorldInv).SetTransform(TransformType.World, matWorld).DrawSubset(0)= New Vector3(mmn.NumericUpDownPX.Value, 10 + mmn.NumericUpDownPY.Value, 1 - mmn.NumericUpDownPZ.Value)= Matrix.LookAtLH(vecFrom, vecAt, vecUp)= Matrix.Invert(matWorldInv).SetTransform(TransformType.World, matWorld).DrawSubset(0)= New Vector3(mmn.NumericUpDownPY.Value, 20, 1 - mmn.NumericUpDownPZ.Value)= New Vector3(mmn.NumericUpDownPY.Value, 0, 1.1 - mmn.NumericUpDownPZ.Value)= Matrix.LookAtLH(vecFrom2, vecAt2, vecUp)= Matrix.Invert(matWorldInv).SetTransform(TransformType.World, matWorld).DrawSubset(0)If.EndScene() 'Конец сцены.Present()mmn.createcameraview = True ThenFbufC As Direct3D.Surface= device.GetBackBuffer(0, 0, BackBufferType.Mono)mmn.createcameraviewM = False Then.Save(".\Вид рабочей поверхности.bmp", ImageFileFormat.Bmp, FbufC).Save(".\Вид мнимой поверхности.bmp", ImageFileFormat.Bmp, FbufC)If.createcameraview = False.createcameraviewM = FalseIfSub 'Render

'Процедура настройки вида, мира и камеры

Private Sub SetupMatrices()mmn.createcameraview = True Then= 0= 0= 0= mmn.TrackBar1.Value= mmn.TrackBar2.Value= mmn.TrackBar3.ValueIffAngle As Single = (2.0F * Math.PI) / 360zAngel As Single = (2.0F * Math.PI) / 360xAngel As Single = (2.0F * Math.PI) / 360.Transform.World1 = Matrix.Multiply(Matrix.RotationY(fAngle), Matrix.RotationZ(zAngel)).Transform.World1 = Matrix.Multiply(device.Transform.World1, Matrix.RotationX(xAngel)).Transform.World = device.Transform.World1mmn.createcameraview = True Thenl As Double = Math.Sqrt(mmn.NumericUpDownCX.Value ^ 2 + mmn.NumericUpDownCY.Value ^ 2 + mmn.NumericUpDownCZ.Value ^ 2).Transform.View = Matrix.LookAtLH(New Vector3(mmn.NumericUpDownCX.Value * 1.0F, mmn.NumericUpDownCY.Value * 1.0F + 8, -mmn.NumericUpDownCZ.Value * 1.0F), New Vector3(0.0F, 8.0F, 0.0F), New Vector3(0.0F, 1.0F, 0)).Transform.Projection = Matrix.PerspectiveFovLH(2 * Math.Atan((16 / 2) / l), mx / kol_y, 1.0F, 100.0F).Transform.View = Matrix.LookAtLH(New Vector3(40.0F + RA, 40.0F + RB, -40.0F + RC), New Vector3(0.0F, 0.0F, 0.0F), New Vector3(0.0F, 1.0F, 0)).Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI) / 4, 1.0F, 1.0F, 1000.0F)IfSub 'SetupMatrices

'Процедура проверокFunction TryF()mmn.Text = "" Then 'Проверка на потерю приложения.Close().Close() 'Выход!Ifmmn.NewResolution Then 'Проверка на новое расширение.ClientSize = New System.Drawing.Size(mmn.fWidth(0), mmn.fHeight(0)).NewResolution = False.NewRast = True

End Ifmmn.statW = "CreateBMPbrowser" Then 'Проверка на необходимость создать .Hide() 'приложение BMPbrowser.Hide()

Dim mbrow As New BMPBrowser().Show().PictureBox1.Size = New System.Drawing.Size(mmn.fWidth(0), mmn.fHeight(0)).ClientSize = New System.Drawing.Size(120 + mmn.fWidth(0), 0 + mmn.fHeight(0)).PictureBox1.Location = New System.Drawing.Point(120, 0).Location = New System.Drawing.Point(300, 0)mbrow.Created.DoEvents()While.PictureBox1.Dispose().Dispose().Show().Show().statW = ""Ifmmn.createcameraviewA = 1 Then.autocreatall().createcameraviewA = 0.SomeChange = False.refreshwindow = TrueIfmmn.createcameraviewA = 2 Then.createcameraview = True.createcameraviewM = True.MRast = True.refreshwindow = True.createcameraviewA = 1Ifmmn.createcameraviewA = 3 Then.createcameraview = True.refreshwindow = True.createcameraviewA = 2IfFunctionSub InitializeComponent().SuspendLayout()

''rendering

'Me.ClientSize = New System.Drawing.Size(292, 273).Name = "rendering".ResumeLayout(False)SubOverrides Sub Finalize().Close().Finalize()SubSub Rendering_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint.refreshwindow = TrueSubSub Rendering_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPressAsc(e.KeyChar) = CInt(System.Windows.Forms.Keys.Escape) Then

Me.Close() Выход при нажатии на Esc

End IfSubSub Main()frm As New rendering() 'Создаем окно renderingNot frm.InitializeGraphics() Then Initialize Direct3D.Show("Could not initialize Direct3D.")If.Show()frm.Created.Render().DoEvents().TryF()WhileSub 'MainClassNamespace

Приложение В


Листинг модуля « BMPBrowser.vb»

Public Class BMPBrowserSystem.Windows.Forms.Formstat As Boolean = Falsez As IO.Stream

'Процедура при выборе элемента(bmp) и его отображение

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChangedstf As IO.Stream= New IO.FileStream(ListBox1.SelectedItem, IO.FileMode.Open)buf(stf.Length) As Byte.Read(buf, 0, stf.Length).Close().Text = ListBox1.SelectedItem= New IO.MemoryStream().Write(buf, 0, buf.Length).Image = Image.FromStream(z).Close().Text = "Выберите объект"TrySubClass

Приложение Г


Листинг модуля «MyClass.vb»Class RecSizeX As IntegerY As IntegerClass


ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по дисциплине: «Проектирование микропроцессорных систем»

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ