# Numeric algorithms and constants module#include "diplib.h" dip::ThinPlateSpline class

Fits a thin plate spline function to a set of points. Useful for interpolation of scattered points.

### Contents

• Reference

This class implements a generalization of the 2D thin plate spline to arbitrary dimensionality. The constructor builds the thin plate spline function, and the `Evaluate` method evaluates this function at a given point.

## Constructors, destructors, assignment and conversion operators

dip::FloatCoordinateArray coordinate, dip::FloatCoordinateArray const& value, dip::dfloat lambda = 0)
Creates a function that maps `coordinate` to `value`.

## Functions

auto Evaluate(dip::FloatArray const& pt) -> dip::FloatArray
Evaluates the thin plate spline function at point `pt`.

## Function documentation

### ThinPlateSpline(dip::FloatCoordinateArray coordinate, dip::FloatCoordinateArray const& value, dip::dfloat lambda = 0)

Creates a function that maps `coordinate` to `value`.

`coordinate` gives the spatial location of samples, and `value` their values. The thin plate spline function therefore maps `coordinate` to `value`. `value[ ii ]` corresponds to `coordinate[ ii ]`, both arrays must have the same number of elements.

This function also expects `coordinate` and `value` to have the same dimensionality. That is, they both represent spatial coordinates in the same image. Internally, the function maps `coordinate` to `value - coordinate`, `Evaluate( pt )` adds `pt` to the interpolated value at `pt`, and thus it looks externally as if the function maps to `value` rather than `value-coordinate`. This improves extrapolation.

To use this class for warping, set `coordinate` to control points in the fixed image, and `value` to corresponding points in the floating image. Then, for each point in the fixed image, `Evaluate` will return the corresponding coordinates in the floating image, which can be used to sample it.

If `lambda` is larger than 0, the mapping is not exact, leading to a smoother function.

When applied with a large coordinates array, this constructor can take quite a long time. It is worth while to split up such a problem into blocks.

The first input argument, `coordinate`, is taken by value and stored inside the object. Use `std::move` to pass this argument if you no longer use it later.