Visualização da estrutura cristalina e magnética utilizando o VTK.

14
Visualização da Visualização da estrutura estrutura cristalina e cristalina e magnética magnética utilizando o utilizando o VTK VTK

Transcript of Visualização da estrutura cristalina e magnética utilizando o VTK.

Page 1: Visualização da estrutura cristalina e magnética utilizando o VTK.

Visualização da Visualização da estrutura cristalina estrutura cristalina

e magnética e magnética utilizando o utilizando o VTKVTK

Page 2: Visualização da estrutura cristalina e magnética utilizando o VTK.

Objectivos do trabalhoObjectivos do trabalho Representar graficamente a célula Representar graficamente a célula

unitária a 3D;unitária a 3D; Representar graficamente a Representar graficamente a

estrutura magnética do composto;estrutura magnética do composto; Simular a transição magneto-Simular a transição magneto-

estrutural do composto;estrutural do composto; Simular a reorientação de spin do Simular a reorientação de spin do

composto.composto.

Page 3: Visualização da estrutura cristalina e magnética utilizando o VTK.

MenuMenuprintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");printf("\n\n ///////////////////////////////////////////////////////////////////////////////\n\n");printf(" -----------------------------------MENU---------------------------------\n\n"); printf("\t ATENCAO: Este programa diferencia maisculas de minusculas \n\n\n");printf ("\t \t C-Visualizacao da Estrutura Cristalografica \n\n\n");printf (" \t \t M-Visualizacao da Estrutura Magnetica \n\n\n");printf ("\t \t S-Simulacao da transicao estrutural \n\n\n");printf ("\t \t H-Simulacao da reorientacao de spin \n\n\n");printf("////////////////////////////////////////////////////////////////////////////////\n\n");printf("\n\n\n\n");

util = getchar();

//Condição da escolha da letra C programa para visualizar a Estrutura Cristalografica

if ( util == 'C'){

if ( util != 'H' && util != 'S' && util != 'M' && util != 'C')

{printf ("\n\n Voce nao escolheu nenhuma das opcoes dadas\n");

printf ("\n\n O programa desliga-se automaticamente volte a tentar por favor\n");printf ("\n\n para isso carregue em qualquer tecla \n");

}

Erro !!!Erro !!!

Page 4: Visualização da estrutura cristalina e magnética utilizando o VTK.

Classes do Classes do VTK utilizadasVTK utilizadasmais importantesmais importantes

vtkSphereSource.hvtkSphereSource.h

vtkArrowSource.hvtkArrowSource.h

vtkAxes.hvtkAxes.h

vtkActor2D.hvtkActor2D.h

vtkCellArray.hvtkCellArray.h

Texto

Page 5: Visualização da estrutura cristalina e magnética utilizando o VTK.

Opção “C”-Estrutura Opção “C”-Estrutura cristalinacristalina

// Criação de uma esfera por uma classe pré definida (Source)

vtkSphereSource *sphere = vtkSphereSource::New(); sphere->SetThetaResolution(100); sphere->SetPhiResolution(50);

// Mapeamento de uma esfera que depois irá ser utilizada em vários actores

vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New(); sphereMapper->SetInput(sphere->GetOutput());

// Criação dos actores Neste caso temos 36 atomos:

vtkActor *sphere1 = vtkActor::New(); sphere1->SetMapper(sphereMapper); sphere1->GetProperty()->SetColor(0,0,1); sphere1->GetProperty()->SetAmbient(0.3); sphere1->GetProperty()->SetDiffuse(0.5); sphere1->GetProperty()->SetSpecular(1.0); sphere1->GetProperty()->SetSpecularPower(20.0); sphere1->AddPosition(x[1],y[1],z[1]);

…….

vtkRenderer *ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer(ren1); vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin);

Source da Esfera

Mapeamento da Esfera

Actor da Esfera

RenderJanela

Page 6: Visualização da estrutura cristalina e magnética utilizando o VTK.

char *text = "Estrutura Cristalografica";

vtkTextMapper *pText = vtkTextMapper::New();

pText->SetInput(text);vtkTextProperty *propText = pText->GetTextProperty();propText->SetFontSize(18);propText->SetFontFamilyToArial();propText->SetColor(0,0,1);propText->BoldOn();propText->ItalicOff();propText->ShadowOff();propText->SetJustificationToLeft();propText->SetVerticalJustificationToBottom();vtkActor2D *pActor = vtkActor2D::New();pActor->SetMapper(pText);pActor->SetPosition(425,650);

