Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тема 2

.pdf
Скачиваний:
5
Добавлен:
05.06.2015
Размер:
856.2 Кб
Скачать

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

Задание исходных данных

my_model(x[3], a[1],s[3])

{

array center[3];

array x0[10], y0[10], z0[10]; array x2[10], y2[10], z2[10]; array sph[10];

center = [3,0,0];

fs = openfile("r","1.txt") ; r=reservefile(10,"1.txt") ; i = 1;

while (i < 11) loop

x0[i] = rfile("1.txt"); y0[i] = rfile("1.txt"); z0[i] = rfile("1.txt"); i = i+1;

endloop;

fs = closefile("1.txt");

Фильтрация исходных данных

Мэппинг

отфильтрованных

данных

i=1;

numsp=1; while (i < 11) loop

if ((x0[i] >-5) and (x0[i]<5) and (y0[i]>-5) and (y0[i]<5) and (z0[i]<5) and (z0[i]>-5))

then

x2[numsp] = x0[i]; y2[numsp] = y0[i]; z2[numsp] = z0[i]; numsp=numsp+1; endif;

i=i+1;

endloop;

center[1]=x2[1];

center[2]=y2[1];

center[3]=z2[1];

sph[1]=hfSphere(x,center,0.5);

i=2;

while (i <numsp) loop center[1]=x2[i]; center[2]=y2[i]; center[3]=z2[i];

sph[i] = hfSphere(x,center,0.5); sph[1]=sph[1]|sph[i];

i=i+1;

endloop;

s=[0,0,1];

my_model = sph[1];

}

При заданных значениях в файле «1.txt»:

0 4 0

3 0 0

2 3 0

0 2 -8

12 3 -10

4 -5 7

5 15 0 -8 -5 -5 15 -4 9 7 12 5

получается следующее статическое проекционное графическое изображение:

При запуске этой программы из командной строки задавались следующие размеры обрамляющего параллелепипеда: x,y,z меняются в пределах от -10 до 10 (цвет фона и камера в прикладной программе задаются по умолчанию).

Анализ этого изображения позволяет предварительно выделить 2 кластера пространственных точек, в одном кластере сосредоточено две точки, а в другом одна (исходное количество точек равнялось 10).

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

HyperFun www.hyperfun.org.

2.4 Программный продукт VTK

VTK — широко известный программный продукт, который, в отличие от рассмотренных в предыдущих параграфов 3ds Max и HyperFun, является специализированным инструментарием, предназначенным для решения задач научной визуализации.

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

Первая версия VTK была разработана в 1993 году сотрудниками компании GE Corporate R&D. VTK распространяется как открытое программное обеспечение. В его дальнейшем развитии принимали участие пользователи из различных стран. На сегодняшний день VTK принято считать наиболее развитым программным инструментальным средством с объектно-ориентированной архитектурой, предназначенным для написания прикладных программ визуализации.

Рассмотрим основные характеристики функциональных процедур VTK, используемого в качестве инструментального средства при написании прикладных программ визуализации. В начале, рассмотрим основные характеристики наиболее часто используемого входного языка программирования VTK – языка C++, используемого для написания прикладной программы визуализации.

Программирование на языке C++

Язык C++ - язык программирования общего назначения, он обеспечивает гибкие эффективные средства для написания любых программ, в том числе программ визуализации. Язык является объектно-ориентированным, предусматривающим использование классов. Функциональные процедуры визуализации представлены в VTK как классы, описываемые на языке C++. Эти функциональные процедуры инициируются с помощью языковой конструкции - оператора функции. В общем случае может использоваться несколько операторов функции. Наряду с этим язык C++ предоставляет возможность использования всех типов операторов, описанных ранее при рассмотрении 3ds Max и HyperFun.

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

<название класса>::<название функции>(<параметр функции>,<параметр функции>,…<параметр функции>);

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

