/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkSymmetricEllipsoidInteriorExteriorSpatialFunction_hxx #define itkSymmetricEllipsoidInteriorExteriorSpatialFunction_hxx #include namespace itk { template SymmetricEllipsoidInteriorExteriorSpatialFunction::SymmetricEllipsoidInteriorExteriorSpatialFunction() { m_Center.Fill(0.0); // Origin of ellipsoid m_Orientation.Fill(1.0); // Orientation of unique axis } template auto SymmetricEllipsoidInteriorExteriorSpatialFunction::Evaluate(const InputType & position) const -> OutputType { double uniqueTerm; // Term in ellipsoid equation for unique axis double symmetricTerm; // Term in ellipsoid equation for symmetric axes Vector pointVector; Vector symmetricVector; // Project the position onto the major axis, normalize by axis length, // and determine whether position is inside ellipsoid. for (unsigned int i = 0; i < VDimension; ++i) { pointVector[i] = position[i] - m_Center[i]; } uniqueTerm = std::pow(static_cast(((pointVector * m_Orientation) / (.5 * m_UniqueAxis))), static_cast(2)); symmetricVector = pointVector - (m_Orientation * (pointVector * m_Orientation)); symmetricTerm = std::pow(static_cast(((symmetricVector.GetNorm()) / (.5 * m_SymmetricAxes))), static_cast(2)); if ((uniqueTerm + symmetricTerm) >= 0 && (uniqueTerm + symmetricTerm) <= 1) { return 1; // Inside the ellipsoid. } // Default return value assumes outside the ellipsoid return 0; // Outside the ellipsoid. } template void SymmetricEllipsoidInteriorExteriorSpatialFunction::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Origin of Ellipsoid: "; os << m_Center << std::endl; os << indent << "Unique Axis Orientation: "; os << m_Orientation << std::endl; os << indent << "Unique Axis Length: "; os << m_UniqueAxis << std::endl; os << indent << "Symmetric Axis Length: "; os << m_SymmetricAxes << std::endl; } template void SymmetricEllipsoidInteriorExteriorSpatialFunction::SetOrientation(VectorType orientation, double uniqueAxis, double symmetricAxes) { m_Orientation = orientation; // Orientation of unique axis of ellipsoid m_SymmetricAxes = symmetricAxes; // Length of symmetric axes m_UniqueAxis = uniqueAxis; // Length of unique axis } } // end namespace itk #endif