00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00094 #ifndef __vtkImageToPolyDataFilter_h
00095 #define __vtkImageToPolyDataFilter_h
00096
00097 #include "vtkStructuredPointsToPolyDataFilter.h"
00098 #include "vtkScalarsToColors.h"
00099
00100 #define VTK_STYLE_PIXELIZE 0
00101 #define VTK_STYLE_POLYGONALIZE 1
00102 #define VTK_STYLE_RUN_LENGTH 2
00103
00104 #define VTK_COLOR_MODE_LUT 0
00105 #define VTK_COLOR_MODE_LINEAR_256 1
00106
00107 class vtkStructuredPoints;
00108 class vtkEdgeTable;
00109 class vtkAppendPolyData;
00110
00111 class VTK_HYBRID_EXPORT vtkImageToPolyDataFilter : public vtkStructuredPointsToPolyDataFilter
00112 {
00113 public:
00114 vtkTypeMacro(vtkImageToPolyDataFilter,vtkStructuredPointsToPolyDataFilter);
00115 void PrintSelf(ostream& os, vtkIndent indent);
00116
00118
00119 static vtkImageToPolyDataFilter *New()
00120 {return new vtkImageToPolyDataFilter;};
00122
00124
00130 vtkSetClampMacro(OutputStyle,int,VTK_STYLE_PIXELIZE,VTK_STYLE_RUN_LENGTH);
00131 vtkGetMacro(OutputStyle,int);
00132 void SetOutputStyleToPixelize()
00133 {this->SetOutputStyle(VTK_STYLE_PIXELIZE);};
00134 void SetOutputStyleToPolygonalize()
00135 {this->SetOutputStyle(VTK_STYLE_POLYGONALIZE);};
00136 void SetOutputStyleToRunLength()
00137 {this->SetOutputStyle(VTK_STYLE_RUN_LENGTH);};
00139
00141
00142 vtkSetClampMacro(ColorMode,int,VTK_COLOR_MODE_LUT,VTK_COLOR_MODE_LINEAR_256);
00143 vtkGetMacro(ColorMode,int);
00144 void SetColorModeToLUT()
00145 {this->SetColorMode(VTK_COLOR_MODE_LUT);};
00146 void SetColorModeToLinear256()
00147 {this->SetColorMode(VTK_COLOR_MODE_LINEAR_256);};
00149
00151
00153 vtkSetObjectMacro(LookupTable,vtkScalarsToColors);
00154 vtkGetObjectMacro(LookupTable,vtkScalarsToColors);
00156
00158
00160 vtkSetMacro(Smoothing, int);
00161 vtkGetMacro(Smoothing, int);
00162 vtkBooleanMacro(Smoothing, int);
00164
00166
00168 vtkSetClampMacro(NumberOfSmoothingIterations,int,0,VTK_LARGE_INTEGER);
00169 vtkGetMacro(NumberOfSmoothingIterations,int);
00171
00173
00175 vtkSetMacro(Decimation, int);
00176 vtkGetMacro(Decimation, int);
00177 vtkBooleanMacro(Decimation, int);
00179
00181
00182 vtkSetClampMacro(DecimationError,float,0.0,VTK_LARGE_FLOAT);
00183 vtkGetMacro(DecimationError,float);
00185
00187
00190 vtkSetClampMacro(Error,int,0,VTK_LARGE_INTEGER);
00191 vtkGetMacro(Error,int);
00193
00195
00200 vtkSetClampMacro(SubImageSize,int,10,VTK_LARGE_INTEGER);
00201 vtkGetMacro(SubImageSize,int);
00203
00204 protected:
00205 vtkImageToPolyDataFilter();
00206 ~vtkImageToPolyDataFilter();
00207
00208 void Execute();
00209
00210 int OutputStyle;
00211 int ColorMode;
00212 int Smoothing;
00213 int NumberOfSmoothingIterations;
00214 int Decimation;
00215 float DecimationError;
00216 int Error;
00217 int SubImageSize;
00218 vtkScalarsToColors *LookupTable;
00219
00220 virtual void PixelizeImage(vtkUnsignedCharArray *pixels, int dims[3],
00221 float origin[3], float spacing[3],
00222 vtkPolyData *output);
00223 virtual void PolygonalizeImage(vtkUnsignedCharArray *pixels, int dims[3],
00224 float origin[3], float spacing[3],
00225 vtkPolyData *output);
00226 virtual void RunLengthImage(vtkUnsignedCharArray *pixels, int dims[3],
00227 float origin[3], float spacing[3],
00228 vtkPolyData *output);
00229 private:
00230 vtkUnsignedCharArray *Table;
00231 vtkTimeStamp TableMTime;
00232 int *Visited;
00233 vtkUnsignedCharArray *PolyColors;
00234 vtkEdgeTable *EdgeTable;
00235 vtkEdgeTable *EdgeUseTable;
00236 vtkIntArray *EdgeUses;
00237
00238
00239 vtkAppendPolyData *Append;
00240
00241 void BuildTable(unsigned char *inPixels);
00242 vtkUnsignedCharArray *QuantizeImage(vtkDataArray *inScalars, int numComp,
00243 int type, int dims[3], int ext[4]);
00244 int ProcessImage(vtkUnsignedCharArray *pixels, int dims[2]);
00245 int BuildEdges(vtkUnsignedCharArray *pixels, int dims[3], float origin[3],
00246 float spacing[3], vtkUnsignedCharArray *pointDescr,
00247 vtkPolyData *edges);
00248 void BuildPolygons(vtkUnsignedCharArray *pointDescr, vtkPolyData *edges,
00249 int numPolys, vtkUnsignedCharArray *polyColors);
00250 void SmoothEdges(vtkUnsignedCharArray *pointDescr, vtkPolyData *edges);
00251 void DecimateEdges(vtkPolyData *edges, vtkUnsignedCharArray *pointDescr,
00252 float tol2);
00253 void GeneratePolygons(vtkPolyData *edges, int numPolys, vtkPolyData *output,
00254 vtkUnsignedCharArray *polyColors,
00255 vtkUnsignedCharArray *pointDescr);
00256
00257 int GetNeighbors(unsigned char *ptr, int &i, int &j, int dims[3],
00258 unsigned char *neighbors[4], int mode);
00259
00260 void GetIJ(int id, int &i, int &j, int dims[3]);
00261 unsigned char *GetColor(unsigned char *rgb);
00262 int IsSameColor(unsigned char *p1, unsigned char *p2);
00263
00264 private:
00265 vtkImageToPolyDataFilter(const vtkImageToPolyDataFilter&);
00266 void operator=(const vtkImageToPolyDataFilter&);
00267 };
00268
00269 #endif
00270