Разработка и реализация программного модуля для трехмерной и двухмерной визуализации геометрических сборок для ПК BRAND

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«Национальный исследовательский ядерный университет «МИФИ»

(ИАТЭ НИЯУ МИФИ)

Факультет естественных наук

Кафедра прикладной математики

Дипломная работа

" Разработка и реализация программного модуля для трехмерной и двухмерной визуализации геометрических сборок для ПК BRAND "

Студент

Группа М2-С10

______________________

Сидорова О.О.

Руководитель

доцент, к.ф.-м.н.

______________________

Царина А.Г.

Рецензент

доцент, к.т.н.

______________________

Мирзеабасов О.А.

Работа рассмотрена кафедрой и допущена к защите в комиссии по ВКР

И.о.зав. кафедрой, к.ф.-м.н., доцент ______________Ермаков С.В.

г.Обнинск, 2015


СОДЕРЖАНИЕ


Введение.

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

На текущий момент на рынке представлено достаточно большое количество разработок как отечественных, так и зарубежных ученых, направленных на моделирование процессов переноса излучения. Каждый программный комплекс имеет свою границу применимости и свою точность получаемых результатов и оценок. Среди наиболее известных можно перечислить такие продукты как MCU, MCNP, САПФИР, Microshield и т.д.

ПК BRAND, разработанный в ГНЦ ФЭИ и в ИАТЭ и названный в честь своих создателей П.А. Андросенко и А.А. Андросенко, составляет достойную конкуренцию указанным программам. Изначально комплекс предназначался для моделирования методом Монте-Карло исключительно нейтронно-физических экспериментов, но удачно выбранная структура разбиения на модули позволила очень быстро распространить BRAND на задачи расчета защиты от излучений, реакторные задачи, задачи радиационной медицины и другие, охватив моделирование совместного переноса нейтронов, фотонов и заряженных частиц. Комплекс также легко «переводится» и на решение краевых задач математической физики (алгоритмы блуждания по границе и по сетке). Его основное преимущество – это высокая точность получаемых оценок, широкий спектр решаемых задач переноса разного вида излучения, возможность сбора наиболее полной информации о моделируемом процессе. Основное развитие, таким образом, получили модули физических взаимодействий, а также модули детектора и источника. Для программного комплекса был разработан собственный язык построения сложных геометрических объектов, с помощью которого с высокой степенью детализации программируются сборки для расчетов.

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

Средства и методы выполнения работы. C# — объектно-ориентированный язык программирования, один из наиболее динамично развивающихся в последнее десятилетие. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework. С# является удобным и эффективным инструментом для создания приложений со сложным пользовательским интерфейсом. Он имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. Соответственно, этот язык обладает широкой палитрой объектов для проектирования программ, использования, создания и внедрения собственных компонентов и элементов управления. Более того C#-компилятор переводит исходный код программы в промежуточный язык под названием Intermediate Language (IL), а за превращение IL в последовательность машинных команд отвечает Just-In-Time-компилятор (JIT), который оптимизирует код, что повышает эффективность созданных алгоритмов. Оптимизации JIT-компилятора в основном предназначены для повышения производительности вычислительных приложений, но они оказывают положительное влияние и на другие типы приложений.

Для визуализации трехмерных объектов была выбрана графическая библиотека OpenGl, т.к. она обладает рядом преимуществ:

  • различные функции доступны через расширения (для построения сложных трехмерных сцен и простых примитивов);
  • простота написания кода;
  • идеально подходит для визуализации результатов научных исследований;
  • является «открытым стандартом».


Постановка задачи

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

Для достижения поставленной цели необходимо решить следующие задачи:

- изучить основы метода Монте-Карло и его применение для решения задач переноса излучения;

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

- адаптировать библиотеку для работы в среде программирования Visual Studio 2013 для кода на языке программирования C#;

- изучить библиотеки доступа к графическому интерфейсу OpenGL;

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

- разработать и реализовать алгоритм трехмерной визуализации сборок;

- протестировать имеющиеся библиотеки сборок, провести расчет по одной из них.


1. Геометрический модуль ПК BRAND

ПК BRAND – программный комплекс для моделирования переноса излучения методом Монте-Карло. Как хорошо известно, отличительной чертой метода Монте-Карло является его приспособленность к решению многомерных задач в условиях реальной трёхмерной геометрии с подробным учётом всей имеющейся информации о взаимодействии излучения с веществом. Накопленные на сегодняшний день данные о характеристиках взаимодействия частиц различных типов с материалами настолько обширны, что просто сама работа с этими данными уже представляет собой весьма нетривиальную задачу. Требования же повышения точности расчетов диктуют необходимость использования самой современной информации, которая содержится в библиотеках файлов оценённых данных (отечественная BROND, зарубежные ENDF/B, JENDL, FENDL и другие). В сложившейся современной вычислительной практике файлы оцененных данных используются, как правило, после некоторой предварительной подготовки – процессинга, что к неопределенности исходных данных 0 (см. рис. 1) может добавлять еще и технологические (Tech) и константные (1) неопределенности, привносимые используемыми приближениями и упрощениями. Использование напрямую информации из файлов оцененных данных, наоборот не накапливает ошибку, хотя и приводит к увеличению времени счета. BRAND является программным комплексом с прямым (без процессинга) учетом данных, позволяющим выполнять реперные расчеты при исследовании процессов переноса нейтронов, фотонов и электронов во всем диапазоне энергий, который задан в библиотеках оцененных данных в формате ENDF-6.

Рис1. – Использование различных численных методов и программ для проведения анализа результатов оцененных экспериментов.

  1. Структура ПК BRAND

Архитектура комплекса позволяет включать в него программы моделирования случайных блужданий в многомерном пространстве с использованием аналогового и неаналогового моделирования. Блуждание частицы с точки зрения архитектуры пакета – это случайная последовательность абстрактных событий. Например, для задач переноса излучений: рождение частицы заданного типа внешним источником, столкновение, пролет между двумя точками столкновения, пересечение границ геометрической или регистрационной зоны (детектора), рождение вторичных частиц разных типов, гибель, изменение веса или вылет частицы из системы.

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

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

У – управляющий модуль, обеспечивающий возможность решения задач в различной постановке, либо различными модификациями метода Монте-Карло;

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

И – модуль источника, порождающий начальные фазовые координаты цепи Маркова;

М – модуль построения звена траектории цепи Маркова;

Г – геометрический модуль;

Д – модуль детектора (регистрации);

Н – модуль неаналогового моделирования;

О – модуль постобработки результатов расчета (возможно пустой).

Под рабочей программой (РП) BRAND понимается конкретный набор модулей из основных частей версии комплекса, объединяемых на уровне модулей загрузки или текстов:

РП = У + П + И + Г + Д + М + Н + О. (1)

В свою очередь модуль построения звена траектории цепи Маркова (М), который зачастую распадается на ряд самостоятельных модулей. Например, в задачах переноса излучений М = Ф + Т, где:

Ф – модуль моделирования вектора направления после взаимодействия (физический модуль);

Т – модуль розыгрыша длины свободного пробега.

Такое разделение модуля построения звена траектории цепи Маркова является совершенно необходимым с точки зрения возможности использования неаналогового моделирования процессов. В задачах переноса излучений модуль Ф – это и есть константный модуль (КМ), а модуль Т – модуль построения длины участка траектории между двумя случайными столкновениями частицы.

В модуле визуализации необходимо подключение только двух из них – источника и геометрии.

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

(2)

В общем случае запись p(A/B) означает условную плотность распределения переменной А в зависимости от значений переменной В. В частных случаях все указанные условные плотности могут задаваться и как безусловные. Плотности p и pE должны быть заданы пользователем.

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

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

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

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

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

Геометрический модуль. Библиотека ПК BRAND содержит восемь геометрических специализированных модулей, каждый из которых приспособлен для оптимального выполнения задачи в определенной геометрии:

  • цилиндрическая геометрия;
  • сферическая геометрия;
  • цилиндры в цилиндрах;
  • трехмерная декартовая геометрия;
  • цилиндры в эллипсоиде;
  • конусы в сферах;
  • конусно-цилиндрическая геометрия;
  • три цилиндра.

И, наконец, девятым в библиотеку геометрических модулей входит модуль универсальной геометрии. Данный универсальный геометрический модуль позволяет решать любые пространственные задачи произвольной 3D-геометрии. В нем вся рассматриваемая геометрическая область разбита на однородные по составу геометрические объекты. Геометрический объект – некоторый пространственный объем, ограниченный несколькими поверхностями первого и/или второго порядка. Геометрические объекты могут пересекаться или включать в себя другие объекты. Единственное ограничение – самый большой геометрический объект (среда) должен включать в себя все остальные объекты.

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

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

