//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // // Copyright 2014 Sandia Corporation. // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_ImplicitFunctions_h #define vtk_m_ImplicitFunctions_h #include #include namespace vtkm { /// \brief Implicit function for a plane class Plane { public: VTKM_CONT_EXPORT Plane() : Origin(FloatDefault(0)), Normal(FloatDefault(0), FloatDefault(0), FloatDefault(1)) { } VTKM_CONT_EXPORT explicit Plane(const vtkm::Vec &normal) : Origin(FloatDefault(0)), Normal(normal) { } VTKM_CONT_EXPORT Plane(const vtkm::Vec &origin, const vtkm::Vec &normal) : Origin(origin), Normal(normal) { } VTKM_EXEC_CONT_EXPORT const vtkm::Vec& GetOrigin() const { return this->Origin; } VTKM_EXEC_CONT_EXPORT const vtkm::Vec& GetNormal() const { return this->Normal; } VTKM_EXEC_CONT_EXPORT FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const { return ((x - this->Origin[0]) * this->Normal[0]) + ((y - this->Origin[1]) * this->Normal[1]) + ((z - this->Origin[2]) * this->Normal[2]); } VTKM_EXEC_CONT_EXPORT FloatDefault Value(const vtkm::Vec &x) const { return this->Value(x[0], x[1], x[2]); } VTKM_EXEC_CONT_EXPORT vtkm::Vec Gradient(FloatDefault, FloatDefault, FloatDefault) const { return this->Normal; } VTKM_EXEC_CONT_EXPORT vtkm::Vec Gradient(const vtkm::Vec&) const { return this->Normal; } private: vtkm::Vec Origin; vtkm::Vec Normal; }; /// \brief Implicit function for a sphere class Sphere { public: VTKM_CONT_EXPORT Sphere() : Radius(FloatDefault(0.2)), Center(FloatDefault(0)) { } VTKM_CONT_EXPORT explicit Sphere(FloatDefault radius) : Radius(radius), Center(FloatDefault(0)) { } VTKM_CONT_EXPORT Sphere(vtkm::Vec center, FloatDefault radius) : Radius(radius), Center(center) { } VTKM_EXEC_CONT_EXPORT FloatDefault GetRadius() const { return this->Radius; } VTKM_EXEC_CONT_EXPORT const vtkm::Vec& GetCenter() const { return this->Center; } VTKM_EXEC_CONT_EXPORT FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const { return ((x - this->Center[0]) * (x - this->Center[0]) + (y - this->Center[1]) * (y - this->Center[1]) + (z - this->Center[2]) * (z - this->Center[2])) - (this->Radius * this->Radius); } VTKM_EXEC_CONT_EXPORT FloatDefault Value(const vtkm::Vec &x) const { return this->Value(x[0], x[1], x[2]); } VTKM_EXEC_CONT_EXPORT vtkm::Vec Gradient(FloatDefault x, FloatDefault y, FloatDefault z) const { return this->Gradient(vtkm::Vec(x, y, z)); } VTKM_EXEC_CONT_EXPORT vtkm::Vec Gradient(const vtkm::Vec &x) const { return FloatDefault(2) * (x - this->Center); } private: FloatDefault Radius; vtkm::Vec Center; }; /// \brief A function object that evaluates the contained implicit function template class ImplicitFunctionValue { public: VTKM_CONT_EXPORT ImplicitFunctionValue() : Function() { } VTKM_CONT_EXPORT explicit ImplicitFunctionValue(const ImplicitFunction &func) : Function(func) { } VTKM_EXEC_CONT_EXPORT FloatDefault operator()(const vtkm::Vec x) const { return this->Function.Value(x); } VTKM_EXEC_CONT_EXPORT FloatDefault operator()(FloatDefault x, FloatDefault y, FloatDefault z) const { return this->Function.Value(x, y, z); } private: ImplicitFunction Function; }; /// \brief A function object that computes the gradient of the contained implicit /// function and the specified point. template class ImplicitFunctionGradient { public: VTKM_CONT_EXPORT ImplicitFunctionGradient() : Function() { } VTKM_CONT_EXPORT explicit ImplicitFunctionGradient(const ImplicitFunction &func) : Function(func) { } VTKM_EXEC_CONT_EXPORT FloatDefault operator()(const vtkm::Vec x) const { return this->Function.Gradient(x); } VTKM_EXEC_CONT_EXPORT FloatDefault operator()(FloatDefault x, FloatDefault y, FloatDefault z) const { return this->Function.Gradient(x, y, z); } private: ImplicitFunction Function; }; } // namespace vtkm #endif // vtk_m_ImplicitFunctions_h