visualização da estrutura cristalina e magnética utilizando o vtk
TRANSCRIPT
Visualização da Visualização da estrutura cristalina estrutura cristalina
e magnética e magnética utilizando o utilizando o VTKVTK
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.
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 !!!
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
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
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
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
// 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
// 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
// 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
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
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
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
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