«Положение» – координаты центра объекта (x0, y0, z0);

«Углы поворота» – углы вокруг осей 0x, 0y, 0z (x, y, z);

«Размеры» – диаметр D (сфера), диаметр D и высота H (цилиндр), три стороны a, b, c (параллелепипед),

«Толщина стенки»:

  • сфера – один параметр, толщина стенки сферической оболочки D;
  • цилиндр – два параметра, толщина стенки цилиндрической оболочки D и толщина дна H;
  • параллелепипед – три параметра, толщина стенок параллелепипеда a, b и толщина дна с.

Модификации геометрических объектов определяются значением параметров «Толщина стенки».

Понятие поверхности. Принято, что каждая поверхность делит все пространство на две части: (+) пространство и (–) пространство. Тогда относительно данной поверхности каждая пространственная точка (x, y, z) характеризуется еще и некоторым признаком (знаком): (+1) – если точка принадлежит (+) пространству и (–1) – в противном случае. Для поверхностей первого порядка (плоскостей) под (+) пространством понимается множество пространственных точек, имеющих положительное отклонение от плоскости, (–) пространство – точки с отрицательным отклонением (напомним, что отклонение меньше нуля, если точка О(x, y, z) и точка О(0, 0, 0) лежат по одну сторону от плоскости). Для цилиндрических и сферических поверхностей, ограничивающих некоторый пространственный объем под (+) пространством понимается множество точек расположенных внутри цилиндрических/сферических поверхностей, (–) пространство – вне них.

Таблица 1. Способы задания геометрических объектов

№ п/п

Модификации

Способы задания

Положение

Размеры

Углы поворота

Толщина стенки

1

сфера

координаты центра

(x0, y0, z0)

диаметр D

не влияет на геометрические характеристики

D  D/2 

сферическая оболочка

0 < D < D/2

2

цилиндр

координаты центра

(x0, y0, z0);

диаметр и высота цилиндра (D, H);

вокруг осей 0x, 0y, 0z автоматически округляются до ближайшего кратного 90°

D  D/2 

цилиндрическая труба

0 < D < D/2,

H = 0 (дно)

цилиндрическая труба с дном с одной стороны («цилиндрический стакан»)

0 < D < D/2

0 < H < H

3

параллелепипед

координаты центра (x0, y0, z0)

длина, ширина и высота параллелепипеда (a, b, c)

осей 0x, 0y, 0z

a  a/2 ,

b  b/2 ,

c  c

прямоугольная труба

c = 0 (при 0 < a < a и 0 < b < b)

прямоугольная труба с дном с одной стороны («прямоугольный стакан»)

0 < c < c

0 < a < a

0 < b < b)

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

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

Задать геометрическую зону означает задать число ее границ (поверхностей) и указать для каждой граничной поверхности (+) или (–) пространство пересекается с объемом данной зоны. Пересечение геометрических зон недопустимо.

На настоящий момент в ПК BRAND реализованы следующие поверхности, для каждой из которых принято указанное ниже стандартное имя.

1. PLAN - плоскость, заданная уравнением Ax+By+Cz+D = 0. Под (+) пространством понимается множество пространственных точек, имеющих положительное отклонение от плоскости, (–) пространство – точки с отрицательным отклонением (отклонение меньше нуля, если точка (Х,Y,Z) и точка (0,0,0) лежат по одну сторону от плоскости).

2. SFER - сфера с заданным радиусом и центром. Объем внутри сферы - (+) пространство, снаружи - (–) пространство.

3. CIL - бесконечный круговой цилиндр заданного радиуса. Ось цилиндра параллельна одной из осей координат. Объем внутри цилиндра – (+) пространство, снаружи - (–) пространство.

4. KANON2 - поверхность задана уравнением A(X-X0) 2 +B(Y-Y0) 2 +C(Z-Z0)2 = 0. Можно задавать смещенные относительно точки (0,0,0), но не повернутые относительно канонического вида, поверхности такие как эллипсоид, однополостной гиперболоид, двуполостной гиперболоид, эллиптический (или круговой ) конус, эллиптический (или круговой) цилиндр, гиперболический цилиндр. Для поверхностей, ограничивающих конечный пространственный объем, (+) пространство - внутри объема, что соответствует неравенству A(X-X0) 2 +B(Y-Y0) 2 +C(Z-Z0)2 < 0. Точки, лежащие снаружи конечного пространственного объема (т.е. при неравенстве в противоположную сторону ), относятся к (–) пространству.

5. РОV2 - поверхность задана уравнением: АХХx2 +АYYy2 +АZZz2 +АХYxy +AХZxz +АYZyz+АХx +АYy +АZz +А = 0. В (+) пространство отнесены точки, для которых АХХx2 +АYYy2 +АZZz2 +АХYxy +AХZxz +АYZyz+АХx +АYy +АZz +А < 0, в (–) пространство – остальные.

6. КUВ - параллелепипед с осями, параллельными осям координат. Внутренний объем - (+) пространство, снаружи - (–) пространство.

7. CIL2PL - ограниченный двумя плоскостями круговой цилиндр. Цилиндр параллелен одной из осей координат, а плоскости перпендикулярны этой оси. Внутренний объем - (+) пространство, снаружи - (–) пространство.

8. KON2PL - ограниченный двумя плоскостями круговой конус. Конус параллелен одной из осей координат, а плоскости перпендикулярны этой оси. Внутренний объем - (+) пространство, снаружи - (–) пространство.

9. TRUBA - две коаксиальные поверхности CIL2PL ( "кусок трубы" ). Кольцевой объем трубы – (+) пространство, наружное пространство и объем внутри меньшего цилиндра – (–) пространство.

10. PRIZMA - правильная призма, параллельная одной из осей координат.

  1. Основы метода Монте-Карло для решения уравнения переноса. Общие положения.

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

В общем виде схема метода Монте-Карло можно представить следующим алгоритмом.

Требуется вычислить некоторую величину a, которая может быть как скаляром, так и вектором.

В качестве оценки искомой величины можно построить случайную величину , математическое ожидание которой совпадает со значением a.

Из всех возможных вариантов построенных оценок {i} выберем ту, у которой дисперсия будет наименьшей и алгоритм ее реализации на ЭВМ будет достаточно прост и эффективен.

Имея множество реализаций случайной величины 1, 2,… N на основе закона больших чисел можем вычислить приближенное значение искомой величины

(3)

В основном среди величин, допускающих приведенное выше представление, рассматривают интеграл и линейный функционал , где f(x) – решение интегрального уравнения Фредгольма второго рода

Модель переноса частиц. В некоторой выпуклой области, которая заполнена неоднородным веществом, или на ее границе расположен источник излучения. Частицы, испускаемые этим источником, сталкиваются с частицами вещества и либо поглощаются ими, либо рассеиваются по некоторому случайному закону, заданному индикатрисой рассеивания g(r,,), которая определяет направление дальнейшего движения частицы. Траектория заканчивается после поглощения или вылета из среды.

Такой процесс переноса частиц описывается интегральным уравнением

(4)

где f(x) - плотность столкновений частиц; К- ядро интегрального оператора переноса; f1(x) – плотность первых столкновений, определяемая источником фотонов Ф(x) и транспортной частью ядра К; x=(r, ,E) - точка фазового пространства; =(u,v,w) –направляющие косинусы. При такой записи .

Метод Монте-Карло не может найти решение на всем фазовом пространстве, то есть восстановить вид функции f(x) в каждой точке, есть возможность оценить некоторый функционал от этого решения. То есть, ставится задача определения одной или нескольких характеристик процесса блуждания частиц: вероятность поглощения частицы в определенной области, вероятность попадания частицы в некоторую заданную область, которая является детектором и т.д.

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

,

(5)

где (r,E) – полное сечение взаимодействия.

Гамма версия ПК BRAND позволяет методом Монте-Карло оценивать линейные функционалы от решения интегрального уравнения переноса фотонов (4) в фазовом пространстве координат x =(x,y,z), направлений =(u,v,w) и энергий E. Набор оцениваемых линейных функционалов включает в себя практически все обычно представляющие интерес величины при решении задач защиты от излучений и моделировании ядерно-физических экспериментов

  1. Порядок построения траектории

Считаем, что известна точка ОK(x0, y0, z0) из которой движется частица по лучу с направляющими косинусами (u, v, w) и номер геометрического объекта K, которому принадлежит точка ОK(x0, y0, z0). Всего геометрических объектов N (N K).

