1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| void vtkSnake::ResampleSnake(vtkPolyData *snake,int dmax,int dmin)
{
int numberOfPoints=snake->GetNumberOfPoints();
int nbInputPoint,*inputPointsId;
vtkPoints* points = snake->GetPoints();
// get the number of point of the unregularized snake
snake->GetLines()->GetCell(0,nbInputPoint,inputPointsId);
for(int i=0;i<numberOfPoints;i++) {
double pti[3];
points->GetPoint(inputPointsId[i],pti);
// VERIFIER LES DISTANCES AVEC LA MOITIE DES POINTS SUIVANTS
for(int idp=(1+numberOfPoints)/2;idp>0;idp--)
{
double ptiFlw[3];
points->GetPoint(inputPointsId[(idp+i)%numberOfPoints],ptiFlw);
points->GetPoint(inputPointsId[idp],pti);
double dist = sqrt(pow(ptiFlw[0]-pti[0],2)+pow(ptiFlw[1]-pti[1],2));
// si point eloignés
if(dist>dmin) continue;
// Si point trop proch supprimer tous les point entre eux.
for(int k=0;k<idp;k++)
removeSnake(snake,inputPointsId[(i+1)%numberOfPoints]);
break;
}
}
for(int idp=0;idp<numberOfPoints;idp++)
{
double ptiFlw[3],pti[3];
points->GetPoint(inputPointsId[(idp+1)%numberOfPoints],ptiFlw);
points->GetPoint(inputPointsId[idp],pti);
double dist = sqrt(pow(ptiFlw[0]-pti[0],2)+pow(ptiFlw[1]-pti[1],2));
if(dist>dmax)
{
addSnake(snake,idp);
}
}
}
//-------------------------------------------------------------------------
void vtkSnake::addSnake(vtkPolyData *snake,int pos)
{
int numberOfPoints=snake->GetNumberOfPoints();
int nbInputPoint,*inputPointsId;
vtkPoints* points = snake->GetPoints();
// get the number of point of the unregularized snake
snake->GetLines()->GetCell(0,nbInputPoint,inputPointsId);
double ptiFlw[3],pti[3];
points->GetPoint(inputPointsId[(pos+1)%numberOfPoints],ptiFlw);
points->GetPoint(inputPointsId[pos],pti);
double newX = (ptiFlw[0]+pti[0])/2.0;
double newY = (ptiFlw[1]+pti[1])/2.0;
int newId=points->InsertNextPoint(newX,newY,pti[2]);
points->Modified();
snake->GetLines()->InsertCellPoint(newId);
snake->GetLines()->UpdateCellCount(numberOfPoints++);
snake->Modified();
numberOfPoints++;
}
//-------------------------------------------------------------------------
void vtkSnake::removeSnake(vtkPolyData *snake,int pos)
{
int numberOfPoints=snake->GetNumberOfPoints();
int nbInputPoint,*inputPointsId;
snake->GetLines()->GetCell(0,nbInputPoint,inputPointsId);
snake->RemoveCellReference(inputPointsId[pos]);
snake->DeleteCell(inputPointsId[pos]);
snake->Modified();
numberOfPoints--;
} |
Partager