blob: e44c08e2fa69fda46cff1e0aa44f5324ff25634b [file] [log] [blame]
= Computational Geometry
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
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.
[source,text]
----
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:
[source,json]
----
{
"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.
[source,text]
----
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:
[source,json]
----
{
"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
}
]
}
}
----