Алгоритм вычисления номеров пролетаемых зон (геометрических объектов) и отрезков луча по этим зонам следующий:

  1. Принимаем k  = 1, т.е. выбираем геометрический объект №1.
  2. Для k–го геометрического объекта определяем минимальное расстояние lki > 0 от точки ОK(x0, y0, z0) по лучу (u, v, w) до каждой из поверхностей, образующих настоящий геометрический объект.
  3. Находим координаты точки Оk(x, y, z) на поверхности k-го геометрического объекта
  4. Проверяем принадлежность точки Оk(x, y, z) k–му геометрическому объекту, если точка Оk(x, y, z) не принадлежит объекту – принимаем lki = ?. Если имеем бесконечное множество точек Оk(x, y, z) принадлежащих объекту – принимаем lki = .
  5. Повторяем процедуры – для k  = k  + 1 пока k  <= K.
  6. Находим l = min (lki), минимальное расстояние l из массива значений lki (k  = 1…K).
  7. Если k  = K (вычисления п. ) имеем i – номер поверхности, через которую частица вылетает из K-го геометрического объекта. В противном случае (k  < K) имеем i – номер поверхности, через которую частица влетает в k-тый геометрический объект.
  8. (k  = K). Если k  = N – переход на п. . В противном случае проверяем принадлежность точки Оk(x, y, z) k–му геометрическому объекту (для k  = k  + 1, K < k  <= N) до тех пор пока точка Оk(x, y, z) не будет принадлежать k–му объекту.
  9. (k  < K). Присваиваем значения K = k, x0 = x, y0 = y, z0 = z. Переход на п. алгоритма.
  10. Окончание построения траектории.

  1. Модуль визуализации.

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

Визуализация строится на основе физических функций ПК BRAND переноса фотонов. Рассматривается перенос излучения без потери энергии и прямолинейный, то есть в точке рассеяния восстанавливаем исходное направление движения. Таким образом физический модуль фактически подменен упрощенной схемой замены розыгрыша угла рассеивания, на постоянное исходное значение источника. Порядок действий соответствует приведенному выше алгоритму построения траекторий и соответствует ( Рис. 2).

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

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

Рис. 2. Расположение секущей плоскости и источника на ней (двумерная визуализация)

Рис. 3. Налетающие частицы (трехмерная визуализация)

Такой подход осуществлен для того чтобы изображение строилось в том виде, который был бы «понятен» модулю расчетов, то есть физическому модулю. Это позволяет, с одной стороны, устранить все ошибки в сборе геометрии, которая является наиболее сложной частью исходных данных; с другой стороны, позволяет избежать очень трудоемкого перевода исходной геометрии BRAND на платформы современных трехмерных редакторов.


2. OpenGL

OpenGL является на данный момент одним из самых популярных программных интерфейсов (API) для разработки приложений в области двумерной и трехмерной графики. Стандарт OpenGL был разработан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения, а его основой стала библиотека IRIS GL, разработанная Silicon Graphics.

OpenGL (Open Graphics Library — открытая графическая библиотека, графический API) — спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. На базовом уровне, OpenGL — это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации — библиотеки функций, соответствующих набору функций спецификации. Реализация призвана эффективно использовать возможности оборудования. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests — тесты на соответствие) прежде чем реализация будет классифицирована как OpenGL-реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.

OpenGL ориентируется на следующие две задачи:

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

Характерными особенностями OpenGL, которые обеспечили распространение и развитие этого графического стандарта, являются:

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

Основные возможности

  • Набор базовых примитивов: точки, линии, многоугольники и т.п.
  • Видовые и координатные преобразования
  • Удаление невидимых линий и поверхностей (z-буфер)
  • Использование сплайнов для построения линий и поверхностей
  • Наложение текстуры и применение освещения
  • Добавление специальных эффектов: тумана, изменение прозрачности, смешивание цветов (blending), устранение ступенчатости (anti-aliasing).

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

OpenGL является низкоуровневым процедурным API, что вынуждает программиста диктовать точную последовательность шагов, чтобы построить результирующую растровую графику (императивный подход). Это является основным отличием от дескрипторных подходов, когда вся сцена передается в виде структуры данных (чаще всего дерева), которое обрабатывается и строится на экране. С одной стороны, императивный подход требует от программиста глубокого знания законов трёхмерной графики и математических моделей, с другой стороны — даёт свободу внедрения различных инноваций. Существуют реализации OpenGL для разных платформ. Для этого были созданы библиотеки для отображения информации с помощью оконной подсистемы для операционных систем Windows и Unix (WGL и GLX соответственно), а также библиотеки GLAUX и GLUT, которые используются для создания так называемых консольных приложений.

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

  • Аппроксимация кривых и поверхностей
  • Обработка вершин и сборка примитивов
  • Растеризация и обработка фрагментов
  • Операции над пикселями
  • Подготовка текстуры
  • Передача данных в буфер кадра

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

Построение параллелепипедов при помощи OpenGl.

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

Gl.glBegin(Gl.GL_QUADS);

Gl.glVertex3d(V1.y, V1.z, V1.x); // (left)

Gl.glVertex3d(V1.y, V1.z, V2.x);

Gl.glVertex3d(V1.y, V2.z, V2.x);

Gl.glVertex3d(V1.y, V2.z, V1.x);

Gl.glVertex3d(V1.y, V2.z, V2.x); // (back)

Gl.glVertex3d(V1.y, V2.z, V1.x);

Gl.glVertex3d(V2.y, V2.z, V1.x);

Gl.glVertex3d(V2.y, V2.z, V2.x);

Gl.glVertex3d(V2.y, V2.z, V2.x); // (left)

Gl.glVertex3d(V2.y, V2.z, V1.x);

Gl.glVertex3d(V2.y, V1.z, V1.x);

Gl.glVertex3d(V2.y, V1.z, V2.x);

Gl.glVertex3d(V2.y, V1.z, V2.x); // (before)

Gl.glVertex3d(V2.y, V1.z, V1.x);

Gl.glVertex3d(V1.y, V1.z, V1.x);

Gl.glVertex3d(V1.y, V1.z, V2.x);

Gl.glVertex3d(V1.y, V1.z, V2.x); // (up)

Gl.glVertex3d(V1.y, V2.z, V2.x);

Gl.glVertex3d(V2.y, V2.z, V2.x);

Gl.glVertex3d(V2.y, V1.z, V2.x);

Gl.glVertex3d(V1.y, V1.z, V1.x); // (down)

Gl.glVertex3d(V1.y, V2.z, V1.x);

Gl.glVertex3d(V2.y, V2.z, V1.x);

Gl.glVertex3d(V2.y, V1.z, V1.x);

Gl.glEnd();

Tao Framework – это свободно-распространяемая библиотека, с открытым исходным кодом, предназначенная для быстрой и удобной разработки кросс-платформенного мультимедийного программного обеспечения в среде .NET Framewrok и Mono. Tao Framework – это один из удобных путей для использования библиотеки OpenGL при разработке в среде .NET на языке C#.

В состав библиотеки входят современные средства, которые могут понадобиться в ходе разработки мультимедиа программного обеспечения: реализация библиотеки OpenGL, реализация библиотеки FreeGlut, содержащей современные функции этой библиотеки, библиотека DevIL (легшая в основу стандарта OpenIL – Open Image Library), и многие другие.

Самые интересные библиотеки, включенные в Tao Framework:

OpenGL 2.1.0.12 – свободно распространяемый аппаратно-программный интерфейс для визуализации 2D и 3D графики.

FreeGLUT 2.4.0.2 – библиотека с открытым исходным кодом, являющаяся альтернативой библиотеке GLUT (OpenGL Utility Toolkit).

DevIL 1.6.8.3 (она же OpenIL) – кроссплатформенная библиотека, реализующая программный интерфейс для работы с изображениями. На данный момент библиотека поддвержвивает работу с изображениями 43-х форматов для чтения и17-ти форматов для записи.

Cg 2.0.0.0 – язык высокого уровня, созданный для программирования текстурных и вершинных шейдеров.OpenAL 1.1.0.1 – свободно распространяемый аппаратно-программный интерфейс для обработки аудиоданных. (В том числе 3D звука и EAX эффектов).

PhysFS 1.0.1.2 – библиотека для работы с вводом / выводом файловой системы, а так же различного вида архивами, на основе собственного API.

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

GNU/Linux ODE 0.9.0.0 - свободно распространяемый физический прграммный интерфейс, главной особенностью которого является реализация системы динамики абсолютно твёрдого тела и системаобнаружения столкновений.

FreeType 2.3.5.0 – библиотека реализующая растеризацию шрифтов. Данная библиотека используется в X11(оконной системе, которая обеспечивает все стандартные инструменты и протоколы для построения GUI (графического интерфейса пользователя) в UNIX подобных операционных системах).

FFmpeg 0.4.9.0 - набор свободно-распространяемых библиотек с открытым исходным кодом. Данные мультимедийные библиотеки позволяют работать аудио и видео данными в различных форматах.

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

