# 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.

-getSupportPoints: Returns the support points of the disk.

x=sample(normalDistribution(0, 20), 1000),
y=sample(normalDistribution(0, 20), 1000),
observations=transpose(matrix(x,y)),
disk=enclosingDisk(observations),
center=getCenter(disk),
support=getSupportPoints(disk))

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

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