# Surface Centers

These routines compute geometric centers of point sets and distrubtions on surfaces.

A “center” $c$ is a point on the surface which is a local minimum of the energy: $$c = \underset{m}{\textrm{argmin}}\sum_{y \in \mathcal{Y}} d(m,y)^p$$ where $\mathcal{Y}$ is a set of sites to take the average of and $d(\cdot, \cdot)$ denotes the geodesic distance.

Centers on surfaces with $p=2$ (“means”) are known as Karcher Means or Frechet Means. Centers on surfaces with $p=1$ (“medians”) are known as geometric medians.

Centers are not unique!

In general, there will not be a single unqiue “center” of a point set or distribution on a surface. For nearby sites there may be a single center, but in general this may not be the case.

The routines in this section use random initialization to report a center. As such, the results may be different under repeated runs of the procedure.

#include "geometrycentral/surface/surface_centers.h"

## Centers of points

SurfacePoint findCenter(IntrinsicGeometryInterface& geom, const std::vector<Vertex>& vertexPts, int p = 2)

Find a center of a collection of points at vertices.

p must be either $1$ or $2$.

SurfacePoint findCenter(IntrinsicGeometryInterface& geom, VectorHeatMethodSolver& solver, const std::vector<Vertex>& vertexPts, int p = 2)

Like the above method, but uses an existing solver object, which saves precomputation.

## Centers of distributions

SurfacePoint findCenter(IntrinsicGeometryInterface& geom, const VertexData<double>& distribution, int p = 2)

Find a center of a distribution at vertices.

Note that the input distribution is treated as integrated values at vertices. If your distribution is “per-unit-area”, you should multiply times vertex area before passing it in.

p must be either $1$ or $2$.

SurfacePoint findCenter(IntrinsicGeometryInterface& geom, VectorHeatMethodSolver& solver, const VertexData<double>& distribution, int p = 2)

Like the above method, but uses an existing solver object, which saves precomputation.

## Citation

These algorithms are described in The Vector Heat Method, the appropriate citation is:

@article{sharp2019vector,
title={The Vector Heat Method},
author={Sharp, Nicholas and Soliman, Yousuf and Crane, Keenan},
journal={ACM Transactions on Graphics (TOG)},
volume={38},
number={3},
pages={24},
year={2019},
publisher={ACM}
}