Для создания приложения были использованы следующие библиотеки:

  • OpenGL – для визуализации трехмерных объектов
  • FreeGLUT – для создания окон, а также взаимодействия с мышью, клавиатурой и прорисовки геометрических примитивов.
  • Windos.Platform – для работы с элементом управления SimpleOpenGLControl, в котором происходит прорисовка всех объектов

В ходе работы были изучены следующие темы:

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

Освещение любого объекта зависит от двух факторов. Первый - это материал, из которого сделан объект. Второй - это свет, которым он освещен.

После того, как задана необходимая геометрия (нормали) необходимо разместить на сцене один или несколько источников света, настроить их свойства и включить их. По умолчанию освещение отключено. Включается оно командой glEnable(GL_LIGHTING). В зависимости от реализации OpenGL на сцене могут присутствовать восемь и более источников света. Включить нулевой источник света можно командой:

glEnable(GL_LIGHT0);

Остальные включаются аналогичным способом, где вместо GL_LIGHT0 указывается GL_LIGHTi. После того, как источник включен, необходимо задать его параметры. В OpenGL существует три типа источников света:

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

Для управления свойствами источника света используются команды glLight*:

glLightf(GLenum light, GLenum pname, GLfloat param);

glLightfv(GLenum light, GLenum pname, const GLfloat *param);

Параметр light указывает OpenGL для какого источника света задаются параметры. Команда glLightf используется для задания скалярных параметров, а glLightfv используется для задания векторных характеристик источников света.

Для источника света можно задать фоновую, рассеянную и зеркальную компоненты излучения.

Параметр pname команды glLightfv:

GL_AMBIENT - цвет фонового излучения источника света

GL_DIFFUSE - цвет рассеянного излучения источника света (значение по умолчанию для

GL_LIGHT0 - белый, для остальных - черный)

GL_SPECULAR - цвет зеркального излучения источника света (значение по умолчанию для

GL_LIGHT0 - белый, для остальных - черный)

Источники направленного света. Источника света такого типа находится в бесконечности и свет от него распространяется в заданном направлении. Идеально подходит для создания равномерного освещения. Хорошим примером источника направленного света может служить Солнце. У источника направленного света, кроме компонент излучения, можно задать только направление.

Параметр pname команды glLightfv:

GL_POSITION - (x, y, z, w) направление источника направленного света. Первые три компоненты (x, y, z) задают вектор направления, а компонента w всегда равна нулю.

Направленный источник света

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

(6)

Т.о. для точечного источника света, кроме свойств излучения, можно задать ещё четыре параметра:

GL_POSITION - позиция источника света (по умолчанию источник света направленный)

GL_CONSTANT_ATTENUATION - постоянная k_const в функции затухания f(d)

GL_LINEAR_ATTENUATION - коэффициент k_linear при линейном члене в функции затухания f(d)

GL_QUADRATIC_ATTENUATION - коэффициент k_quadratic при квадрате расстояния в функции затухания f(d)

Точечный источник света, убывание интенсивности с расстоянием выключено

Точечный источник света, убывание интенсивности с расстоянием включено

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

Параметр pname команды glLightfv

GL_SPOT_DIRECTION - (x, y, z) - направление прожектора (ось ограничивающего конуса

GL_SPOT_CUTOFF - угол между осью и стороной конуса (он же половина угла при вершине)

GL_SPOT_EXPONENT- экспонента убывания интенсивности

Прожектор

Прожектор, включен расчет убывания интенсивности для прожектора

В своей работе я использовала направленный источник света для освещения сцены.

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

glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);

Параметр face команды glMaterialfv:

GL_FRONT - Свойства задаются для лицевой стороны поверхности.

GL_BACK - Свойства задаются для тыльной стороны поверхности.

GL_FRONT_AND_BACK - Свойства задаются для обеих сторон поверхности.

Параметр pname задает, какое свойство материала передается через params.

Параметр pname команды glMaterialfv:

GL_AMBIENT - цвет фонового отражения материала

GL_DIFFUSE - цвет рассеянного отражения материала

GL_SPECULAR - цвет зеркального отражения материала

GL_EMISSION - цвет собственного излучения материала

GL_SHININESS - степень в формуле зеркального отражения (коэффициент блеска). Допускаются значения в интервале.

GL_AMBIENT_AND_DIFFUSE - цвет фонового и рассеянного отражения материала

Params содержит указатель на массив из четырех чисел соответствующего типа (или одного для GL_SHININESS). Отсечения здесь не происходит и в расчете освещенности эти значения участвуют как есть. Для установки коэффициента блеска можно использовать команду:

glMaterialf(GLenum face, GL_SHININESS, GLfloat shininess);


  1. Апробация на разных сборках.

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

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

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

Функция vlet написана таким образом, что она моделирует прохождение частицы через материал с запретом соударений в нем (Рис. 4). Таким образом, в результате сквозного пролета одной частицы можно получить следующие данные:

  1. попала ли частица в хотя бы одну из зон сборки
  2. если да, то через сколько зон она пролетела
  3. какие материалы заполняют каждую из зон
  4. длину следа частицы в каждой из зон.

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

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

(Рис. 4 Иллюстрация функции vlet)


3.1. Пользовательский интерфейс.

Программа SUPER BRAND имеет простой интерфейс, состоящий из нескольких окон

Первое окно представляет собой картинку одной из сборок, с которой работает программный комплекс BRAND, а также кнопкой «Продолжить», которая переводит нас на главное окно, состоящее из панели вкладок и панели икон.

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

После открытия файла появляется окно с изображением сборки.

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

Вкладка «Материалы» вызывает апплет «Таблица зон», который позволяет пользователю самостоятельно задать цвета для различных материалов

.

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


3.2. Практическая часть. Двухмерный режим.

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

void vlet(ref double X, ref double Y, ref double Z, ref double U, ref double V, ref double W,ref int ISTOP, ref int KGEOM, ref double AT)-функция, позволяющая выводить луч, где:

ref double X, ref double Y, ref double Z- передача координат по ссылке, из которых выпускается луч;

ref double U, ref double V, ref double W-передача направления выпускаемого луча;

ref int ISTOP-остановочный элемент, передает значение «0» если на пути луча не был встречен элемент сборки, «1»-был найден элемент сборки;

ref int KGEOM-передает количество зон, встреченных на пути;

ref double AT – содержит расстояние до первой зоны.

Далее осуществляется первая прорисовка в плоскости YOZ (см. приложение 3)


3.2.1. Тестирование двухмерного режима

В режиме тестирования были проверены различные функции программы.

  1. Проекция параллельно оси OY. Были выбраны точки Y=2,941 Z=-8,824

  1. Проекция параллельно оси OZ. Были выбраны точки X=-170,588 Y=-2,941

  1. Масштабирование: уменьшение и увеличение (см приложение 4)

  1. Задание данных. Выбрали ось сечения-OY, значение по оси=-2,941.

  1. Таблица материалов. Был выбран материал под номером 2, сменили цвет с оранжевого на синий.

  1. Прокрутка. Изображение было сдвинуто вправо и вниз


3.3. Практическая часть. Трехмерный режим.

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

Для обеспечения связи с BRAND было создано две библиотеки void vlet и void geom. Это внешние функции, загружаемые из разработанной динамической библиотеки. Они были адоптированны для трехмерной визуализации. Для этого был создан публичный класс.

    public static void Vlet ( ref Luch luch, ref int ISTOP, ref int KGEOM, ref double AT)

    {

        double X = luch.position.x;

        double Y = luch.position.y;

        double Z = luch.position.z;

        double U = luch.direction.x;

        double V = luch.direction.y;

        double W = luch.direction.z;

      

      vlet(ref X, ref Y, ref Z, ref U, ref V, ref  W, ref ISTOP, ref KGEOM, ref AT);

      luch = new Luch(new Point3D(X,Y,Z), new Point3D(U,V,W));

     

    }

    public static void Geom(ref int KGEOM,ref Luch luch,  ref int KMAX, int[] MS, double[] AMR)

    {

        double X = luch.position.x;

        double Y = luch.position.y;

        double Z = luch.position.z;

        double U = luch.direction.x;

        double V = luch.direction.y;

        double W = luch.direction.z;

        WorkWithDll.geom(ref KGEOM, ref X, ref Y, ref Z, ref U, ref V, ref  W, ref  KMAX, MS, AMR);

        luch = new Luch(new Point3D(X, Y, Z), new Point3D(U, V, W));

    }

ref int KGEOM- передает количество зон, встреченных на пути;

Luch luch - структура, содержащая информацию о координатах и направлении точки

ref int ISTOP-остановочный элемент, передает значение «0» если на пути луча не был встречен элемент сборки, «1»-был найден элемент сборки;

ref double AT – содержит  расстояние до первой зоны.

