A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Visualização da estrutura cristalina e magnética utilizando o VTK"— Transcrição da apresentação:

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

2 Objectivos do trabalho
Representar graficamente a célula unitária a 3D; Representar graficamente a estrutura magnética do composto; Simular a transição magneto-estrutural do composto; Simular a reorientação de spin do composto.

3 Menu printf("\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') { Erro !!! 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"); }

4 Classes do VTK utilizadas mais importantes
vtkSphereSource.h vtkArrowSource.h vtkAxes.h vtkActor2D.h vtkCellArray.h Texto

5 Opção “C”-Estrutura cristalina
// 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 Render Janela

6 Opção “C”-Estrutura cristalina
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= ; 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(); Título Célula

7 Opção “C”-Estrutura cristalina
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 celula vtkActor *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(); Célula Etiquetagem eixos

8 Opção “C”-Estrutura cristalina
// 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(); Eixos Luz Iniciar Interacção Delete

9 Opção “M”-Estrutura Magnética
// 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]); Source Seta Mappeamento Seta Actor Seta

10 Opção “S”-Simulação da transição Estrutural
// 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ção class 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 }; Mycallback

11 Opção “S”-Simulação da transição Estrutural
vtkMyCallback *mo1 = vtkMyCallback::New(); iren->CreateTimer(VTKI_TIMER_FIRST); iren->AddObserver(vtkCommand::TimerEvent, mo1, 2.0); timeLastCall = timeGetTime(); Chamada vtkCallback

12 Opção “H”-Simulação da transição Reorientaçã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

13 Melhoramentos Futuros
Determinação das distâncias/posições dos átomos; Poder seleccionar os planos atómicos; Etiquetar os atómos; Mais dificil!!!!! Utilização de Teoria de Grupos

14 Trabalho da disciplina de Visualização Científica
Realizado por: FIM Agradecimentos Dr(s): J. Tavares & J. Barbosa André Pereira


Carregar ppt "Visualização da estrutura cristalina e magnética utilizando o VTK"

Apresentações semelhantes


Anúncios Google