Loading...
Searching...
No Matches
itkBSplineDerivativeKernelFunction2.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: itkBSplineDerivativeKernelFunction2.h,v $
Date: $Date: 2008-06-25 11:00:19 $
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 itkBSplineDerivativeKernelFunction2_h
#define itkBSplineDerivativeKernelFunction2_h
#include "itkKernelFunctionBase2.h"
#include <vnl/vnl_math.h>
namespace itk
{
template <unsigned int VSplineOrder = 3>
class ITK_TEMPLATE_EXPORT BSplineDerivativeKernelFunction2 : public KernelFunctionBase2<double>
{
public:
ITK_DISALLOW_COPY_AND_MOVE(BSplineDerivativeKernelFunction2);
using Self = BSplineDerivativeKernelFunction2;
using Superclass = KernelFunctionBase2<double>;
using Pointer = SmartPointer<Self>;
itkNewMacro(Self);
itkTypeMacro(BSplineDerivativeKernelFunction2, KernelFunctionBase2);
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder);
static double
FastEvaluate(const double u)
{
return Self::Evaluate(Dispatch<VSplineOrder>(), u);
}
static void
FastEvaluate(const double u, double * const weights)
{
return 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
{
return Self::FastEvaluate(u, weights);
}
protected:
BSplineDerivativeKernelFunction2() = default;
~BSplineDerivativeKernelFunction2() 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
{};
// Derivative not defined.
static double
Evaluate(const Dispatch<1> &, const double u)
{
const double absValue = std::abs(u);
if (absValue < 1.0)
{
return -vnl_math::sgn(u);
}
else if (absValue == 1.0)
{
return -vnl_math::sgn(u) / 2.0;
}
else
{
return 0.0;
}
}
static void
Evaluate(const Dispatch<1> &, const double u, double * weights)
{
// MS \todo: check
const double absValue = std::abs(u);
if (absValue < 1.0 && absValue > 0.0)
{
weights[0] = -1.0;
weights[1] = 1.0;
}
else if (absValue == 1)
{
weights[0] = -0.5;
weights[1] = 0.0;
}
else
{
weights[0] = 0.0;
weights[1] = 0.5;
}
}
static double
Evaluate(const Dispatch<2> &, const double u)
{
double absValue = std::abs(u);
if (absValue < 0.5)
{
return -2.0 * u;
}
else if (absValue < 1.5)
{
return u - 1.5 * vnl_math::sgn(u);
}
else
{
return 0.0;
}
}
static void
Evaluate(const Dispatch<2> &, const double u, double * weights)
{
// MS \todo: check
weights[0] = u - 1.5;
weights[1] = -2.0 * u + 2.0;
weights[2] = u - 0.5;
}
static double
Evaluate(const Dispatch<3> &, const double u)
{
const double absValue = std::abs(u);
const double sqrValue = u * u;
if (absValue < 1.0)
{
if (u > 0.0)
{
const double dummy = std::abs(u + 0.5);
return (6.0 * sqrValue - 2.0 * u - 6.0 * dummy + 3.0) / 4.0;
}
else
{
const double dummy = std::abs(u - 0.5);
return -(6.0 * sqrValue + 2.0 * u - 6.0 * dummy + 3.0) / 4.0;
}
}
else if (absValue < 2.0)
{
if (u > 0.0)
{
const double dummy = std::abs(u - 0.5);
return (u - sqrValue + 3.0 * dummy - 2.5) / 2.0;
}
else
{
const double dummy = std::abs(u + 0.5);
return (u + sqrValue - 3.0 * dummy + 2.5) / 2.0;
}
}
else
{
return 0.0;
}
}
static void
Evaluate(const Dispatch<3> &, const double u, double * weights)
{
const double absValue = std::abs(u);
const double sqrValue = u * u;
weights[0] = 0.5 * sqrValue - 2.0 * absValue + 2.0;
weights[1] = -1.5 * sqrValue + 5.0 * absValue - 3.5;
weights[2] = 1.5 * sqrValue - 4.0 * absValue + 2.0;
weights[3] = -0.5 * sqrValue + absValue - 0.5;
}
};
} // end namespace itk
#endif
itk::BSplineDerivativeKernelFunction2< VSplineOrder >::Superclass
KernelFunctionBase2< double > Superclass
Definition itkBSplineDerivativeKernelFunction2.h:65
itk::BSplineDerivativeKernelFunction2::Evaluate
void Evaluate(const double &u, double *weights) const override
Definition itkBSplineDerivativeKernelFunction2.h:105
itk::BSplineDerivativeKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 2 > &, const double u, double *weights)
Definition itkBSplineDerivativeKernelFunction2.h:199
itk::BSplineDerivativeKernelFunction2::PrintSelf
void PrintSelf(std::ostream &os, Indent indent) const override
Definition itkBSplineDerivativeKernelFunction2.h:116
itk::BSplineDerivativeKernelFunction2< VSplineOrder >::Self
BSplineDerivativeKernelFunction2 Self
Definition itkBSplineDerivativeKernelFunction2.h:64
itk::BSplineDerivativeKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 3 > &, const double u)
Definition itkBSplineDerivativeKernelFunction2.h:210
itk::BSplineDerivativeKernelFunction2::~BSplineDerivativeKernelFunction2
~BSplineDerivativeKernelFunction2() override=default
itk::BSplineDerivativeKernelFunction2::FastEvaluate
static double FastEvaluate(const double u)
Definition itkBSplineDerivativeKernelFunction2.h:80
itk::BSplineDerivativeKernelFunction2< VSplineOrder >::Pointer
SmartPointer< Self > Pointer
Definition itkBSplineDerivativeKernelFunction2.h:66
itk::BSplineDerivativeKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 2 > &, const double u)
Definition itkBSplineDerivativeKernelFunction2.h:179
itk::BSplineDerivativeKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 1 > &, const double u, double *weights)
Definition itkBSplineDerivativeKernelFunction2.h:154
itk::BSplineDerivativeKernelFunction2::BSplineDerivativeKernelFunction2
BSplineDerivativeKernelFunction2()=default
itk::BSplineDerivativeKernelFunction2::Evaluate
static double Evaluate(const Dispatch< 1 > &, const double u)
Definition itkBSplineDerivativeKernelFunction2.h:134
itk::BSplineDerivativeKernelFunction2::Evaluate
double Evaluate(const double &u) const override
Definition itkBSplineDerivativeKernelFunction2.h:97
itk::BSplineDerivativeKernelFunction2::FastEvaluate
static void FastEvaluate(const double u, double *const weights)
Definition itkBSplineDerivativeKernelFunction2.h:89
itk::BSplineDerivativeKernelFunction2::Evaluate
static void Evaluate(const Dispatch< 3 > &, const double u, double *weights)
Definition itkBSplineDerivativeKernelFunction2.h:249
itk::BSplineDerivativeKernelFunction2::ITK_DISALLOW_COPY_AND_MOVE
ITK_DISALLOW_COPY_AND_MOVE(BSplineDerivativeKernelFunction2)
itk::BSplineDerivativeKernelFunction2::itkStaticConstMacro
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder)
itk::KernelFunctionBase2< double >::KernelFunctionBase2
KernelFunctionBase2()=default
itkKernelFunctionBase2.h
itk
Definition itkAdvancedImageToImageMetric.h:43

Generated on 1768596610 for elastix by 1.15.0 |