ref int KMAX-передает общую длину всех зон;

int[] MS-массив, встреченных зон;

double[] AMR-массив длин всех зон;

Класс, отвечающий за трехмерную прорисовку.

Чтобы сборка была нарисована, сначала определяются ее границы, далее формируется массив длин материалов на каждый луч. Выпускаемый нейтронный луч, как говорилось ранее, представляет собой параллелепипед, разделенный на различный зоны. Была выбрана плоскость XOZ, из которой выпускаются лучи с шагом 60. Таким образом, объект представляет собой набор параллелепипедов. Конечный результат – трехмерное изображение сборки на экране компьютера(см. приложение 8). Данная сборка является грубым изображением из-за крупного разбиения плоскости. Шаг  построения фигуры можно задавать вручную в приложении, тем самым увеличивая или уменьшая точность отрисовки.


3.3.1. Тестирование трехмерного режима

  1. Изменение шага разбиения для прорисовки сборки.

  1. Масштабирование изображения (см.приложение 4)

  1. Динамическое взаимодействие с фигурой: повороты вдоль осей OX,OY, OZ, смещение вдоль OX, OY (см приложение 6,7).

  1. Взаимодействие с нарисованными зонами и материалами: прорисовка указанных зон или материалов. Просмотр информации по материалу. Т.к. заказчиком не была представлена общее обозначение материалов, их название и свойство. Было принято решение обозначать условно: “Material” + №

3.4. Тестирование на реальных сборках.

Двухмерный режим

Трехмерный режим

Вычислительный эксперимент

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

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

Хранилище отработавшего ядерного топлива (ХОЯТ) – это комплекс зданий и сооружений с бассейнами, имеющими автономные системы спецвентиляции, водоочистки и охлаждения. Комплекс расположен в охраняемом периметре промышленной площадки АЭС. В приёмном отделении хранилища ОТВС поштучно извлекаются из транспортного чехла, помещаются в пеналы, заполненные водой, и поступают на длительное хранение в заполненные водой отсеки хранилища. Бассейны хранилища представляют собой прямоугольные железобетонные емкости, выполненные из гидротехнического бетона и облицованные нержавеющей сталью. Для повышения безопасности ХОЯТ под его

Рис. 5. Изображение ХОЯТа

фундаментной плитой расположен железобетонный «поддон» для улавливания протечек. Над водяным бассейном установлено щелевое балочное перекрытие (2 на Рис. 5), и пеналы (3 на Рис. 5) с отработавшим ядерным топливом (ОЯТ), размещенных непосредственно на балках посредством фланцев.

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

Результаты расчетов для гамма излучения приведены в таблице 2. Тип рассматриваемой ситуации обозначается в форме: уровень воды в пенале (от нормального) (Np-Hp), см / уровень воды в бассейне (от нормального) (Nb-Pb), см /плотность воды в пенале , % (относительно 1)

Таблица 2. Мощности дозы гамма-излучения (нрад/с)

Положение расчетной точки относительно уровня пола, см

0/0/100

0/0/90

0/-50/100

0/-50/90

M

D

M

D

M

D

M

D

-125

5540.9

0.3

5735.5

0.4

5571.2

0.4

5758.7

0.3

-95

336.5

1.1

390.8

1.3

624.8

1.4

715.2

0.8

-70

46.4

1.0

58.7

1.0

155.8

1.9

195.2

1.5

0

9.4

0.8

11.9

0.9

31.5

1.0

38.6

0.5

Положение расчетной точки относительно уровня пола, см

-50/-50/100

-50/-50/90

-50/0/100

-50/0/90

M

D

M

D

M

D

M

D

-125

5618.5

0.1

5841.6

0.2

5594.3

0.3

5786.1

0.3

-95

1660.6

0.4

1740.1

0.2

943.1

1.3

979.4

0.5

-70

950.2

0.3

1002.2

0.2

339.6

1.8

351.2

0.7

0

173.7

0.2

183.3

0.2

69.4

0.6

73.0

0.5

Далее рассчитывалось распределение мощности дозы на уровне пола и на уровне верхней точки топливного столба в пределах элементарной ячейки для ситуации с наихудшим показателем в табл. 2., то есть когда уровень воды и в пенале и в бассейне снижен на 0,5 м от нормального уровня, плотность воды 0,9 г/см3..

Рис 6. Распределение мощности дозы гамма-излучения на уровне пола в пределах элементарной ячейки для ситуации -50/-50/90, как самой напряженной.

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

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


Полученные результаты с геометрического модуля.

Двухмерный режим

Трехмерный режим


Выводы

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

Так же были изучены: основы метода Монте-Карло и его применение для решения задач переноса излучения, библиотеки доступа к графическому интерфейсу OpenGL;


Литература

1. http://ru.wikipedia.org (свободная общедоступная мультиязычная универсальная интернет-энциклопедия)

2. П.А. Андросенко, В.И. Белоусов, А.В. Коньков, А.Г. Царина. Современный статус комплекса программ BRAND// Вопросы атомной наук и и техники. Серия: Физика ядерных реакторов, 2006, вып. 1, с. 74-84

3. .Андросенко А.А., Андросенко П.А. Комплекс программ BRAND для расчетов характеристик переноса излучения методом Монте-Карло. Вопросы атомной науки и техники. Сер. Физика и техника ядерных реакторов, 1985, вып. 7, с. 33.

4. Андросенко А.А., Андросенко П.А., Болонкина Г.В., Дубровина С.И., Кривцов А.С., Пупко С.В. Интегрированный константный модуль комплекса программ BRAND. Препринт ФЭИ-2565, Обнинск, 1996.

5. П.А. Андросенко, Г.В. Попова. Эффективный метод моделирования распределения Клейна-Нишины-Тамма// Журнал вычислительной математики и математической физики. 1981. Вып.4, c.1056-1061.

6. Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование: Методы Монте-Карло: учеб. Пособие. – Академия, Новосибирск, 2009

7. http://www.laes.ru/content/actual/2011/22_11_11_2.htm

8. http://www.esate.ru/ (мультимедиа сообщество)

9. http://www.codenet.ru (сайт для программистов)


Приложение

  1. Пример задания исходных данных геометрии


&COMG MHIST=20000,MPACH=2,IRUSS=1,I120=0,

WESN=1.E+6,EMS=.01,SNORM=119.76095187e+12,

RESTRT=.F.,MPRINT=1,VARNAM='1_co60' /

&ISTG XIS=91.6,RIS=0. /

&ISTA IU0=2 /

&ISTE IE0=8,NTE=2,

ZN=1.332,1.173,

PROB=99.98,99.87 /

&GENAME GEONAM='UN94' /

&GEO NPOV=71,NZON=75 /

&GEOP NP1=1,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=16.5 /

&GEOP NP1=2,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=19.9 /

&GEOP NP1=3,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=22. /

&GEOP NP1=4,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=48.9 /

&GEOP NP1=5,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=57.1 /

&GEOP NP1=6,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=72.5 /

&GEOP NP1=7,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=86.5 /

&GEOP NP1=8,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=500. /

&GEOP NP1=9,POVNAM='PLAN' /

&GEOPLN X=-800. /

&GEOP NP1=10,POVNAM='PLAN' /

&GEOPLN X=0.001 /

&GEOP NP1=11,POVNAM='PLAN' /

&GEOPLN X=43.4 /

&GEOP NP1=12,POVNAM='PLAN' /

&GEOPLN X=51.9 /

&GEOP NP1=13,POVNAM='PLAN' /

&GEOPLN X=205.3 /

&GEOP NP1=14,POVNAM='PLAN' /

&GEOPLN X=218.5 /

&GEOP NP1=15,POVNAM='PLAN' /

&GEOPLN X=271.5 /

&GEOP NP1=16,POVNAM='PLAN' /

&GEOPLN X=309.6 /

&GEOP NP1=17,POVNAM='PLAN' /

&GEOPLN X=330.6 /

&GEOP NP1=18,POVNAM='PLAN' /

&GEOPLN X=700. /

&GEOP NP1=19,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=23.7 /

&GEOP NP1=20,POVNAM='POV2' /

&GEOPV2 AXX=0.172303310786757,

AYY=-1.,

AZZ=-1.,

AX = -115.892773228907,

A = 19487.6332111072 /

&GEOP NP1=21,POVNAM='POV2' /

&GEOPV2 AXX=7.054236330694872E-003,

AYY=-1.,

AZZ=-1.,

AX = -8.34908549817099,

A = 2470.40308078616 /

* 9 sfer v peregruzo4nom bloke

&GEOP NP1=22,POVNAM='SFER' &END

&GEOSFR X0=99.8,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=23,POVNAM='SFER' &END

&GEOSFR X0=99.8,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=24,POVNAM='SFER' &END