Обращение к результатам выполнения функциональных процедур задания исходных данных, фильтрации и мэппинга при написании прикладных программ визуализации с использованием программного инструментального средства VTK, как правило, происходит с помощью оператора функции GetOutputPort(). Получение функциональными процедурами фильтрации и мэппинга результатов выполнения соответствующих функциональных процедур, как правило, происходит с помощью оператора функции SetInputConnection(..). Фрагметры прикладных программ визуализации с использованием этиъ операторов функций приведены в приерах 2.26 и 2.28.

Рассмотрим примеры использования операторов функций для вызова функциональных процедур VTK. Начнем с рассмотрения функциональных процедур задания исходных данных.

Функциональные процедуры задания исходных данных

При использовании языка C++ функциональными процедурами задания исходных данных являются процедуры открытия файла, чтения данных из файла, закрытия файла. Инициация этих функциональных процедур может быть выполнена с помощью стандартных операторов функций С++ fopen(..), fread(..), fclose(..) и т.д. Более подробную информацию об этих операторах функций можно найти в любой документации по языку С++. Помимо этого, VTK предоставляет также набор специализированных функциональных процедур задания исходных данных, более простых в использовании по сравнению с

указанными выше. Как правило, это функциональные процедуры открытия, чтения исходных данных и закрытия файлов определенного типа: xyz, pdb, Gaussian Cube и т.д. Как и для всех групп функциональных процедур VTK, инициация этих функциональных процедур происходит с помощью операторов функций.

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

Пример 2.25

……………..

vtkXYZMolReader *pdb0= vtkXYZMolReader::New(); // выбор функциональной процедуры чтения исходных данных как задание экземпляра (c именем pdb0) класса

(с именем vtkXYZMolReader)

pdb0-> SetFileName ("caffeine.xyz"); // оператор функции SetFileName(),

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

функциональных

процедур

через

соответствующий

оператор

функцию

GetOutputPort().

 

 

 

 

 

………………

Результатом выполнения этой функциональной процедуры будет компьютерное представление исходных данных в виде совокупности четверок (x,y,z,s), где x,y,z

– координаты точки, s –числовое значение, соответствующие типу атома.

Функциональные процедуры фильтрации данных

Также как и языки MaxScript и HyperFun, язык С++ дает возможность написания различных функциональных процедур фильтрации данных в теле программы. Однако, помимо этого, в отличие от 3ds Max и HyperFun, в VTK существует широкий набор специализированных функциональных процедур фильтрации данных.

Приведем фрагмент программы фильтрации исходных данных, описанных в примере 2.25 с использованием таких функциональных процедур.

Пример 2.26

Пусть фильтрация исходных данных состоит в том, чтобы из числа исходных четверок (x,y,z,s) нужно для последующей визуализации отобрать только те из четверки, для которых выполняется условие:

-2<=x<=2

-2<=y<=2

-2<=z<=2

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

……………………..

vtkBox * box = vtkBox::New(); // выбор функциональной процедуры фильтрации данных, определяющей параметр фильтрации (решающее правило отбора точек, заданное аналитически в виде F(x,y,z)>=0, где F – описывающая функция примитива параллелепипед, x,y,z – координаты точки), как задание экземпляра (с именем box) класса (с именем vtkBox).

box-> SetXMin (-2, -2, -2); // задание параметров выбранного экземпляра класса

box ->SetXMax (2, 2, 2); // задание параметров выбранного экземпляра класса и инициация функциональной процедуры

vtkClipPolyData* clipper= vtkClipPolyData::New(); // выбор функциональной процедуры фильтрации данных как задание экземпляра (с именем clipper) класса

(с именем vtkClipPolyData).

clipper-> SetInputConnection (pdb0-> GetOutputPort());// задание параметров экземпляра clipper класса (с именем vtkClipPolyData) – передача исходных данных (массива точек) для фильтрации

clipper-> SetClipFunction (box); // задание параметров экземпляра clipper

класса (с именем vtkClipPolyData) – задание решающего правила отбора точек, заданного аналитически в виде F(x,y,z)>=0

