22 SmartPointer<Mesh<T>> mesh =
nullptr;
24 VectorType<T, 3> transformVector{};
26 double numericEps = 1e-6;
29 bool isValidVector()
const {
30 if (DotProduct(transformVector, transformVector) < numericEps)
35 void translateMesh() {
37 if (!isValidVector()) {
40 for (
auto &node : mesh->nodes) {
41 for (
unsigned i = 0; i < 3; ++i) {
42 node[i] += transformVector[i];
50 if (!isValidVector()) {
53 if (std::abs(angle) < numericEps) {
56 const double norm = std::sqrt(transformVector[0] * transformVector[0] +
57 transformVector[1] * transformVector[1] +
58 transformVector[2] * transformVector[2]);
59 for (
unsigned i = 0; i < 3; ++i) {
60 transformVector[i] /= norm;
62 const auto axis = transformVector;
63 double sinAngle = std::sin(angle);
64 double cosAngle = std::cos(angle);
65 double uniMinusCosAngle = 1 - cosAngle;
66 for (
auto &node : mesh->nodes) {
68 double term1 = axis[0] * node[0] + axis[1] * node[1] + axis[2] * node[2];
69 for (
unsigned i = 0; i < 3; ++i) {
70 unsigned ip1 = (i + 1) % 3;
71 unsigned ip2 = (i + 2) % 3;
73 axis[i] * term1 * uniMinusCosAngle + oldNode[i] * cosAngle +
74 (axis[ip1] * oldNode[ip2] - axis[ip2] * oldNode[ip1]) * sinAngle;
80 if (!isValidVector()) {
82 .addWarning(
"TransformMesh: TransformVector is not valid!")
86 for (
auto &node : mesh->nodes) {
87 for (
unsigned i = 0; i < 3; ++i) {
88 node[i] *= transformVector[i];
96 Vec3D<T> passedTransformVector = {},
double passedAngle = 0.0)
97 : mesh(passedMesh), transform(passedTransform),
98 transformVector(passedTransformVector), angle(passedAngle) {}
101 if (mesh ==
nullptr) {
102 Logger::getInstance()
103 .addWarning(
"No mesh passed to TransformMesh. Not transforming!")
118 Logger::getInstance()
120 "Invalid transform passed to TransformMesh. Not transforming!")