&GEOSFR X0=115.,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=25,POVNAM='SFER' &END

&GEOSFR X0=115.,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=26,POVNAM='SFER' &END

&GEOSFR X0=130.2,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=27,POVNAM='SFER' &END

&GEOSFR X0=130.2,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=28,POVNAM='SFER' &END

&GEOSFR X0=145.4,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=29,POVNAM='SFER' &END

&GEOSFR X0=145.4,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=30,POVNAM='SFER' &END

&GEOSFR X0=160.6,Y0=0.,Z0=0.,R=7.5 /

* Kontejner v peregruzo4nom bloke ( number 14 )

&GEOP NP1=31,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=16. /

&GEOP NP1=32,POVNAM='PLAN' /

&GEOPLN X=91.6 /

&GEOP NP1=33,POVNAM='PLAN' /

&GEOPLN X=92.1 /

&GEOP NP1=34,POVNAM='PLAN' /

&GEOPLN X=168.6 /

&GEOP NP1=35,POVNAM='PLAN' /

&GEOPLN X=169.1 /

* Steel 10-mm tube v waxte

* 3 kontejnera v waxte ( number 13, 12 and 11 )

&GEOP NP1=36,POVNAM='CIL' /

&GEOCIL Y0=0.,Z0=0.,R=18.9 /

&GEOP NP1=37,POVNAM='PLAN' /

&GEOPLN X=-312.5 /

&GEOP NP1=38,POVNAM='PLAN' /

&GEOPLN X=-313. /

&GEOP NP1=39,POVNAM='PLAN' /

&GEOPLN X=-389.5 /

&GEOP NP1=40,POVNAM='PLAN' /

&GEOPLN X=-390.5 /

&GEOP NP1=41,POVNAM='PLAN' /

&GEOPLN X=-467. /

&GEOP NP1=42,POVNAM='PLAN' /

&GEOPLN X=-468. /

&GEOP NP1=43,POVNAM='PLAN' /

&GEOPLN X=-544.5 /

&GEOP NP1=44,POVNAM='PLAN' /

&GEOPLN X=-545. /

* 9 sfer v 13-th kontejnere ( Xbot = -390. )

&GEOP NP1=45,POVNAM='SFER' &END

&GEOSFR X0=-381.8,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=46,POVNAM='SFER' &END

&GEOSFR X0=-381.8,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=47,POVNAM='SFER' &END

&GEOSFR X0=-366.6,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=48,POVNAM='SFER' &END

&GEOSFR X0=-366.6,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=49,POVNAM='SFER' &END

&GEOSFR X0=-351.4,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=50,POVNAM='SFER' &END

&GEOSFR X0=-351.4,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=51,POVNAM='SFER' &END

&GEOSFR X0=-336.2,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=52,POVNAM='SFER' &END

&GEOSFR X0=-336.2,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=53,POVNAM='SFER' &END

&GEOSFR X0=-321.,Y0=0.,Z0=0.,R=7.5 /

* 9 sfer v 12-th kontejnere ( Xbot = -467.5 )

&GEOP NP1=54,POVNAM='SFER' &END

&GEOSFR X0=-459.3,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=55,POVNAM='SFER' &END

&GEOSFR X0=-459.3,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=56,POVNAM='SFER' &END

&GEOSFR X0=-444.1,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=57,POVNAM='SFER' &END

&GEOSFR X0=-444.1,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=58,POVNAM='SFER' &END

&GEOSFR X0=-428.9,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=59,POVNAM='SFER' &END

&GEOSFR X0=-428.9,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=60,POVNAM='SFER' &END

&GEOSFR X0=-413.7,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=61,POVNAM='SFER' &END

&GEOSFR X0=-413.7,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=62,POVNAM='SFER' &END

&GEOSFR X0=-398.5,Y0=0.,Z0=0.,R=7.5 /

* 9 sfer v 11-th kontejnere ( Xbot = -545. )

&GEOP NP1=63,POVNAM='SFER' &END

&GEOSFR X0=-536.8,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=64,POVNAM='SFER' &END

&GEOSFR X0=-536.8,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=65,POVNAM='SFER' &END

&GEOSFR X0=-521.6,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=66,POVNAM='SFER' &END

&GEOSFR X0=-521.6,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=67,POVNAM='SFER' &END

&GEOSFR X0=-506.4,Y0=0.,Z0=8.,R=7.5 /

&GEOP NP1=68,POVNAM='SFER' &END

&GEOSFR X0=-506.4,Y0=0.,Z0=-8.,R=7.5 /

&GEOP NP1=69,POVNAM='SFER' &END

&GEOSFR X0=-491.2,Y0=8.,Z0=0.,R=7.5 /

&GEOP NP1=70,POVNAM='SFER' &END

&GEOSFR X0=-491.2,Y0=-8.,Z0=0.,R=7.5 /

&GEOP NP1=71,POVNAM='SFER' &END

&GEOSFR X0=-476.,Y0=0.,Z0=0.,R=7.5 /

&GEOZ NZ1=1, NPINZN=4, IPOV=+2,-9,-10,-36, MAT=3 /

&GEOZ NZ1=2, NPINZN=4, IPOV=-2,+8,-9,-10, MAT=2 /

&GEOZ NZ1=3, NPINZN=3, IPOV=+3,+10,-11, MAT=1 /

&GEOZ NZ1=4, NPINZN=4, IPOV=-3,+6,+10,-11, MAT=3 /

&GEOZ NZ1=5, NPINZN=4, IPOV=-6,+8,+10,-11, MAT=1 /

&GEOZ NZ1=6, NPINZN=3, IPOV=+1,+11,-12, MAT=1 /

&GEOZ NZ1=7, NPINZN=4, IPOV=-1,+7,+11,-12, MAT=3 /

&GEOZ NZ1=8, NPINZN=4, IPOV=-7,+8,+11,-12, MAT=1 /

&GEOZ NZ1=9, NPINZN=12, IPOV=+31,+33,-34,-22,-23,-24,-25,-26,-27,-28,-29,-30, MAT=1 /

&GEOZ NZ1=10, NPINZN=4, IPOV=-1,+5,+12,-13, MAT=3 /

&GEOZ NZ1=11, NPINZN=4, IPOV=-5,+8,+12,-13, MAT=1 /

&GEOZ NZ1=12, NPINZN=3, IPOV=+1,+13,-14, MAT=1 /

&GEOZ NZ1=13, NPINZN=4, IPOV=-1,+4,+13,-14, MAT=3 /

&GEOZ NZ1=14, NPINZN=4, IPOV=-4,+8,+13,-14, MAT=1 /

&GEOZ NZ1=15, NPINZN=3, IPOV=+1,+14,-15, MAT=1 /

&GEOZ NZ1=16, NPINZN=4, IPOV=-1,-20,+14,-15, MAT=3 /

&GEOZ NZ1=17, NPINZN=4, IPOV=+20,+8,+14,-15, MAT=1 /

&GEOZ NZ1=18, NPINZN=3, IPOV=+1,+15,-16, MAT=1 /

&GEOZ NZ1=19, NPINZN=4, IPOV=-1,-21,+15,-16, MAT=3 /

&GEOZ NZ1=20, NPINZN=4, IPOV=+21,+8,+15,-16, MAT=1 /

&GEOZ NZ1=21, NPINZN=3, IPOV=+19,+16,-17, MAT=3 /

&GEOZ NZ1=22, NPINZN=4, IPOV=-19,+8,+16,-17, MAT=1 /

&GEOZ NZ1=23, NPINZN=3, IPOV=+8,+17,-18, MAT=1 /

&GEOZ NZ1=24, NPINZN=1, IPOV=+22, MAT=4 /

&GEOZ NZ1=25, NPINZN=1, IPOV=+23, MAT=4 /

&GEOZ NZ1=26, NPINZN=1, IPOV=+24, MAT=4 /

&GEOZ NZ1=27, NPINZN=1, IPOV=+25, MAT=4 /

&GEOZ NZ1=28, NPINZN=1, IPOV=+26, MAT=4 /

&GEOZ NZ1=29, NPINZN=1, IPOV=+27, MAT=4 /

&GEOZ NZ1=30, NPINZN=1, IPOV=+28, MAT=4 /

&GEOZ NZ1=31, NPINZN=1, IPOV=+29, MAT=4 /

&GEOZ NZ1=32, NPINZN=1, IPOV=+30, MAT=4 /

&GEOZ NZ1=33, NPINZN=3, IPOV=+1,+32,-33, MAT=3 /

&GEOZ NZ1=34, NPINZN=3, IPOV=+1,+34,-35, MAT=3 /

&GEOZ NZ1=35, NPINZN=4, IPOV=+1,-31,+33,-34, MAT=3 /

