1 /*========================================================================= 2 * 3 * Copyright Insight Software Consortium 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0.txt 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *=========================================================================*/ 18 #ifndef itkInteriorExteriorSpatialFunction_h 19 #define itkInteriorExteriorSpatialFunction_h 20 21 #include "itkSpatialFunction.h" 22 23 namespace itk 24 { 25 /** \class InteriorExteriorSpatialFunction 26 * \brief Returns whether or not a location is "inside" or "outside" a function 27 * 28 * InteriorExteriorSpatialFunction is a specialized version of SpatialFunction 29 * where the output type is a boolean. In particular, the return type is understood 30 * to mean the following: 31 * 32 * A return of 1 means inside or on the surface of the function, 33 * 0 means outside the function 34 * 35 * There is no implied meaning in the terms "inside" or "outside"; although 36 * the standard assumption is that "inside" means "bounded by a closed surface", 37 * alternative definitions are also fine. For example, inside might be one side 38 * of a plane, outside the other side. 39 * 40 * A typical use for an InteriorExteriorSpatialFunction is to generate test 41 * primitives of arbitrary dimensionality, in conjunction with 42 * itk::SpatialFunctionImageEvaluatorFilter or itk::FloodFilledSpatialFunctionConditionalIterator 43 * 44 * \ingroup SpatialFunctions 45 * \ingroup ITKCommon 46 */ 47 48 template< unsigned int VDimension = 3, typename TInput = Point< double, VDimension > > 49 class ITK_TEMPLATE_EXPORT InteriorExteriorSpatialFunction:public 50 SpatialFunction< bool, VDimension, TInput > 51 { 52 public: 53 ITK_DISALLOW_COPY_AND_ASSIGN(InteriorExteriorSpatialFunction); 54 55 /** Standard class type aliases. */ 56 using Self = InteriorExteriorSpatialFunction; 57 using Superclass = SpatialFunction< bool, VDimension, TInput >; 58 using Pointer = SmartPointer< Self >; 59 using ConstPointer = SmartPointer< const Self >; 60 61 /** Run-time type information (and related methods). */ 62 itkTypeMacro(InteriorExteriorSpatialFunction, SpatialFunction); 63 64 /** Input type for the function */ 65 using InputType = typename Superclass::InputType; 66 67 /** Output type for the function */ 68 using OutputType = typename Superclass::OutputType; 69 70 /** Evaluate the function at a given position. 71 * A return of 1 means inside or on the surface of the function, 72 * 0 means outside the function 73 * The actual definition of inside/outside is left up to the subclass */ 74 OutputType Evaluate(const InputType & input) const override = 0; 75 76 protected: 77 InteriorExteriorSpatialFunction() = default; 78 ~InteriorExteriorSpatialFunction() override = default; 79 void PrintSelf(std::ostream & os, Indent indent) const override; 80 }; 81 } // end namespace itk 82 83 #ifndef ITK_MANUAL_INSTANTIATION 84 #include "itkInteriorExteriorSpatialFunction.hxx" 85 #endif 86 87 #endif 88