00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00042
#ifndef __vtkAbstractTransform_h
00043
#define __vtkAbstractTransform_h
00044
00045
#include "vtkObject.h"
00046
00047
00048
00049
00050
class vtkDataArray;
00051
class vtkMatrix4x4;
00052
class vtkPoints;
00053
class vtkSimpleCriticalSection;
00054
00055
00056 class VTK_COMMON_EXPORT vtkAbstractTransform :
public vtkObject
00057 {
00058
public:
00059
00060 vtkTypeRevisionMacro(vtkAbstractTransform,
vtkObject);
00061
void PrintSelf(ostream& os,
vtkIndent indent);
00062
00064
00066 void TransformPoint(
const float in[3],
float out[3]) {
00067 this->Update(); this->InternalTransformPoint(in,out); };
00069
00071
00073 void TransformPoint(
const double in[3],
double out[3]) {
00074 this->Update(); this->InternalTransformPoint(in,out); };
00076
00078
00080 double *TransformPoint(
double x,
double y,
double z) {
00081
return this->TransformDoublePoint(x,y,z); }
00082 double *TransformPoint(
const double point[3]) {
00083
return this->TransformPoint(point[0],point[1],point[2]); };
00085
00087
00089 float *TransformFloatPoint(
float x,
float y,
float z) {
00090 this->InternalFloatPoint[0] = x;
00091 this->InternalFloatPoint[1] = y;
00092 this->InternalFloatPoint[2] = z;
00093 this->TransformPoint(this->InternalFloatPoint,this->InternalFloatPoint);
00094
return this->InternalFloatPoint; };
00095 float *TransformFloatPoint(
const float point[3]) {
00096
return this->TransformFloatPoint(point[0],point[1],point[2]); };
00098
00100
00102 double *TransformDoublePoint(
double x,
double y,
double z) {
00103 this->InternalDoublePoint[0] = x;
00104 this->InternalDoublePoint[1] = y;
00105 this->InternalDoublePoint[2] = z;
00106 this->TransformPoint(this->InternalDoublePoint,this->InternalDoublePoint);
00107
return this->InternalDoublePoint; };
00108 double *TransformDoublePoint(
const double point[3]) {
00109
return this->TransformDoublePoint(point[0],point[1],point[2]); };
00111
00113
00116
void TransformNormalAtPoint(
const float point[3],
const float in[3],
00117
float out[3]);
00118
void TransformNormalAtPoint(
const double point[3],
const double in[3],
00119
double out[3]);
00121
00122 double *TransformNormalAtPoint(
const double point[3],
00123
const double normal[3]) {
00124 this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00125
return this->InternalDoublePoint; };
00126
00128
00131 double *TransformDoubleNormalAtPoint(
const double point[3],
00132
const double normal[3]) {
00133 this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00134
return this->InternalDoublePoint; };
00136
00138
00141 float *TransformFloatNormalAtPoint(
const float point[3],
00142
const float normal[3]) {
00143 this->TransformNormalAtPoint(point,normal,this->InternalFloatPoint);
00144
return this->InternalFloatPoint; };
00146
00148
00151
void TransformVectorAtPoint(
const float point[3],
const float in[3],
00152
float out[3]);
00153
void TransformVectorAtPoint(
const double point[3],
const double in[3],
00154
double out[3]);
00156
00157 double *TransformVectorAtPoint(
const double point[3],
00158
const double vector[3]) {
00159 this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00160
return this->InternalDoublePoint; };
00161
00163
00166 double *TransformDoubleVectorAtPoint(
const double point[3],
00167
const double vector[3]) {
00168 this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00169
return this->InternalDoublePoint; };
00171
00173
00176 float *TransformFloatVectorAtPoint(
const float point[3],
00177
const float vector[3]) {
00178 this->TransformVectorAtPoint(point,vector,this->InternalFloatPoint);
00179
return this->InternalFloatPoint; };
00181
00184
virtual void TransformPoints(
vtkPoints *inPts,
vtkPoints *outPts);
00185
00187
00189
virtual void TransformPointsNormalsVectors(
vtkPoints *inPts,
00190
vtkPoints *outPts,
00191
vtkDataArray *inNms,
00192
vtkDataArray *outNms,
00193
vtkDataArray *inVrs,
00194
vtkDataArray *outVrs);
00196
00202 vtkAbstractTransform *GetInverse();
00203
00207
void SetInverse(vtkAbstractTransform *transform);
00208
00210
virtual void Inverse() = 0;
00211
00213
void DeepCopy(vtkAbstractTransform *);
00214
00218
void Update();
00219
00221
00223
virtual void InternalTransformPoint(
const float in[3],
float out[3]) = 0;
00224
virtual void InternalTransformPoint(
const double in[3],
double out[3]) = 0;
00226
00228
00232
virtual void InternalTransformDerivative(
const float in[3],
float out[3],
00233
float derivative[3][3]) = 0;
00234
virtual void InternalTransformDerivative(
const double in[3],
double out[3],
00235
double derivative[3][3]) = 0;
00237
00239
virtual vtkAbstractTransform *MakeTransform() = 0;
00240
00247
virtual int CircuitCheck(vtkAbstractTransform *transform);
00248
00250
unsigned long GetMTime();
00251
00254
virtual void UnRegister(
vtkObjectBase *O);
00255
00257
00259 void Identity() {
00260 vtkWarningMacro(
"vtkAbstractTransform::Identity() is deprecated"); };
00262
00263
protected:
00264 vtkAbstractTransform();
00265 ~vtkAbstractTransform();
00266
00268 virtual void InternalUpdate() {};
00269
00271 virtual void InternalDeepCopy(vtkAbstractTransform *) {};
00272
00273 float InternalFloatPoint[3];
00274 double InternalDoublePoint[3];
00275
00276
private:
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
vtkTimeStamp UpdateTime;
00287
vtkSimpleCriticalSection *UpdateMutex;
00288
vtkSimpleCriticalSection *InverseMutex;
00289
int DependsOnInverse;
00290
00291
00292
00293
00294 vtkAbstractTransform *MyInverse;
00295
00296
int InUnRegister;
00297
00298
private:
00299 vtkAbstractTransform(
const vtkAbstractTransform&);
00300
void operator=(
const vtkAbstractTransform&);
00301 };
00302
00303
00304
00305
00306
00307
00308 class vtkTransformPair
00309 {
00310
public:
00311 vtkAbstractTransform *
ForwardTransform;
00312 vtkAbstractTransform *
InverseTransform;
00313
00314 void SwapForwardInverse() {
00315 vtkAbstractTransform *tmp = this->
ForwardTransform;
00316 this->ForwardTransform = this->
InverseTransform;
00317 this->InverseTransform = tmp; };
00318 };
00319
00320
00321
00322 class VTK_COMMON_EXPORT vtkTransformConcatenation
00323 {
00324
public:
00325 static vtkTransformConcatenation *New() {
00326
return new vtkTransformConcatenation(); };
00327 void Delete() {
delete this; };
00328
00329
00330
void Concatenate(vtkAbstractTransform *transform);
00331
00332
00333
void Concatenate(
const double elements[16]);
00334
00335
00336 void SetPreMultiplyFlag(
int flag) { this->PreMultiplyFlag = flag; };
00337 int GetPreMultiplyFlag() {
return this->PreMultiplyFlag; };
00338
00339
00340
void Translate(
double x,
double y,
double z);
00341
void Rotate(
double angle,
double x,
double y,
double z);
00342
void Scale(
double x,
double y,
double z);
00343
00344
00345
void Inverse();
00346
00347
00348 int GetInverseFlag() {
return this->InverseFlag; };
00349
00350
00351
void Identity();
00352
00353
00354
void DeepCopy(vtkTransformConcatenation *transform);
00355
00356
00357 int GetNumberOfTransforms() {
return this->NumberOfTransforms; };
00358
00359
00360
00361
00362 int GetNumberOfPreTransforms() {
return this->NumberOfPreTransforms; };
00363
00364
00365 int GetNumberOfPostTransforms() {
00366
return this->NumberOfTransforms-this->NumberOfPreTransforms; };
00367
00368
00369 vtkAbstractTransform *GetTransform(
int i);
00370
00371
00372
unsigned long GetMaxMTime();
00373
00374
void PrintSelf(ostream& os,
vtkIndent indent);
00375
00376
protected:
00377 vtkTransformConcatenation();
00378 ~vtkTransformConcatenation();
00379
00380 int InverseFlag;
00381 int PreMultiplyFlag;
00382
00383 vtkMatrix4x4 *PreMatrix;
00384 vtkMatrix4x4 *PostMatrix;
00385 vtkAbstractTransform *PreMatrixTransform;
00386 vtkAbstractTransform *PostMatrixTransform;
00387
00388 int NumberOfTransforms;
00389 int NumberOfPreTransforms;
00390 int MaxNumberOfTransforms;
00391 vtkTransformPair *TransformList;
00392 };
00393
00394
00395
00396 class VTK_COMMON_EXPORT vtkTransformConcatenationStack
00397 {
00398
public:
00399 static vtkTransformConcatenationStack *New() {
00400
return new vtkTransformConcatenationStack(); };
00401 void Delete() {
delete this; };
00402
00403
00404
00405
void Pop(vtkTransformConcatenation **concat);
00406
00407
00408
00409
void Push(vtkTransformConcatenation **concat);
00410
00411
void DeepCopy(vtkTransformConcatenationStack *stack);
00412
00413
protected:
00414 vtkTransformConcatenationStack();
00415 ~vtkTransformConcatenationStack();
00416
00417 int StackSize;
00418 vtkTransformConcatenation **Stack;
00419 vtkTransformConcatenation **StackBottom;
00420 };
00421
00422
00423
00424
#endif
00425
00426
00427
00428
00429