&GEOZ NZ1=36, NPINZN=3, IPOV=+1,+12,-32, MAT=1 /

&GEOZ NZ1=37, NPINZN=3, IPOV=+1,-13,+35, MAT=1 /

* Steel 10-mm tube v waxte

* 3 kontejnera v waxte ( number 13, 12 and 11 )

&GEOZ NZ1=38, NPINZN=4, IPOV=-1,-9,-10,+36, MAT=1 /

&GEOZ NZ1=39, NPINZN=3, IPOV=+1,-10,-37, MAT=1 /

&GEOZ NZ1=40, NPINZN=4, IPOV=+1,-9,-31,+37, MAT=3 /

&GEOZ NZ1=41, NPINZN=3, IPOV=+31,+37,-38, MAT=3 /

&GEOZ NZ1=42, NPINZN=3, IPOV=+31,+39,-40, MAT=3 /

&GEOZ NZ1=43, NPINZN=3, IPOV=+31,+41,-42, MAT=3 /

&GEOZ NZ1=44, NPINZN=3, IPOV=+31,+43,-44, MAT=3 /

&GEOZ NZ1=45, NPINZN=3, IPOV=+31,+44,-9, MAT=5 /

* 9 sfer v 13-th kontejnere ( Xbot = -390. )

&GEOZ NZ1=46, NPINZN=12, IPOV=+31,+38,-39,-45,-46,-47,-48,-49,-50,-51,-52,-53, MAT=1 /

&GEOZ NZ1=47, NPINZN=1, IPOV=+45, MAT=4 /

&GEOZ NZ1=48, NPINZN=1, IPOV=+46, MAT=4 /

&GEOZ NZ1=49, NPINZN=1, IPOV=+47, MAT=4 /

&GEOZ NZ1=50, NPINZN=1, IPOV=+48, MAT=4 /

&GEOZ NZ1=51, NPINZN=1, IPOV=+49, MAT=4 /

&GEOZ NZ1=52, NPINZN=1, IPOV=+50, MAT=4 /

&GEOZ NZ1=53, NPINZN=1, IPOV=+51, MAT=4 /

&GEOZ NZ1=54, NPINZN=1, IPOV=+52, MAT=4 /

&GEOZ NZ1=55, NPINZN=1, IPOV=+53, MAT=4 /

* 9 sfer v 12-th kontejnere ( Xbot = -467.5 )

&GEOZ NZ1=56, NPINZN=12, IPOV=+31,+40,-41,-54,-55,-56,-57,-58,-59,-60,-61,-62, MAT=1 /

&GEOZ NZ1=57, NPINZN=1, IPOV=+54, MAT=4 /

&GEOZ NZ1=58, NPINZN=1, IPOV=+55, MAT=4 /

&GEOZ NZ1=59, NPINZN=1, IPOV=+56, MAT=4 /

&GEOZ NZ1=60, NPINZN=1, IPOV=+57, MAT=4 /

&GEOZ NZ1=61, NPINZN=1, IPOV=+58, MAT=4 /

&GEOZ NZ1=62, NPINZN=1, IPOV=+59, MAT=4 /

&GEOZ NZ1=63, NPINZN=1, IPOV=+60, MAT=4 /

&GEOZ NZ1=64, NPINZN=1, IPOV=+61, MAT=4 /

&GEOZ NZ1=65, NPINZN=1, IPOV=+62, MAT=4 /

* 9 sfer v 11-th kontejnere ( Xbot = -545. )

&GEOZ NZ1=66, NPINZN=12, IPOV=+31,+42,-43,-63,-64,-65,-66,-67,-68,-69,-70,-71, MAT=1 /

&GEOZ NZ1=67, NPINZN=1, IPOV=+63, MAT=4 /

&GEOZ NZ1=68, NPINZN=1, IPOV=+64, MAT=4 /

&GEOZ NZ1=69, NPINZN=1, IPOV=+65, MAT=4 /

&GEOZ NZ1=70, NPINZN=1, IPOV=+66, MAT=4 /

&GEOZ NZ1=71, NPINZN=1, IPOV=+67, MAT=4 /

&GEOZ NZ1=72, NPINZN=1, IPOV=+68, MAT=4 /

&GEOZ NZ1=73, NPINZN=1, IPOV=+69, MAT=4 /

&GEOZ NZ1=74, NPINZN=1, IPOV=+70, MAT=4 /

&GEOZ NZ1=75, NPINZN=1, IPOV=+71, MAT=4 /

&DETG NDETG=1,TIPDET='LOK' /

&DGLOK NDD=4,

NEKD=27,

DESET=0.01,0.05,.1,.15,.2,.25,.3,.35,.4,.45,

.5,.55,.6,.65,.7,.75,.8,.85,.9,.95,

1.,1.05,1.1,1.15,1.2,1.25,1.3,1.35,73*,

DEF=27*1.,73*,

XD=400.,300.,200.,100.,46*,

YD=2*124.6,2*157.1,46*

ZD=4*0.,46*,

SD1=4*0.,46*

/

&CONG CnstGamName='cnst_gam.b6',

NEL=18,NZONE=5,MPECH=0,

ELNAME=' 01h',' 06c',' 07n',' 08o',' 18ar0',' 11na0',' 12mg0',' 13al0',

' 14si0',' 17cl0',' 19k0',' 20ca0',' 24cr0',' 25mn0',' 26fe0',

' 28ni0',' 29cu0',' 82pb0',17*,

RO=0.,0.00692470,3*0.,

0.00000001,0.00025054,0.00079230,0.00005289,0.00001457,

0.00003913,4*0.,

0.00001051,0.04322342,3*0.,

0.00000026,4*0.,

0.,0.00060922,3*0.,

0.,0.00030912,3*0.,

0.,0.00194868,3*0.,

0.,0.01311095,0.00045742,0.00022620,0.00006231,

0.,0.00012528,3*0.,

0.,0.00040161,3*0.,

0.,0.00364656,3*0.,

0.,0.,0.00022878,0.00274913,0.00075725,

0.,0.00000695,0.00043305,0.00028910,0.00007963,

0.,0.00014853,0.08364946,0.00978606,0.00269556,

0.,0.,0.00024314,0.00135264,0.00037258,

0.,0.,0.00022463,0.00003749,0.00001033,

0.,0.00001289,3*0.,

  1. Обеспечение диалогового режима для открытия файла с необходимой геометрией

private void openToolStripMenuItem1_Click(object sender, EventArgs e)

