|
| 1 | +#include "VtkContrib/vtkTransformHelper.h" |
| 2 | + |
| 3 | +#include <VtkContrib/vtkFloatingPointType.h> |
| 4 | +#include <assert.h> |
| 5 | + |
| 6 | + |
| 7 | + |
| 8 | +// ================================================== LA STRUCTURE vtkSimpleTransformMemento ================================================== |
| 9 | + |
| 10 | +vtkTransformHelper::vtkSimpleTransformMemento::vtkSimpleTransformMemento ( ) |
| 11 | + : isExtrinsic (true), scaleX (1.), scaleY (1.), scaleZ (1.), |
| 12 | + xoy (0.), xoz (0.), yoz (0.), dx (0.), dy (0.), dz (0.), translationFirst (true), userData (0) |
| 13 | +{ |
| 14 | +} // vtkSimpleTransformMemento |
| 15 | + |
| 16 | +vtkTransformHelper::vtkSimpleTransformMemento::vtkSimpleTransformMemento (const vtkTransformHelper::vtkSimpleTransformMemento& m) |
| 17 | + : isExtrinsic (m.isExtrinsic), scaleX (m.scaleX), scaleY (m.scaleY), scaleZ (m.scaleZ), |
| 18 | + xoy (m.xoy), xoz (m.xoz), yoz (m.yoz), dx (m.dx), dy (m.dy), dz (m.dz), translationFirst (m.translationFirst), userData (m.userData) |
| 19 | +{ |
| 20 | +} // vtkSimpleTransformMemento::vtkSimpleTransformMemento |
| 21 | + |
| 22 | + |
| 23 | +vtkTransformHelper::vtkSimpleTransformMemento& vtkTransformHelper::vtkSimpleTransformMemento::operator = (const vtkTransformHelper::vtkSimpleTransformMemento& m) |
| 24 | +{ |
| 25 | + isExtrinsic = m.isExtrinsic; |
| 26 | + scaleX = m.scaleX; |
| 27 | + scaleY = m.scaleY; |
| 28 | + scaleZ = m.scaleZ; |
| 29 | + xoy = m.xoy; |
| 30 | + xoz = m.xoz; |
| 31 | + yoz = m.yoz; |
| 32 | + dx = m.dx; |
| 33 | + dy = m.dy; |
| 34 | + dz = m.dz; |
| 35 | + translationFirst = m.translationFirst; |
| 36 | + userData = m.userData; |
| 37 | + |
| 38 | + return *this; |
| 39 | +} // vtkSimpleTransformMemento::operator = |
| 40 | + |
| 41 | + |
| 42 | +vtkTransformHelper::vtkSimpleTransformMemento::~vtkSimpleTransformMemento ( ) |
| 43 | +{ |
| 44 | +} // vtkSimpleTransformMemento::~vtkSimpleTransformMemento |
| 45 | + |
| 46 | + |
| 47 | +bool vtkTransformHelper::vtkSimpleTransformMemento::operator == (const vtkTransformHelper::vtkSimpleTransformMemento& m) const |
| 48 | +{ |
| 49 | + if ((isExtrinsic != m.isExtrinsic) || (scaleX != m.scaleX) || (scaleY != m.scaleY) || (scaleZ != m.scaleZ)) |
| 50 | + return false; |
| 51 | + |
| 52 | + if ((isExtrinsic != m.isExtrinsic) || (xoy != m.xoy) || (xoz != m.xoz) || (yoz != m.yoz) || (dx != m.dx) || (dy != m.dy) || (dz != m.dz) || (translationFirst != m.translationFirst)) |
| 53 | + return false; |
| 54 | + |
| 55 | + return true; |
| 56 | +} // vtkSimpleTransformMemento::operator == |
| 57 | + |
| 58 | + |
| 59 | +bool vtkTransformHelper::vtkSimpleTransformMemento::operator != (const vtkTransformHelper::vtkSimpleTransformMemento& m) const |
| 60 | +{ |
| 61 | + return !(m == *this); |
| 62 | +} // vtkSimpleTransformMemento::operator != |
| 63 | + |
| 64 | + |
| 65 | +bool vtkTransformHelper::vtkSimpleTransformMemento::IsIdentity ( ) const |
| 66 | +{ |
| 67 | + if ((0. != xoy) || (0. != xoz) || (0. != yoz) || (0. != dx) || (0. != dy) || (0. != dz)) |
| 68 | + return false; |
| 69 | + |
| 70 | + return true; |
| 71 | +} // vtkSimpleTransformMemento::IsIdentity |
| 72 | + |
| 73 | + |
| 74 | +// ======================================================= LA CLASSE vtkTransformHelper ======================================================= |
| 75 | + |
| 76 | +vtkTransformHelper::vtkTransformHelper ( ) |
| 77 | +{ |
| 78 | + assert (0 && "vtkTransformHelper::vtkTransformHelper is not allowed."); |
| 79 | +} // vtkTransformHelper::vtkTransformHelper |
| 80 | + |
| 81 | + |
| 82 | +vtkTransformHelper::vtkTransformHelper (const vtkTransformHelper&) |
| 83 | +{ |
| 84 | + assert (0 && "vtkTransformHelper::vtkTransformHelper is not allowed."); |
| 85 | +} // vtkTransformHelper::vtkTransformHelper (const vtkTransformHelper&) |
| 86 | + |
| 87 | + |
| 88 | +vtkTransformHelper& vtkTransformHelper::operator = (const vtkTransformHelper&) |
| 89 | +{ |
| 90 | + assert (0 && "vtkTransformHelper::operator = is not allowed."); |
| 91 | + return *this; |
| 92 | +} // vtkTransformHelper::operator = |
| 93 | + |
| 94 | + |
| 95 | +vtkTransformHelper::~vtkTransformHelper ( ) |
| 96 | +{ |
| 97 | + assert (0 && "vtkTransformHelper::~vtkTransformHelper is not allowed."); |
| 98 | +} // vtkTransformHelper::~vtkTransformHelper |
| 99 | + |
| 100 | + |
| 101 | +void vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor) |
| 102 | +{ |
| 103 | + vtkFloatingPointType* center = prop3D.GetCenter ( ); |
| 104 | + ShrinkProperty (prop3D, factor, center [0], center [1], center [2]); |
| 105 | +} // vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor) |
| 106 | + |
| 107 | + |
| 108 | +void vtkTransformHelper::ShrinkProperty (vtkProp3D& prop3D, double factor, |
| 109 | + double xCenter, double yCenter, double zCenter) |
| 110 | +{ |
| 111 | + vtkTransform* transform = vtkTransform::New ( ); |
| 112 | + transform->PostMultiply ( ); |
| 113 | + vtkFloatingPointType origin [3]; |
| 114 | + prop3D.GetOrigin (origin); |
| 115 | + vtkFloatingPointType* center = prop3D.GetCenter ( ); |
| 116 | + transform->Translate (-xCenter, -yCenter, -zCenter); |
| 117 | + transform->Scale (factor, factor, factor); |
| 118 | + transform->Translate (xCenter, yCenter, zCenter); |
| 119 | + transform->Translate (-origin [0], -origin [1], -origin [2]); |
| 120 | + transform->PreMultiply ( ); |
| 121 | + transform->Translate (origin [0], origin [1], origin [2]); |
| 122 | + prop3D.SetPosition (transform->GetPosition ( )); |
| 123 | + prop3D.SetScale (transform->GetScale ( )); |
| 124 | + transform->Delete ( ); |
| 125 | +} // vtkTransformHelper::ShrinkProperty |
| 126 | + |
| 127 | + |
| 128 | +vtkTransform* vtkTransformHelper::CreateTransform (const vtkTransformHelper::vtkSimpleTransformMemento& memento) |
| 129 | +{ |
| 130 | + vtkTransform* transform = vtkTransform::New ( ); |
| 131 | + assert (0 != transform); |
| 132 | + |
| 133 | + if ((1. != memento.scaleX) || (1. != memento.scaleY) || (1. != memento.scaleZ)) |
| 134 | + transform->Scale (memento.scaleX, memento.scaleY, memento.scaleZ); |
| 135 | + |
| 136 | + if (true == memento.isExtrinsic) |
| 137 | + { |
| 138 | + if (false == memento.translationFirst) |
| 139 | + transform->Translate (memento.dx, memento.dy, memento.dz); |
| 140 | + transform->RotateY (memento.xoz); |
| 141 | + transform->RotateX (memento.yoz); |
| 142 | + transform->RotateZ (memento.xoy); |
| 143 | + if (true == memento.translationFirst) |
| 144 | + transform->Translate (memento.dx, memento.dy, memento.dz); |
| 145 | + } // if (true == memento.isExtrinsic) |
| 146 | + else |
| 147 | + { |
| 148 | + if (true == memento.translationFirst) |
| 149 | + transform->Translate (memento.dx, memento.dy, memento.dz); |
| 150 | + // RotateY(phi) → RotateZ(theta) → RotateX(omega) : chaque rotation s’applique dans le repère local courant, |
| 151 | + // méthode standard pour les angles de Tait-Bryan intrinsèques (ZYX) en robotique/aéronautique. Dixit mistral.ai. |
| 152 | + // Pour ce il faut inverser l'ordre des rotations par rapport à la même transformation mais à repère constant |
| 153 | + // (transformation extrinsèque). |
| 154 | + transform->RotateX (memento.yoz); |
| 155 | + transform->RotateZ (memento.xoy); |
| 156 | + transform->RotateY (memento.xoz); |
| 157 | + if (false == memento.translationFirst) |
| 158 | + transform->Translate (memento.dx, memento.dy, memento.dz); |
| 159 | + transform->PostMultiply ( ); |
| 160 | + } // else if (true == memento.isExtrinsic) |
| 161 | + |
| 162 | + return transform; |
| 163 | +} // vtkTransformHelper::CreateTransform |
| 164 | + |
0 commit comments