Public Methods |
virtual const char * | GetClassName () |
virtual int | IsA (const char *type) |
void | PrintSelf (ostream &os, vtkIndent indent) |
virtual void | SetUseFeatureEdges (int) |
virtual int | GetUseFeatureEdges () |
virtual void | UseFeatureEdgesOn () |
virtual void | UseFeatureEdgesOff () |
vtkFeatureEdges * | GetFeatureEdges () |
void | SetNumberOfXDivisions (int num) |
void | SetNumberOfYDivisions (int num) |
void | SetNumberOfZDivisions (int num) |
virtual int | GetNumberOfXDivisions () |
virtual int | GetNumberOfYDivisions () |
virtual int | GetNumberOfZDivisions () |
void | SetNumberOfDivisions (int div[3]) |
int * | GetNumberOfDivisions () |
void | GetNumberOfDivisions (int div[3]) |
void | SetDivisionOrigin (float x, float y, float z) |
void | SetDivisionOrigin (float o[3]) |
virtual float * | GetDivisionOrigin () |
virtual void | GetDivisionOrigin (float &, float &, float &) |
virtual void | GetDivisionOrigin (float[3]) |
void | SetDivisionSpacing (float x, float y, float z) |
void | SetDivisionSpacing (float s[3]) |
virtual float * | GetDivisionSpacing () |
virtual void | GetDivisionSpacing (float &, float &, float &) |
virtual void | GetDivisionSpacing (float[3]) |
virtual void | SetUseInputPoints (int) |
virtual int | GetUseInputPoints () |
virtual void | UseInputPointsOn () |
virtual void | UseInputPointsOff () |
void | StartAppend (float *bounds) |
void | StartAppend (float x0, float x1, float y0, float y1, float z0, float z1) |
void | Append (vtkPolyData *piece) |
void | EndAppend () |
Static Public Methods |
int | IsTypeOf (const char *type) |
vtkQuadricClustering * | SafeDownCast (vtkObject *o) |
vtkQuadricClustering * | New () |
Protected Methods |
| vtkQuadricClustering () |
| ~vtkQuadricClustering () |
| vtkQuadricClustering (const vtkQuadricClustering &) |
void | operator= (const vtkQuadricClustering &) |
void | Execute () |
int | HashPoint (float point[3]) |
void | ComputeRepresentativePoint (float quadric[9], int binId, float point[3]) |
void | AddTriangles (vtkCellArray *edges, vtkPoints *points, int geometryFlag) |
void | AddTriangle (int *binIds, float *pt0, float *pt1, float *pt2, int geometeryFlag) |
void | AddEdges (vtkCellArray *edges, vtkPoints *points, int geometryFlag) |
void | AddEdge (int *binIds, float *pt0, float *pt1, int geometeryFlag) |
void | AddVerticies (vtkCellArray *verts, vtkPoints *points, int geometryFlag) |
void | AddVertex (int binId, float *pt, int geometeryFlag) |
void | InitializeQuadric (float quadric[9]) |
void | AddQuadric (int binId, float quadric[9]) |
void | EndAppendUsingPoints (vtkPolyData *input) |
void | AppendFeatureQuadrics (vtkPolyData *pd) |
Protected Attributes |
int | UseInputPoints |
int | UseFeatureEdges |
int | NumberOfXDivisions |
int | NumberOfYDivisions |
int | NumberOfZDivisions |
int | ComputeNumberOfDivisions |
float | DivisionOrigin [3] |
float | DivisionSpacing [3] |
float | Bounds [6] |
float | XBinSize |
float | YBinSize |
float | ZBinSize |
VTK_POINT_QUADRIC * | QuadricArray |
int | NumberOfBinsUsed |
vtkCellArray * | OutputTriangleArray |
vtkCellArray * | OutputLines |
vtkCellArray * | OutputVerts |
vtkFeatureEdges * | FeatureEdges |
vtkQuadricClustering is a filter to reduce the number of triangles in a triangle mesh, forming a good approximation to the original geometry. The input to vtkQuadricClustering is a vtkPolyData object, and only triangles are treated. If you desire to decimate polygonal meshes, first triangulate the polygons with vtkTriangleFilter object.
The algorithm used is the one described by Peter Lindstrom in his Siggraph 2000 paper, "Out-of-Core Simplification of Large Polygonal Models." The general approach of the algorithm is to cluster vertices in a uniform binning of space, accumulating the quadric of each triangle (pushed out to the triangles vertices) within each bin, and then determining an optimal position for a single vertex in a bin by using the accumulated quadric. In more detail, the algorithm first gets the bounds of the input poly data. It then breaks this bounding volume into a user-specified number of spatial bins. It then reads each triangle from the input and hashes its vertices into these bins. (If this is the first time a bin has been visited, initialize its quadric to the 0 matrix.) The algorithm computes the error quadric for this triangle and adds it to the existing quadric of the bin in which each vertex is contained. Then, if 2 or more vertices of the triangle fall in the same bin, the triangle is dicarded. If the triangle is not discarded, it adds the triangle to the list of output triangles as a list of vertex identifiers. (There is one vertex id per bin.) After all the triangles have been read, the representative vertex for each bin is computed (an optimal location is found) using the quadric for that bin. This determines the spatial location of the vertices of each of the triangles in the output.
To use this filter, specify the divisions defining the spatial subdivision in the x, y, and z directions. You must also specify an input vtkPolyData.
This filter can take multiple inputs. To do this, the user must explicity call StartAppend, Append (once for each input), and EndAppend. StartAppend sets up the data structure to hold the quadric matrices. Append processes each triangle in the input poly data it was called on, hashes its vertices to the appropriate bins, determines whether to keep this triangle, and updates the appropriate quadric matrices. EndAppend determines the spatial location of each of the representative vertices for the visited bins.