ren1->AddActor2D(pActor); ren1->AddActor(sphere1);

ren1->SetBackground(1, 1, 0.7);

renWin->SetSize(400, 200);

// Tamanho dos parâmetros da rede a=7.4313;

b=14.6278;c=7.7151;

static float q[8][3]={{0,0,0}, {a,0,0}, {a,b,0}, {0,b,0}, {0,0,c}, {a,0,c}, {a,b,c}, {0,b,c}}; static vtkIdType pts[6][4]={{0,1,2,3}, {4,5,6,7}, {0,1,5,4}, {1,2,6,5}, {2,3,7,6}, {3,0,4,7}};

vtkPolyData *celula = vtkPolyData::New(); vtkPoints *points = vtkPoints::New(); vtkCellArray *polys=vtkCellArray::New();

Opção “C”-Estrutura Opção “C”-Estrutura cristalinacristalina

Título

Célula

Page 7: Visualização da estrutura cristalina e magnética utilizando o VTK.

int j;

for (j=0; j<8; j++) points->InsertPoint(j,q[j]);for (j=0; j<6; j++) polys->InsertNextCell(4,pts[j]);

celula->SetPoints(points);points->Delete();celula->SetPolys(polys);polys->Delete();

// Mapeador da celula vtkPolyDataMapper *celulaMapper = vtkPolyDataMapper::New();celulaMapper->SetInput(celula);

// Criação do actor da celulavtkActor *celulaActor = vtkActor::New();celulaActor->SetMapper(celulaMapper);celulaActor->GetProperty()->SetRepresentationToWireframe();

ren1->AddActor(celulaActor);celulaMapper->Delete();

// Criação do texto com as direcções segundo xx neste caso é segundo// a direcção do parametro a da celula,b corresponde aos yy e finalmente c aos zz.

vtkVectorText *texta=vtkVectorText::New(); texta->SetText("a");

vtkPolyDataMapper *textaMapper=vtkPolyDataMapper::New();textaMapper->SetInput(texta->GetOutput());

vtkActor *textaActor=vtkActor::New();textaActor->SetMapper(textaMapper);

textaActor->SetPosition(1,0,-0.5);textaActor->SetScale(0.5);ren1->AddActor(textaActor);vtkVectorText *textb=vtkVectorText::New();vtkVectorText *textc=vtkVectorText::New();

Opção “C”-Estrutura Opção “C”-Estrutura cristalinacristalina

Célula

Etiquetagem eixos

Page 8: Visualização da estrutura cristalina e magnética utilizando o VTK.

// Criação dos eixos

vtkAxes *axes=vtkAxes::New();axes->SetOrigin(0,0,0);axes->SetScaleFactor(1);axes->SymmetricOn();

vtkPolyDataMapper *axesMapper=vtkPolyDataMapper::New();axesMapper->SetInput(axes->GetOutput());

vtkActor *axesActor=vtkActor::New();axesActor->SetMapper(axesMapper);ren1->AddActor(axesActor);axesMapper->Delete();

// Criação da luz no render vtkLight *light = vtkLight::New(); light->SetFocalPoint(1.875,0.6125,0); light->SetPosition(0.875,1.6125,1); ren1->AddLight(light);

// Inicializar as interacções iren->Initialize(); iren->Start();

// Apapgar todos os pointers (actores, render, mapeadores, sources, renderwindows, lights, etc.)

pText->Delete();

Opção “C”-Estrutura Opção “C”-Estrutura cristalinacristalina

Eixos

Luz

IniciarInteracção

Delete

Page 9: Visualização da estrutura cristalina e magnética utilizando o VTK.

// Criação da fonte da secta (source) que é a junção de um // cone numa extremidade de um cilindro

vtkArrowSource *arrow = vtkArrowSource::New();

// Mappeador da secta

vtkPolyDataMapper *arrowMapper = vtkPolyDataMapper::New(); arrowMapper->SetInput(arrow->GetOutput());