{

try

{

// открываем диалоговое окно для выбора открывающегося файла

if (this.openFileDialog1.ShowDialog() == DialogResult.OK)

{

// запоминаем имя файла

FileName = openFileDialog1.FileName;

char[] str = new char[1024];

// если файл существует

if (FileName == null)

FileName = "zzz.nam";

// копируем его в строковую переменную

FileName.CopyTo(0, str, 0, FileName.Length);

// загружаем бъект

Main.isgeom(str, ref NZON, NZN);

// открываем форму

Draw Child = new Draw();

Child.MdiParent = this;

Child.Show();

}

}

catch (Exception ex)

{

MessageBox.Show("Невозможно открыть файл " + openFileDialog1.FileName + "\n" + ex.Message);

}

  1. Реализация первой прорисовки в плоскости YOZ в 2D режиме.

void PrepareArray(double X1, double Y1, Rectangle rect, ref double max, int cluster)

{

/* double start_posX = X+dx*rect.Width;

double start_posY = Y+dy*rect.Height;*/

double ZZ = -2000;

double UU = 0.0;

double VV = 0.0;

double WW = 0.0;

int height = rect.Height / cluster;

int width = rect.Width / cluster;

ScreenArray = new double[(height+1)*(width+1)];

ScreenZone = new int[(height+1)*(width+1)];

mas = new Point_description[(height + 1) * (width + 1)];

for (int i = 0, i1=0; i < rect.Width; i+=cluster, i1++)

{

double XX = X1 + dx * i;

for (int j = 0, j1=0; j < rect.Height; j+=cluster, j1++)

{

double YY = Y1 + dy * j;

switch (NumPln)

{

case 0:

{

UU = 1;

MainForm.vlet(ref ZZ, ref XX, ref YY, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);

if (ISTOP != 1)

{

ScreenArray[i1 * height + j1] = AT;

ScreenZone[i1 * height + j1] = KGEOM;

mas[i1 * height + j1].AT = AT;

mas[i1 * height + j1].KGeom = KGEOM;

MainForm.geom(ref KGEOM, ref ZZ, ref XX, ref YY, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);

mas[i1 * height + j1].Zones = new int[KMAX];

mas[i1 * height + j1].Distances = new double[KMAX];

for (int ii = 0; ii < KMAX; ii++)

{

mas[i1 * height + j1].Distances[ii] = AMR[ii];

mas[i1 * height + j1].Zones[ii] = MS[ii];

}

}

else

{

ScreenZone[i1 * height + j1] = -1;

mas[i1 * height + j1].KGeom = -1;

}

ZZ = -2000.0;

break;

}

case 1:

{

VV = 1.0;

MainForm.vlet(ref XX, ref ZZ, ref YY, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);

if (ISTOP != 1)

{

ScreenArray[i1 * height + j1] = AT;

ScreenZone[i1 * height + j1] = KGEOM;

mas[i1 * height + j1].AT = AT;

mas[i1 * height + j1].KGeom = KGEOM;

MainForm.geom(ref KGEOM, ref XX, ref ZZ, ref YY, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);

mas[i1 * height + j1].Zones = new int[KMAX];

mas[i1 * height + j1].Distances = new double[KMAX];

for (int ii = 0; ii < KMAX; ii++)

{

mas[i1 * height + j1].Distances[ii] = AMR[ii];

mas[i1 * height + j1].Zones[ii] = MS[ii];

}

}

else

{

ScreenZone[i1 * height + j1] = -1;

mas[i1 * height + j1].KGeom = -1;

}

ZZ = -2000;

break;

}

case 2:

{

WW = 1.0;

MainForm.vlet(ref XX, ref YY, ref ZZ, ref UU, ref VV, ref WW, ref ISTOP, ref KGEOM, ref AT);

if (ISTOP != 1)

{

ScreenArray[i1 * height + j1] = AT;

ScreenZone[i1 * height + j1] = KGEOM;

mas[i1 * height + j1].AT = AT;

mas[i1 * height + j1].KGeom = KGEOM;

MainForm.geom(ref KGEOM, ref XX, ref YY, ref ZZ, ref UU, ref VV, ref WW, ref KMAX, MS, AMR);

mas[i1 * height + j1].Zones = new int[KMAX];

mas[i1 * height + j1].Distances = new double[KMAX];

for (int ii = 0; ii < KMAX; ii++)

{

mas[i1 * height + j1].Distances[ii] = AMR[ii];

mas[i1 * height + j1].Zones[ii] = MS[ii];

}

}

else

{

ScreenZone[i1 * height + j1] = -1;

mas[i1 * height + j1].KGeom = -1;

}

ZZ = -2000;

break;

}

}

}

}

TransformArrayToMinBound(ScreenArray,ref max);

TransformArrayToMinBound(mas, ref max);

FindZones(mas,ref shownZones);

}

  1. Реализация приближения/удаления фигуры по оси OZ при помощи клавиш «W» & «S» для 3D режима.

protected override bool ProcessDialogKey(Keys keyData)

{

switch (keyData)

{

case Keys.Down:

z--;

break;

case Keys.Up:

z++;

break;

}

Ant.Invalidate();

Ant.Update();

return base.ProcessDialogKey(keyData);

}

  1. Реализация функций увеличения/уменьшения фигуры для 2D режима.

private void toolStripButton8_Click(object sender, EventArgs e)

{

//увеличение

Draw Child = (Draw)this.ActiveMdiChild;

double R = Child.drawSurf1.R /= 2;

Child.drawSurf1.ifNewLoaded = false;

switch (Child.drawSurf1.NumPln)

{

case 0:

{

Child.drawSurf1.Y += R /2;

Child.drawSurf1.Z += R /2;

break;

}

case 1:

{

Child.drawSurf1.X += R / 2;

Child.drawSurf1.Z += R / 2;

break;

}

case 2:

{

Child.drawSurf1.X += R / 2;

Child.drawSurf1.Y += R / 2;

break;

}

}

Child.drawSurf1.Invalidate();

}

private void toolStripButton9_Click(object sender, EventArgs e)

{

//уменьшение

Draw Child = (Draw)this.ActiveMdiChild;

Child.drawSurf1.ifNewLoaded = false;

double R = Child.drawSurf1.R *= 2;

switch (Child.drawSurf1.NumPln)

{

case 0:

{

Child.drawSurf1.Y -= R / 4;

Child.drawSurf1.Z -= R / 4;

break;

}

case 1:

{

Child.drawSurf1.X -= R / 4;

Child.drawSurf1.Z -= R / 4;

break;

}

case 2:

{

Child.drawSurf1.X -= R / 4;

Child.drawSurf1.Y -= R / 4;

break;

}

}

Child.drawSurf1.Invalidate();

}

  1. Реализация поворота объекта по/против часовой стрелки при помощи колесика мышки.

public void Ant_MouseWheel(object sender, MouseEventArgs e)

{

if (e.Delta > 0)

{

angle++;

Ant.Invalidate();

}

else if (e.Delta < 0)

{

angle--;

Ant.Invalidate();

}

}

  1. Реализация динамического управления фигурой с помощью различных клавиш

protected override bool ProcessDialogKey(Keys keyData)

{

switch (keyData)

{

// case Keys.Down:

case Keys.W:

z -= 20;

break;

case Keys.S:

z += 20;

break;

case Keys.A:

x -= 20;

break;

case Keys.D:

x += 20;

break;

case Keys.X:

y -= 20;

break;

case Keys.C:

y += 20;

break;

case Keys.I:

Zangle = 2;

angle+=Xangle;

break;

case Keys.K:

Zangle = 2;

angle-=Xangle;

break;

case Keys.J:

Yangle = 2;

angle+=Xangle;

break;

case Keys.L:

Yangle = 2;

angle-=Xangle;

break;

}

Ant.Invalidate();

Ant.Update();

return base.ProcessDialogKey(keyData);

}

  1. Функция отрисовки трехмерного объекта.

public void Ant_Paint(object sender, PaintEventArgs e)

{

if (isdraw)

{

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();

mwheel = true;

//освещение-------------------------------------------

// Gl.glClearColor(0.2f, 0.2f, 0.2f, 0.9f);

float[] ambient = new float [4] {0.5f, 0.5f, 1.0f, 1.0f};//очищаем экран в цвет, установленый параметрами r,g,b,a

Gl.glEnable(Gl.GL_LIGHTING); //тут мы включаем расчет освещения

Gl.glLightModelf(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);//делаем так, чтобы освещались обе стороны полигона

Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, ambient);//интенсивность всей сцены

Gl.glEnable(Gl.GL_NORMALIZE);//делам нормали одинаковой величины во избежание артефактов

float[] light0_position = { 1.0f, 7.0f, 1.0f, 1.0f };//Положение источника света (x,y,z,w)4-й параметр указывает, будет ли использоваться бесконечно удаленный свет или точечный. Если значение w = 0, то источник света бесконечно удаленный (что-то вроде солнца). Если w = 1, то этот источник света точечный (что то вроде лампочки).

Gl.glEnable(Gl.GL_LIGHT0);

Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light0_position);

Gl.glTranslated(x, y, z);//передвигаем

Gl.glRotated(angle, 0, 2, 0);//поворачиваем по углу

Gl.glColor3ub(39, 170, 220);

if (mwheel)

{

Luch luch = new Luch(new Point3D(0,-500,-8), new Point3D(0,1,0));

double at = 0.9;

int kgeom = 0;

int istop=0 ;

int kmax = 0;

double dx = 1; double dz = 1;

WorkWithDll.Vlet(ref luch, ref istop, ref kgeom, ref at);

//Список цветов для материалов объектов

Color[] Col=new Color[10];

Col[0] = new Color(0, 0, 128);

Col[1] = new Color(0, 255, 0);

Col[2] = new Color(255, 255, 0);

Col[3] = new Color(205, 133, 63);

Col[4] = new Color(255, 69, 0);

Col[5] = new Color(199, 21, 133);

Col[6] = new Color(148, 0, 211);

Col[7] = new Color(0, 191, 255);

Col[8] = new Color(84, 255, 159);

Col[9] = new Color(255, 193, 37);

if (istop != 1)

{

List<Rectangle> list = new List<Rectangle>();//список парал-дов

WorkWithDll.Geom(ref kgeom, ref luch, ref kmax, MS, AMR);

mass.Zones = new int[kmax];

mass.Distances = new double[kmax];

for (int j = 0; j < kmax; j++)

{

mass.Distances[j] = AMR[j];

mass.Zones[j] = MS[j];

list.Add(new Rectangle(new Point3D(luch.position.x, (luch.position.y + at) / 50, luch.position.z),

new Point3D(luch.position.x + dx, (luch.position.y + at + AMR[j]) / 50, luch.position.z + dz), Col[MS[j]%10]));//ne popadaet

at += AMR[j];

}

for (int i = 0; i < list.Count; ++i)

{

list[i].DrawRec();

}

}

}

Gl.glPopMatrix();

Gl.glFlush();

}

}

Разработка и реализация программного модуля для трехмерной и двухмерной визуализации геометрических сборок для ПК BRAND