# Computational Geometry

This section of the math expressions user guide covers computational geometry functions.

## Convex Hull

A convex hull is the smallest convex set of points that encloses a data set. Math expressions has support for computing the convex hull of a 2D data set. Once a convex hull has been calculated, a set of math expression functions can be applied to geometrically describe the convex hull.

The `convexHull` function finds the convex hull of an observation matrix of 2D vectors. Each row of the matrix is a 2D observation.

In the example below a convex hull is calculated for a randomly generated set of 100 2D observations.

Then the following functions are called on the convex hull:

-`getBaryCenter`: Returns the 2D point that is the bary center of the convex hull.

-`getArea`: Returns the area of the convex hull.

-`getBoundarySize`: Returns the boundary size of the convex hull.

-`getVertices`: Returns a set of 2D points that are the vertices of the convex hull.

``````let(echo="baryCenter, area, boundarySize, vertices",
x=sample(normalDistribution(0, 20), 100),
y=sample(normalDistribution(0, 10), 100),
observations=transpose(matrix(x,y)),
chull=convexHull(observations),
baryCenter=getBaryCenter(chull),
area=getArea(chull),
boundarySize=getBoundarySize(chull),
vertices=getVertices(chull))``````

When this expression is sent to the `/stream` handler it responds with:

``````{
"result-set": {
"docs": [
{
"baryCenter": [
-3.0969292101230343,
1.2160948182691975
],
"area": 3477.480599967595,
"boundarySize": 267.52419019533664,
"vertices": [
[
-66.17632818958485,
-8.394931552315256
],
[
-47.556667594765216,
-16.940434013651263
],
[
-33.13582183446102,
-17.30914425443977
],
[
-9.97459859015698,
-17.795012801599654
],
[
27.7705917246824,
-14.487224686587767
],
[
54.689432954170236,
-1.3333371984299605
],
[
35.97568654458672,
23.054169251772556
],
[
-15.539456215337585,
19.811330468093704
],
[
-17.05125031092752,
19.53581741341663
],
[
-35.92010024412891,
15.126430698395572
]
]
},
{
"EOF": true,
"RESPONSE_TIME": 3
}
]
}
}``````

## Enclosing Disk

The `enclosingDisk` function finds the smallest enclosing circle the encloses a 2D data set. Once an enclosing disk has been calculated, a set of math expression functions can be applied to geometrically describe the enclosing disk.

In the example below an enclosing disk is calculated for a randomly generated set of 1000 2D observations.

Then the following functions are called on the enclosing disk:

-`getCenter`: Returns the 2D point that is the center of the disk.

-`getRadius`: Returns the radius of the disk.

-`getSupportPoints`: Returns the support points of the disk.

``````let(echo="center, radius, support",
x=sample(normalDistribution(0, 20), 1000),
y=sample(normalDistribution(0, 20), 1000),
observations=transpose(matrix(x,y)),
disk=enclosingDisk(observations),
center=getCenter(disk),
radius=getRadius(disk),
support=getSupportPoints(disk))``````

When this expression is sent to the `/stream` handler it responds with:

``````{
"result-set": {
"docs": [
{
"center": [
-6.668825009733749,
-2.9825450908240025
],
"radius": 72.66109546907208,
"support": [
[
20.350992271739464,
64.46791279377014
],
[
33.02079953093981,
57.880978456420365
],
[
-44.7273247899923,
-64.87911518353323
]
]
},
{
"EOF": true,
"RESPONSE_TIME": 8
}
]
}
}``````