00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00038
#ifndef __vtkAbstractTransform_h
00039
#define __vtkAbstractTransform_h
00040
00041
#include "vtkObject.h"
00042
00043
00044
00045
00046
class vtkDataArray;
00047
class vtkMatrix4x4;
00048
class vtkPoints;
00049
class vtkSimpleCriticalSection;
00050
00051
00052 class VTK_COMMON_EXPORT vtkAbstractTransform :
public vtkObject
00053 {
00054
public:
00055
00056 vtkTypeRevisionMacro(vtkAbstractTransform,
vtkObject);
00057
void PrintSelf(ostream& os,
vtkIndent indent);
00058
00060
00062 void TransformPoint(
const float in[3],
float out[3]) {
00063 this->Update(); this->InternalTransformPoint(in,out); };
00065
00067
00069 void TransformPoint(
const double in[3],
double out[3]) {
00070 this->Update(); this->InternalTransformPoint(in,out); };
00072
00074
00076 double *TransformPoint(
double x,
double y,
double z) {
00077
return this->TransformDoublePoint(x,y,z); }
00078 double *TransformPoint(
const double point[3]) {
00079
return this->TransformPoint(point[0],point[1],point[2]); };
00081
00083
00085 float *TransformFloatPoint(
float x,
float y,
float z) {
00086 this->InternalFloatPoint[0] = x;
00087 this->InternalFloatPoint[1] = y;
00088 this->InternalFloatPoint[2] = z;
00089 this->TransformPoint(this->InternalFloatPoint,this->InternalFloatPoint);
00090
return this->InternalFloatPoint; };
00091 float *TransformFloatPoint(
const float point[3]) {
00092
return this->TransformFloatPoint(point[0],point[1],point[2]); };
00094
00096
00098 double *TransformDoublePoint(
double x,
double y,
double z) {
00099 this->InternalDoublePoint[0] = x;
00100 this->InternalDoublePoint[1] = y;
00101 this->InternalDoublePoint[2] = z;
00102 this->TransformPoint(this->InternalDoublePoint,this->InternalDoublePoint);
00103
return this->InternalDoublePoint; };
00104 double *TransformDoublePoint(
const double point[3]) {
00105
return this->TransformDoublePoint(point[0],point[1],point[2]); };
00107
00109
00112
void TransformNormalAtPoint(
const float point[3],
const float in[3],
00113
float out[3]);
00114
void TransformNormalAtPoint(
const double point[3],
const double in[3],
00115
double out[3]);
00117
00118 double *TransformNormalAtPoint(
const double point[3],
00119
const double normal[3]) {
00120 this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00121
return this->InternalDoublePoint; };
00122
00124
00127 double *TransformDoubleNormalAtPoint(
const double point[3],
00128
const double normal[3]) {
00129 this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00130
return this->InternalDoublePoint; };
00132
00134
00137 float *TransformFloatNormalAtPoint(
const float point[3],
00138
const float normal[3]) {
00139 this->TransformNormalAtPoint(point,normal,this->InternalFloatPoint);
00140
return this->InternalFloatPoint; };
00142
00144
00147
void TransformVectorAtPoint(
const float point[3],
const float in[3],
00148
float out[3]);
00149
void TransformVectorAtPoint(
const double point[3],
const double in[3],
00150
double out[3]);
00152
00153 double *TransformVectorAtPoint(
const double point[3],
00154
const double vector[3]) {
00155 this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00156
return this->InternalDoublePoint; };
00157
00159
00162 double *TransformDoubleVectorAtPoint(
const double point[3],
00163
const double vector[3]) {
00164 this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00165
return this->InternalDoublePoint; };
00167
00169
00172 float *TransformFloatVectorAtPoint(
const float point[3],
00173
const float vector[3]) {
00174 this->TransformVectorAtPoint(point,vector,this->InternalFloatPoint);
00175
return this->InternalFloatPoint; };
00177
00180
virtual void TransformPoints(
vtkPoints *inPts,
vtkPoints *outPts);
00181
00183
00185
virtual void TransformPointsNormalsVectors(
vtkPoints *inPts,
00186
vtkPoints *outPts,
00187
vtkDataArray *inNms,
00188
vtkDataArray *outNms,
00189
vtkDataArray *inVrs,
00190
vtkDataArray *outVrs);
00192
00198 vtkAbstractTransform *GetInverse();
00199
00203
void SetInverse(vtkAbstractTransform *transform);
00204
00206
virtual void Inverse() = 0;
00207
00209
void DeepCopy(vtkAbstractTransform *);
00210
00214
void Update();
00215
00217
00219
virtual void InternalTransformPoint(
const float in[3],
float out[3]) = 0;
00220
virtual void InternalTransformPoint(
const double in[3],
double out[3]) = 0;
00222
00224
00228
virtual void InternalTransformDerivative(
const float in[3],
float out[3],
00229
float derivative[3][3]) = 0;
00230
virtual void InternalTransformDerivative(
const double in[3],
double out[3],
00231
double derivative[3][3]) = 0;
00233
00235
virtual vtkAbstractTransform *MakeTransform() = 0;
00236
00243
virtual int CircuitCheck(vtkAbstractTransform *transform);
00244
00246
unsigned long GetMTime();
00247
00250
virtual void UnRegister(
vtkObjectBase *O);
00251
00253
00255 void Identity() {
00256 vtkWarningMacro(
"vtkAbstractTransform::Identity() is deprecated"); };
00258
00259
protected:
00260 vtkAbstractTransform();
00261 ~vtkAbstractTransform();
00262
00264 virtual void InternalUpdate() {};
00265
00267 virtual void InternalDeepCopy(vtkAbstractTransform *) {};
00268
00269 float InternalFloatPoint[3];
00270 double InternalDoublePoint[3];
00271
00272
private:
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
vtkTimeStamp UpdateTime;
00283
vtkSimpleCriticalSection *UpdateMutex;
00284
vtkSimpleCriticalSection *InverseMutex;
00285
int DependsOnInverse;
00286
00287
00288
00289
00290 vtkAbstractTransform *MyInverse;
00291
00292
int InUnRegister;
00293
00294
private:
00295 vtkAbstractTransform(
const vtkAbstractTransform&);
00296
void operator=(
const vtkAbstractTransform&);
00297 };
00298
00299
00300
00301
00302
00303
00304 class vtkTransformPair
00305 {
00306
public:
00307 vtkAbstractTransform *
ForwardTransform;
00308 vtkAbstractTransform *
InverseTransform;
00309
00310 void SwapForwardInverse() {
00311 vtkAbstractTransform *tmp = this->
ForwardTransform;
00312 this->ForwardTransform = this->
InverseTransform;
00313 this->InverseTransform = tmp; };
00314 };
00315
00316
00317
00318 class VTK_COMMON_EXPORT vtkTransformConcatenation
00319 {
00320
public:
00321 static vtkTransformConcatenation *New() {
00322
return new vtkTransformConcatenation(); };
00323 void Delete() {
delete this; };
00324
00325
00326
void Concatenate(vtkAbstractTransform *transform);
00327
00328
00329
void Concatenate(
const double elements[16]);
00330
00331
00332 void SetPreMultiplyFlag(
int flag) { this->PreMultiplyFlag = flag; };
00333 int GetPreMultiplyFlag() {
return this->PreMultiplyFlag; };
00334
00335
00336
void Translate(
double x,
double y,
double z);
00337
void Rotate(
double angle,
double x,
double y,
double z);
00338
void Scale(
double x,
double y,
double z);
00339
00340
00341
void Inverse();
00342
00343
00344 int GetInverseFlag() {
return this->InverseFlag; };
00345
00346
00347
void Identity();
00348
00349
00350
void DeepCopy(vtkTransformConcatenation *transform);
00351
00352
00353 int GetNumberOfTransforms() {
return this->NumberOfTransforms; };
00354
00355
00356
00357
00358 int GetNumberOfPreTransforms() {
return this->NumberOfPreTransforms; };
00359
00360
00361 int GetNumberOfPostTransforms() {
00362
return this->NumberOfTransforms-this->NumberOfPreTransforms; };
00363
00364
00365 vtkAbstractTransform *GetTransform(
int i);
00366
00367
00368
unsigned long GetMaxMTime();
00369
00370
void PrintSelf(ostream& os,
vtkIndent indent);
00371
00372
protected:
00373 vtkTransformConcatenation();
00374 ~vtkTransformConcatenation();
00375
00376 int InverseFlag;
00377 int PreMultiplyFlag;
00378
00379 vtkMatrix4x4 *PreMatrix;
00380 vtkMatrix4x4 *PostMatrix;
00381 vtkAbstractTransform *PreMatrixTransform;
00382 vtkAbstractTransform *PostMatrixTransform;
00383
00384 int NumberOfTransforms;
00385 int NumberOfPreTransforms;
00386 int MaxNumberOfTransforms;
00387 vtkTransformPair *TransformList;
00388 };
00389
00390
00391
00392 class VTK_COMMON_EXPORT vtkTransformConcatenationStack
00393 {
00394
public:
00395 static vtkTransformConcatenationStack *New() {
00396
return new vtkTransformConcatenationStack(); };
00397 void Delete() {
delete this; };
00398
00399
00400
00401
void Pop(vtkTransformConcatenation **concat);
00402
00403
00404
00405
void Push(vtkTransformConcatenation **concat);
00406
00407
void DeepCopy(vtkTransformConcatenationStack *stack);
00408
00409
protected:
00410 vtkTransformConcatenationStack();
00411 ~vtkTransformConcatenationStack();
00412
00413 int StackSize;
00414 vtkTransformConcatenation **Stack;
00415 vtkTransformConcatenation **StackBottom;
00416 };
00417
00418
00419
00420
#endif
00421
00422
00423
00424
00425