Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
6.3 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkIterativeClosestPointTransform.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkIterativeClosestPointTransform - Implementation of the ICP algorithm.
// .SECTION Description
// Match two surfaces using the iterative closest point (ICP) algorithm.
// The core of the algorithm is to match each vertex in one surface with
// the closest surface point on the other, then apply the transformation
// that modify one surface to best match the other (in a least square sense).
// This has to be iterated to get proper convergence of the surfaces.
// .SECTION Note
// Use vtkTransformPolyDataFilter to apply the resulting ICP transform to
// your data. You might also set it to your actor's user transform.
// .SECTION Note
// This class makes use of vtkLandmarkTransform internally to compute the
// best fit. Use the GetLandmarkTransform member to get a pointer to that
// transform and set its parameters. You might, for example, constrain the
// number of degrees of freedom of the solution (i.e. rigid body, similarity,
// etc.) by checking the vtkLandmarkTransform documentation for its SetMode
// member.
// .SECTION see also
// vtkLandmarkTransform
#ifndef __vtkIterativeClosestPointTransform_h
#define __vtkIterativeClosestPointTransform_h
#include "vtkLinearTransform.h"
#define VTK_ICP_MODE_RMS 0
#define VTK_ICP_MODE_AV 1
class vtkCellLocator;
class vtkLandmarkTransform;
class vtkDataSet;
class VTK_HYBRID_EXPORT vtkIterativeClosestPointTransform : public vtkLinearTransform
{
public:
static vtkIterativeClosestPointTransform *New();
vtkTypeRevisionMacro(vtkIterativeClosestPointTransform,vtkLinearTransform);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Specify the source and target data sets.
void SetSource(vtkDataSet *source);
void SetTarget(vtkDataSet *target);
vtkGetObjectMacro(Source, vtkDataSet);
vtkGetObjectMacro(Target, vtkDataSet);
// Description:
// Set/Get a spatial locator for speeding up the search process.
// An instance of vtkCellLocator is used by default.
void SetLocator(vtkCellLocator *locator);
vtkGetObjectMacro(Locator,vtkCellLocator);
// Description:
// Set/Get the maximum number of iterations
vtkSetMacro(MaximumNumberOfIterations, int);
vtkGetMacro(MaximumNumberOfIterations, int);
// Description:
// Get the number of iterations since the last update
vtkGetMacro(NumberOfIterations, int);
// Description:
// Force the algorithm to check the mean distance between two iteration.
vtkSetMacro(CheckMeanDistance, int);
vtkGetMacro(CheckMeanDistance, int);
vtkBooleanMacro(CheckMeanDistance, int);
// Description:
// Specify the mean distance mode. This mode expresses how the mean
// distance is computed. The RMS mode is the square root of the average
// of the sum of squares of the closest point distances. The Absolute
// Value mode is the mean of the sum of absolute values of the closest
// point distances.
vtkSetClampMacro(MeanDistanceMode,int,
VTK_ICP_MODE_RMS,VTK_ICP_MODE_AV);
vtkGetMacro(MeanDistanceMode,int);
void SetMeanDistanceModeToRMS()
{this->SetMeanDistanceMode(VTK_ICP_MODE_RMS);}
void SetMeanDistanceModeToAbsoluteValue()
{this->SetMeanDistanceMode(VTK_ICP_MODE_AV);}
const char *GetMeanDistanceModeAsString();
// Description:
// Set/Get the maximum mean distance between two iteration. If the mean
// distance is lower than this, the convergence stops.
vtkSetMacro(MaximumMeanDistance, double);
vtkGetMacro(MaximumMeanDistance, double);
// Description:
// Get the mean distance between the last two iterations.
vtkGetMacro(MeanDistance, double);
// Description:
// Set/Get the maximum number of landmarks sampled in your dataset.
// If your dataset is dense, then you will typically not need all the
// points to compute the ICP transform.
vtkSetMacro(MaximumNumberOfLandmarks, int);
vtkGetMacro(MaximumNumberOfLandmarks, int);
// Description:
// Starts the process by translating source centroid to target centroid.
vtkSetMacro(StartByMatchingCentroids, int);
vtkGetMacro(StartByMatchingCentroids, int);
vtkBooleanMacro(StartByMatchingCentroids, int);
// Description:
// Get the internal landmark transform. Use it to constrain the number of
// degrees of freedom of the solution (i.e. rigid body, similarity, etc.).
vtkGetObjectMacro(LandmarkTransform,vtkLandmarkTransform);
// Description:
// Invert the transformation. This is done by switching the
// source and target.
void Inverse();
// Description:
// Make another transform of the same type.
vtkAbstractTransform *MakeTransform();
protected:
// Description:
// Release source and target
void ReleaseSource(void);
void ReleaseTarget(void);
// Description:
// Release locator
void ReleaseLocator(void);
// Description:
// Create default locator. Used to create one when none is specified.
void CreateDefaultLocator(void);
// Description:
// Get the MTime of this object also considering the locator.
unsigned long int GetMTime();
vtkIterativeClosestPointTransform();
~vtkIterativeClosestPointTransform();
void InternalUpdate();
// Description:
// This method does no type checking, use DeepCopy instead.
void InternalDeepCopy(vtkAbstractTransform *transform);
vtkDataSet* Source;
vtkDataSet* Target;
vtkCellLocator *Locator;
int MaximumNumberOfIterations;
int CheckMeanDistance;
int MeanDistanceMode;
double MaximumMeanDistance;
int MaximumNumberOfLandmarks;
int StartByMatchingCentroids;
int NumberOfIterations;
double MeanDistance;
vtkLandmarkTransform *LandmarkTransform;
private:
vtkIterativeClosestPointTransform(const vtkIterativeClosestPointTransform&); // Not implemented.
void operator=(const vtkIterativeClosestPointTransform&); // Not implemented.
};
#endif