clipper-> InsideOutOn(); // инициация функциональной процедуры отбора точек, попадающих в заданный куб

……………………..

Функциональные процедуры мэппинга

Приведем в качестве примера функциональные процедуры мэппинга VTK.

В качестве геометрических примитивов в VTK могут использоваться:

·cфера

·конус

·цилиндр

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

·плоскость

·и др.

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

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

·сдвиг

·поворот

·масштабирование

·теоретико-множественное объединение

·теоретико-множественное пересечение

·теоретико-множественное вычитание

·и др.

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

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

Пример 2.28

…………………

vtkSphereSource* Sphere0= vtkSphereSource::New(); Sphere0-> SetCenter (0, 0, 0);

Sphere0-> SetRadius (1);

vtkGlyph3D* Glyph0= vtkGlyph3D::New();

Glyph0 ->SetInputConnection(clipper-> GetOutputPort()); Glyph0-> SetOrient (1);

Glyph0-> SetColorMode (1); Glyph0-> ScalingOn(); Glyph0-> SetScaleMode (2);

Glyph0-> SetScaleFactor (.25);

Glyph0-> SetSource (Sphere0 ->GetOutput());

………………………

Эта языковая конструкция, построенная в соответствии с синтаксисом С++ и использующая операторы функций, инициирует выполнение функциональной процедуры, которая ставит в соответствие отфильтрованным данным компьютерное представление геометрической модели пространственной сцены в виде совокупности сфер таким образом, что каждой четверке чисел (x,y,z,s), , ставится в соответствие сфера с центром в точке x,y,z.

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

Пример 2.29

……………………………………

vtkBox * box1=vtkBox::New(); // инициация функциональной процедуры создания параллелепипеда box1

box1-> SetXMin (-5, -5, -5); box1 ->SetXMax (5, 5, 5);

vtkBox * box2=vtkBox::New();// инициация функциональной процедуры создания параллелепипеда box2

box2-> SetXMin (0, 0, 0); box2->SetXMax (15, 15, 15);

vtkImplicitBoolean* b= vtkImplicitBoolean::New(); // инициация функциональной процедуры объединения этих двух примитивов

b-> SetOperationTypeToUnion(); b->AddFunction (box1);

b-> AddFunction (box2);

……………………..

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

Пример 2.30

……………………..

vtkPolyDataMapper* Mapper5= vtkPolyDataMapper::New(); Mapper5 ->SetInputConnection (Glyph0 ->GetOutputPort()); Mapper5-> SetImmediateModeRendering (1);

Mapper5-> UseLookupTableScalarRangeOff(); Mapper5-> SetScalarVisibility (1); Mapper5-> SetScalarModeToDefault();

………………….

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

в «четверке» (x,y,z,s).

Функциональные процедуры рендеринга

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

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

Пример 2.31

…………………

vtkCamera* camera= vtkCamera::New();

camera-> SetViewAngle(30); // задание угла зрения камеры

camera-> SetPosition (8.3761, 4.94858, 4.12505); // задание позиции камеры

………………..

Результатом выполнения данной функциональной процедуры будет создание компьютерного представлений камеры.

Пример 2.32

……………

vtkLight* light= vtkLight::New();

light-> SetPosition (8.3761, 4.94858, 4.12505); // задание позиции источника освещения

……………

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

Пример 2.33

……………..

vtkActor* Actor5= vtkActor::New(); Actor5 ->SetMapper (Mapper5);

…………….

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

Приведем пример фрагмента прикладной программы, содержащего вызов самой функциональной процедуры рендеринга.

Пример 2.34

………………….

vtkRenderer* ren1 = vtkRenderer::New(); // задание функциональной процедуры рендеринга // задание параметров рендеринга

vtkRenderWindow* renWin= vtkRenderWindow::New(); // задание области отрисовки проекционного изображения

renWin-> AddRenderer(ren1); ren1->SetActiveCamera (camera);