hamoudasafira1 | voilà je te mets tout le programme c'est mieux
Code :
- class vtkImplicitFairing
- {
- public:
- void SetInput(vtkSurface *Input) {this->Input=Input;};
- double X[3];
- double** TableLaplacian;
- double** TablePoints;
- double** Accumulate;
- void AllocateTable()
- {
- TablePoints = new double* [this->Input->GetNumberOfPoints()];
- Accumulate=new double* [this->Input->GetNumberOfPoints()];
- TableLaplacian = new double* [this->Input->GetNumberOfPoints()];
- for (int i=0;i<this->Input->GetNumberOfPoints();i++)
- {
- TablePoints[i]=new double[3] ;
- TableLaplacian[i]=new double[3] ;
- Accumulate[i]=new double[3] ;
- }
- }
- void TableCoordinates()
- {
- //déclaration + allocation d'un tableau de 2 dimensaions et de i chaines
- for (int i=0;i<this->Input->GetNumberOfPoints();i++ )
- {
- this->Input->GetPointCoordinates(i,X);//Xi
- TablePoints[i][0]=X[0];
- TablePoints[i][1]=X[1];//j'ai mit une copie des mes sommets dans un tableau
- TablePoints[i][2]=X[2];
- }
- }
- void ComputeLaplacian()
- {
- int m=6;
- double** TableLaplacian = new double* [this->Input->GetNumberOfPoints()] ;
- double Y[3],A[3],L[3];
- vtkIdList *MyList=vtkIdList::New();
- for (int i=0; i<this->Input->GetNumberOfPoints(); i++)
- {
- this->Input->GetVertexNeighbours(i,MyList);//elle me passe les sommets qui ont des voisinages avec le sommet choisi
- TablePoints[i][0]=X[0];
- TablePoints[i][1]=X[1];
- TablePoints[i][2]=X[2];
- double somme[3];
- somme[0]=0; somme[1]=0;somme[2]=0;
- for (int j=0;j<MyList->GetNumberOfIds();j++) //le nbre d'ID correspond au nombre des points de voisinage
- {
- this->Input->GetPointCoordinates(MyList->GetId(j),Y);//prendre les voisins Y(j) de i
- TablePoints[j][0]=Y[0];
- TablePoints[j][1]=Y[1];
- TablePoints[j][2]=Y[2];
- A[0]=TablePoints[j][0]-TablePoints[i][0];
- A[1]=TablePoints[j][1]-TablePoints[i][1];//on soustraire Y(j) de X(i) pour chaque axe
- A[2]=TablePoints[j][2]-TablePoints[i][2];
- somme[0]=somme[0]+A[0];
- somme[1]=somme[1]+A[1];//pour le calcul de Laplacian Discret= somme (y(j)-X(i))
- somme[2]=somme[2]+A[2];
- L[0]=1/m*somme[0];
- L[1]=1/m*somme[1];//Laplacian d'ordre 1 L(X)=1/6*somme(Y(j)-X(i))
- L[2]=1/m*somme[2];
- }
- TableLaplacian[i][0]=L[0];
- TableLaplacian[i][1]=L[1];//j'ai mit une copie des mes sommets dans un tableau
- TableLaplacian[i][2]=L[2];
- }
- MyList->Delete();
- }
- void AccumulateLaplacian()//X+Lambdadt*Laplacian
- {
- double X[3],Lambdadt=10;
- for (int i=0; i<this->Input->GetNumberOfPoints(); i++)
- {
- X[0]=TablePoints[i][0];
- X[1]=TablePoints[i][1];
- X[2]=TablePoints[i][2];
- this->ComputeLaplacian();
- }
- Accumulate[i][0]=X[0]+Lambdadt*TableLaplacian[i][0];
- Accumulate[i][1]=X[1]+Lambdadt*TableLaplacian[i][1];
- Accumulate[i][2]=X[2]+Lambdadt*TableLaplacian[i][2];
- }
- void ApplyImplicitFilter(double Lambdadt, int n)
- {
- this->AllocateTable();
- for (int n=0;n<4;n++)
- {
- double Lambdadt=0, nombre=10;
- Lambdadt=pow(nombre,n);//lambdadt=10^n;
- this->ComputeLaplacian();
- this->AccumulateLaplacian();
- }
- for (int i=0;i<this->Input->GetNumberOfPoints();i++)
- {
- this->Input->SetPointCoordinates(i, Accumulate[i]);//je fais réagir les nouveaux positions de mes sommets
- }
- }
- int vtkImplicitFairing::free(double **TablePoints,double **Accumulate,double **TableLaplacian);
- protected:
- vtkSurface *Input;
- };
- int main( int argc, char* argv[] )//argc contient le nombre de parametre passé au programme +1
- //argv est un tableau contenant les chaines de caractere transmises
- {
- int i;
- for(i=0;i<argc;i++)
- {
- printf("Argument %1i : %s \n", i+1, argv[i]);
- }
- //Lire le fichier
- vtkSurface *Create=vtkSurface::New();
- Create->CreateFromFile(argv[1]);
- RenderWindow *Window=RenderWindow::New();
- Window->SetInput(Create);
- //Filtrage
- vtkImplicitFairing *Fairing=new (vtkImplicitFairing);
- Fairing->SetInput(Create);
- Fairing->ApplyImplicitFilter(atof(argv[2]),atoi(argv[3]));
- Window->Render();
- Window->Interact();
- //sauvgarde de maillage
- vtkPolyDataWriter *Data=vtkPolyDataWriter::New();
- Data->SetInput(Create);
- Data->SetFileName("Implicit.vtk" );
- Data->Write();
- return(0);
- }
|
j'espére que tu vas comprendre ce que je voudrai |