1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkParametricBoy.h"
#include "vtkMath.h"
#include "vtkObjectFactory.h"
VTK_ABI_NAMESPACE_BEGIN
vtkStandardNewMacro(vtkParametricBoy);
//------------------------------------------------------------------------------
vtkParametricBoy::vtkParametricBoy()
{
// Preset triangulation parameters
this->MinimumU = 0;
this->MaximumU = vtkMath::Pi();
this->MinimumV = 0;
this->MaximumV = vtkMath::Pi();
this->JoinU = 1;
this->JoinV = 1;
this->TwistU = 1;
this->TwistV = 1;
this->ClockwiseOrdering = 0;
this->DerivativesAvailable = 1;
this->ZScale = 0.125;
}
//------------------------------------------------------------------------------
vtkParametricBoy::~vtkParametricBoy() = default;
//------------------------------------------------------------------------------
void vtkParametricBoy::Evaluate(double uvw[3], double Pt[3], double Duvw[9])
{
double u = uvw[0];
double v = uvw[1];
double* Du = Duvw;
double* Dv = Duvw + 3;
double cu = cos(u);
double su = sin(u);
double sv = sin(v);
double X = cu * sv;
double Y = su * sv;
double Z = cos(v);
double X2 = X * X;
double X3 = X2 * X;
double X4 = X3 * X;
double Y2 = Y * Y;
double Y3 = Y2 * Y;
double Y4 = Y3 * Y;
double Z2 = Z * Z;
double Z3 = Z2 * Z;
double Z4 = Z3 * Z;
double sr3 = sqrt(3.0);
// clang-format off
// The point
Pt[0] = 1.0 / 2.0 * (2 * X2 - Y2 - Z2 + 2.0 * Y * Z * (Y2 - Z2) +
Z * X * (X2 - Z2) + X * Y * (Y2 - X2));
Pt[1] = sr3 / 2.0 * (Y2 - Z2 + (Z * X * (Z2 - X2) +
X * Y * (Y2 - X2)));
Pt[2] = this->ZScale * (X + Y + Z) * ((X + Y + Z) * (X + Y + Z) *
(X + Y + Z) +
4.0 * (Y - X) * (Z - Y) * (X - Z));
//The derivatives are:
Du[0] = -1.0 / 2.0 * X4 - Z3 * X + 3.0 * Y2 * X2 - 3.0 / 2.0 * Z * X2 *
Y + 3.0 * Z * X * Y2 -
3.0 * Y * X - 1.0 / 2.0 * Y4 + 1.0 / 2.0 * Z3 * Y;
Dv[0] = (3.0 / 2.0 * Z2 * X2 + 2 * Z * X - 1.0 / 2.0 * Z4) * cu +
(-2.0 * Z * X3 + 2 * Z * X * Y2 + 3 * Z2 * Y2 - Z * Y - Z4) * su +
(-1.0 / 2.0 * X3 + 3.0 / 2.0 * Z2 * X - Y3 + 3.0 * Z2 * Y + Z) * sv;
Du[1] = -1.0 / 2.0 * sr3 * X4 + 3.0 * sr3 * Y2 * X2 +
3.0 / 2.0 * sr3 * Z * X2 * Y + sr3 * Y * X -
1.0 / 2.0 * sr3 * Y4 - 1.0 / 2.0 * sr3 * Z3 * Y;
Dv[1] = (-3.0 / 2.0 * sr3 * Z2 * X2 + 1.0 / 2.0 * sr3 * Z4) * cu +
(-2.0 * sr3 * Z * X3 + 2.0 * sr3 * Z * Y2 * X + sr3 * Z * Y) * su +
(1.0 / 2.0 * sr3 * X3 - 3.0 / 2.0 * sr3 * Z2 * X + sr3 * Z) * sv;
Du[2] = X4 + 3 / 2 * Z * X3 + 3 / 2 * Z2 * X2 + X3 * Y - 3 * X2 * Y2 +
3 * Z * X2 * Y - Y3 * X - 3 / 2 * Z * Y3 - 3 / 2 * Z2 * Y2 - Z3 * Y;
Dv[2] = (1 / 2 * Z * X3 + 3 / 2 * Z3 * X + Z4) * cu +
(4 * Z * X3 + 3 * Z * X2 * Y +
9 / 2 * Z2 * X2 + 9 / 2 * Z2 * X * Y + 3 * Z3 * X + 1 / 2 * Z * Y3 + 3 *
Z2 * Y2 +
3 / 2 * Z3 * Y) * su + (-3 / 2 * X2 * Y - 3 / 2 * Z * X2 - 3 / 2 * X *
Y2 -
3 * Z * X * Y - 3 * Z2 * X - Y3 - 3 / 2 * Z * Y2 - 1 / 2 * Z3) * sv;
// clang-format on
}
//------------------------------------------------------------------------------
double vtkParametricBoy::EvaluateScalar(double*, double*, double*)
{
return 0;
}
//------------------------------------------------------------------------------
void vtkParametricBoy::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "ZScale: " << this->ZScale << "\n";
}
VTK_ABI_NAMESPACE_END
|