# ThinPlateSpline class

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

### Contents

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

- ThinPlateSpline(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.