// Criação dos actores sectas (correspondem aos spins): vtkActor *arrowactor1 = vtkActor::New(); arrowactor1->SetMapper(arrowMapper); arrowactor1->SetPosition(x[1]-0.5, y[1], z[1]); arrowactor1->SetScale(2); (arrowactor1->GetProperty())->SetColor(0.5, 0.5, 0.5); arrowactor1->RotateZ(phi[1]); arrowactor1->RotateX(theta[1]);

Opção “M”-Estrutura Opção “M”-Estrutura MagnéticaMagnética

SourceSeta

MappeamentoSeta

ActorSeta

Page 10: Visualização da estrutura cristalina e magnética utilizando o VTK.

// apontadores declarados globais por serem usados no callback

vtkRenderer *ren1;long timeLastCall=0;vtkActor *sphere1;…..bool toogle=0;

// Class Callback para ser utilizado coma interacçãoclass vtkMyCallback : public vtkCommand{public: static vtkMyCallback *New() { return new vtkMyCallback; }

void PrintSelf(ostream& os, vtkIndent indent) {}void PrintTrailer(ostream& os, vtkIndent indent) {}void PrintHeader(ostream& os, vtkIndent indent) {}void CollectRevisions(ostream& os) {}

virtual void Execute(vtkObject *caller, unsigned long, void*) { vtkRenderWindowInteractor *ri = reinterpret_cast<vtkRenderWindowInteractor*>(caller); if ((timeGetTime() - timeLastCall) > 1000) { cout << "1 segundo" << endl; timeLastCall = timeGetTime(); sphere1->AddPosition(0.1,0, 0);

……. }

ri->GetRenderWindow()->Render(); AbortFlagOn();

vtkRenderWindowInteractor }};

Opção “S”-Simulação da transição Opção “S”-Simulação da transição EstruturalEstrutural

Mycallback

Page 11: Visualização da estrutura cristalina e magnética utilizando o VTK.

Opção “S”-Simulação da transição Opção “S”-Simulação da transição EstruturalEstrutural

vtkMyCallback *mo1 = vtkMyCallback::New(); iren->CreateTimer(VTKI_TIMER_FIRST); iren->AddObserver(vtkCommand::TimerEvent, mo1, 2.0); timeLastCall = timeGetTime();

Chamada vtkCallback

Page 12: Visualização da estrutura cristalina e magnética utilizando o VTK.

Opção “H”-Simulação da transição Opção “H”-Simulação da transição Reorientação spinReorientação spin

vtkRenderer *ren1 = vtkRenderer::New(); ren1->AddActor(pActor);…. ren1->GetActiveCamera()->SetFocalPoint(0,0,0); ren1->GetActiveCamera()->SetPosition(0,10,0); ren1->ResetCamera(); ren1->GetActiveCamera()->SetParallelScale(5);….tkRenderer *ren2 = vtkRenderer::New(); ren2->AddActor(pActor2);

… ren2->GetActiveCamera()->SetFocalPoint(0,0,0); ren2->GetActiveCamera()->SetPosition(0,10,0); ren2->ResetCamera(); ren2->GetActiveCamera()->SetParallelScale(5);

vtkRenderWindow *renWin1 = vtkRenderWindow::New(); renWin1->AddRenderer(ren1);

vtkRenderWindow *renWin2 = vtkRenderWindow::New(); renWin2->AddRenderer(ren2);

vtkRenderWindowInteractor *iren1 = vtkRenderWindowInteractor::New(); iren1->SetRenderWindow(renWin1); vtkRenderWindowInteractor *iren2 = vtkRenderWindowInteractor::New(); iren2->SetRenderWindow(renWin2); renWin1->Render(); renWin2->Render(); iren1->Start();

Renderer 1

Renderer 2

Janela 1

Janela 2

Interacção

Page 13: Visualização da estrutura cristalina e magnética utilizando o VTK.

Melhoramentos FuturosMelhoramentos Futuros

Determinação das Determinação das distâncias/posições dos átomos;distâncias/posições dos átomos;

Poder seleccionar os planos Poder seleccionar os planos atómicos;atómicos;

Etiquetar os atómos;Etiquetar os atómos;Mais dificil!!!!!

Utilização deTeoria de Grupos

Page 14: Visualização da estrutura cristalina e magnética utilizando o VTK.

Trabalho da disciplina de Trabalho da disciplina de Visualização CientíficaVisualização Científica

Realizado por:

André PereiraAgradecimentos Dr(s):J. Tavares & J. Barbosa