Loading...
Searching...
No Matches
itkBSplineKernelFunction2.h
Go to the documentation of this file.
/*=========================================================================
*
* Copyright UMC Utrecht and contributors
*
* 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
*
* http://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.
*
*=========================================================================*/
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkBSplineKernelFunction.h,v $
Date: $Date: 2006-03-18 20:13:35 $
Version: $Revision: 1.7 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 notices for more information.
=========================================================================*/
#ifndef itkBSplineKernelFunction2_h
#define itkBSplineKernelFunction2_h
#include "itkKernelFunctionBase2.h"
#include <vnl/vnl_math.h>
namespace itk
{
template <unsigned int VSplineOrder = 3>
class ITK_TEMPLATE_EXPORT BSplineKernelFunction2 : public KernelFunctionBase2<double>
{
public:
ITK_DISALLOW_COPY_AND_MOVE(BSplineKernelFunction2);
using Self = BSplineKernelFunction2;
using Superclass = KernelFunctionBase2<double>;
using Pointer = SmartPointer<Self>;
itkNewMacro(Self);
itkTypeMacro(BSplineKernelFunction2, KernelFunctionBase2);
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder);
using WeightArrayType = FixedArray<double, VSplineOrder + 1>;
static double
FastEvaluate(const double u)
{
return Self::Evaluate(Dispatch<VSplineOrder>(), u);
}
static void
FastEvaluate(const double u, double * const weights)
{
Self::Evaluate(Dispatch<VSplineOrder>(), u, weights);
}
double
Evaluate(const double & u) const override
{
return Self::FastEvaluate(u);
}
void
Evaluate(const double & u, double * weights) const override
{
Self::FastEvaluate(u, weights);
}
protected:
BSplineKernelFunction2() = default;
~BSplineKernelFunction2() override = default;
void
PrintSelf(std::ostream & os, Indent indent) const override
{
Superclass::PrintSelf(os, indent);
os << indent << "Spline Order: " << SplineOrder << std::endl;
}
private:
template <unsigned int>
struct ITK_TEMPLATE_EXPORT Dispatch
{};
static double
Evaluate(const Dispatch<0> &, const double u)
{
const double absValue = std::abs(u);
if (absValue < 0.5)
{
return 1.0;
}
else if (absValue == 0.5)
{
return 0.5;
}
else
{
return 0.0;
}
}
static double
Evaluate(const Dispatch<1> &, const double u)
{
const double absValue = std::abs(u);
if (absValue < 1.0)
{
return 1.0 - absValue;
}
else
{
return 0.0;
}
}
static double
Evaluate(const Dispatch<2> &, const double u)
{
const double absValue = std::abs(u);
if (absValue < 0.5)
{
return 0.75 - absValue * absValue;
}
else if (absValue < 1.5)
{
return (9.0 - 12.0 * absValue + 4.0 * absValue * absValue) / 8.0;
}
else
{
return 0.0;
}
}
static double
Evaluate(const Dispatch<3> &, const double u)
{
const double absValue = std::abs(u);
const double sqrValue = u * u;
if (absValue < 1.0)
{
return (4.0 - 6.0 * sqrValue + 3.0 * sqrValue * absValue) / 6.0;
}
else if (absValue < 2.0)
{
return (8.0 - 12.0 * absValue + 6.0 * sqrValue - sqrValue * absValue) / 6.0;
}
else
{
return 0.0;
}
}
static void
Evaluate(const Dispatch<0> &, const double u, double * weights)
{
const double absValue = std::abs(u);
if (absValue < 0.5)
{
weights[0] = 1.0;
}
else if (absValue == 0.5)
{
weights[0] = 0.5;
}
else
{
weights[0] = 0.0;
}
}
static void
Evaluate(const Dispatch<1> &, const double u, double * weights)
{
const double absValue = std::abs(u);
weights[0] = 1.0 - absValue;
weights[1] = absValue;
}
static void
Evaluate(const Dispatch<2> &, const double u, double * weights)
{
const double absValue = std::abs(u);
const double sqrValue = u * u;
weights[0] = (9.0 - 12.0 * absValue + 4.0 * sqrValue) / 8.0;
weights[1] = -0.25 + 2.0 * absValue - sqrValue;
weights[2] = (1.0 - 4.0 * absValue + 4.0 * sqrValue) / 8.0;
}
static void
Evaluate(const Dispatch<3> &, const double u, double * weights)
{
const double absValue = std::abs(u);
const double sqrValue = u * u;
const double uuu = sqrValue * absValue;
// Use (numerically) slightly less accurate multiplication with 1/6
// instead of division by 6 to substantially improve speed.
static const double onesixth = 1.0 / 6.0;
weights[0] = (8.0 - 12.0 * absValue + 6.0 * sqrValue - uuu) * onesixth;
weights[1] = (-5.0 + 21.0 * absValue - 15.0 * sqrValue + 3.0 * uuu) * onesixth;
weights[2] = (4.0 - 12.0 * absValue + 12.0 * sqrValue - 3.0 * uuu) * onesixth;
weights[3] = (-1.0 + 3.0 * absValue - 3.0 * sqrValue + uuu) * onesixth;
}
};
} // end namespace itk
#endif
itk::BSplineKernelFunction2< VSplineOrder >::WeightArrayType
FixedArray< double, VSplineOrder+1 > WeightArrayType
Definition itkBSplineKernelFunction2.h:78
itk::BSplineKernelFunction2::~BSplineKernelFunction2
~BSplineKernelFunction2() override=default
itk::BSplineKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 2 > &, const double u, double *weights)
Definition itkBSplineKernelFunction2.h:258
itk::BSplineKernelFunction2::Evaluate
void Evaluate(const double &u, double *weights) const override
Definition itkBSplineKernelFunction2.h:111
itk::BSplineKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 1 > &, const double u, double *weights)
Definition itkBSplineKernelFunction2.h:247
itk::BSplineKernelFunction2::PrintSelf
void PrintSelf(std::ostream &os, Indent indent) const override
Definition itkBSplineKernelFunction2.h:122
itk::BSplineKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 1 > &, const double u)
Definition itkBSplineKernelFunction2.h:162
itk::BSplineKernelFunction2::FastEvaluate
static void FastEvaluate(const double u, double *const weights)
Definition itkBSplineKernelFunction2.h:93
itk::BSplineKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 0 > &, const double u)
Definition itkBSplineKernelFunction2.h:141
itk::BSplineKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 3 > &, const double u, double *weights)
Definition itkBSplineKernelFunction2.h:271
itk::BSplineKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 0 > &, const double u, double *weights)
Definition itkBSplineKernelFunction2.h:226
itk::BSplineKernelFunction2< VSplineOrder >::Self
BSplineKernelFunction2 Self
Definition itkBSplineKernelFunction2.h:64
itk::BSplineKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 3 > &, const double u)
Definition itkBSplineKernelFunction2.h:200
itk::BSplineKernelFunction2::BSplineKernelFunction2
BSplineKernelFunction2()=default
itk::BSplineKernelFunction2::ITK_DISALLOW_COPY_AND_MOVE
ITK_DISALLOW_COPY_AND_MOVE(BSplineKernelFunction2)
itk::BSplineKernelFunction2< VSplineOrder >::Superclass
KernelFunctionBase2< double > Superclass
Definition itkBSplineKernelFunction2.h:65
itk::BSplineKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 2 > &, const double u)
Definition itkBSplineKernelFunction2.h:179
itk::BSplineKernelFunction2::itkStaticConstMacro
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder)
itk::BSplineKernelFunction2::FastEvaluate
static double FastEvaluate(const double u)
Definition itkBSplineKernelFunction2.h:83
itk::BSplineKernelFunction2::Evaluate
double Evaluate(const double &u) const override
Definition itkBSplineKernelFunction2.h:101
itk::BSplineKernelFunction2< VSplineOrder >::Pointer
SmartPointer< Self > Pointer
Definition itkBSplineKernelFunction2.h:66
itk::KernelFunctionBase2< double >::KernelFunctionBase2
KernelFunctionBase2()=default
itkKernelFunctionBase2.h
itk
Definition itkAdvancedImageToImageMetric.h:43

Generated on 1768596610 for elastix by 1.15.0 |