00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00047 #ifndef __vtkFastSplatter_h
00048 #define __vtkFastSplatter_h
00049
00050 #include "vtkImageAlgorithm.h"
00051
00052 class VTK_IMAGING_EXPORT vtkFastSplatter : public vtkImageAlgorithm
00053 {
00054 public:
00055 vtkTypeRevisionMacro(vtkFastSplatter, vtkImageAlgorithm);
00056 static vtkFastSplatter *New();
00057 virtual void PrintSelf(ostream &os, vtkIndent indent);
00058
00060
00064 vtkSetVector6Macro(ModelBounds,double);
00065 vtkGetVectorMacro(ModelBounds,double,6);
00067
00069
00070 vtkSetVector3Macro( OutputDimensions, int );
00071 vtkGetVector3Macro( OutputDimensions, int );
00073
00074
00075 enum { NoneLimit, ClampLimit, ScaleLimit, FreezeScaleLimit };
00076
00077
00079
00084 vtkSetMacro(LimitMode, int);
00085 vtkGetMacro(LimitMode, int);
00086 void SetLimitModeToNone() { this->SetLimitMode(NoneLimit); }
00087 void SetLimitModeToClamp() { this->SetLimitMode(ClampLimit); }
00088 void SetLimitModeToScale() { this->SetLimitMode(ScaleLimit); }
00089 void SetLimitModeToFreezeScale() { this->SetLimitMode(FreezeScaleLimit); }
00091
00093
00094 vtkSetMacro(MinValue, double);
00095 vtkGetMacro(MinValue, double);
00096 vtkSetMacro(MaxValue, double);
00097 vtkGetMacro(MaxValue, double);
00099
00101
00103 vtkGetMacro(NumberOfPointsSplatted, int);
00105
00109 void SetSplatConnection(vtkAlgorithmOutput*);
00110
00111 protected:
00112 vtkFastSplatter();
00113 virtual ~vtkFastSplatter();
00114
00115 double ModelBounds[6];
00116 int OutputDimensions[3];
00117
00118 int LimitMode;
00119 double MinValue;
00120 double MaxValue;
00121 double FrozenScale;
00122
00123 vtkImageData *Buckets;
00124
00125 virtual int FillInputPortInformation(int port, vtkInformation *info);
00126 virtual int RequestInformation(vtkInformation *,
00127 vtkInformationVector **,
00128 vtkInformationVector *);
00129 virtual int RequestUpdateExtent(vtkInformation*,
00130 vtkInformationVector**,
00131 vtkInformationVector*);
00132 virtual int RequestData(vtkInformation *,
00133 vtkInformationVector **,
00134 vtkInformationVector *);
00135
00136
00137
00138 double Origin[3];
00139 double Spacing[3];
00140
00141
00142 int NumberOfPointsSplatted;
00143
00144
00145
00146
00147 double LastDataMinValue;
00148 double LastDataMaxValue;
00149
00150 private:
00151 vtkFastSplatter(const vtkFastSplatter &);
00152 void operator=(const vtkFastSplatter &);
00153 };
00154
00155
00156
00157
00158
00159 template<class T>
00160 void vtkFastSplatterClamp(T *array, vtkIdType arraySize,
00161 T minValue, T maxValue)
00162 {
00163 for (vtkIdType i = 0; i < arraySize; i++)
00164 {
00165 if (array[i] < minValue) array[i] = minValue;
00166 if (array[i] > maxValue) array[i] = maxValue;
00167 }
00168 }
00169
00170
00171
00172 template<class T>
00173 void vtkFastSplatterScale(T *array, int numComponents, vtkIdType numTuples,
00174 T minValue, T maxValue,
00175 double *dataMinValue, double *dataMaxValue)
00176 {
00177 T *a;
00178 T min, max;
00179 *dataMinValue = 0;
00180 *dataMaxValue = 0;
00181 vtkIdType t;
00182 for (int c = 0; c < numComponents; c++)
00183 {
00184
00185 a = array+c;
00186 min = max = *a;
00187 a += numComponents;
00188 for (t = 1; t < numTuples; t++, a += numComponents)
00189 {
00190 if (min > *a) min = *a;
00191 if (max < *a) max = *a;
00192 }
00193
00194
00195 if (min != 0)
00196 {
00197 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00198 {
00199 *a -= min;
00200 }
00201 }
00202
00203
00204 if (max != min)
00205 {
00206 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00207 {
00208 *a = ((maxValue-minValue)*(*a))/(max-min);
00209 }
00210 }
00211
00212
00213 if (minValue != 0)
00214 {
00215 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00216 {
00217 *a += minValue;
00218 }
00219 }
00220 if (c == 0)
00221 {
00222 *dataMinValue = min;
00223 *dataMaxValue = max;
00224 }
00225 }
00226 }
00227
00228
00229
00230
00231 template<class T>
00232 void vtkFastSplatterFrozenScale(T *array,
00233 int numComponents, vtkIdType numTuples,
00234 T minValue, T maxValue,
00235 double min, double max)
00236 {
00237 T *a;
00238
00239 vtkIdType t;
00240 for (int c = 0; c < numComponents; c++)
00241 {
00242
00243 if (min != 0)
00244 {
00245 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00246 {
00247 *a -= static_cast<T>(min);
00248 }
00249 }
00250
00251
00252 if (max != min)
00253 {
00254 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00255 {
00256 *a = static_cast<T>(((maxValue-minValue)*(*a))/(max-min));
00257 }
00258 }
00259
00260
00261 if (minValue != 0)
00262 {
00263 for (t = 0, a = array+c; t < numTuples; t++, a += numComponents)
00264 {
00265 *a += minValue;
00266 }
00267 }
00268 }
00269 }
00270
00271
00272
00273 #endif //__vtkFastSplatter_h