Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mapbox/concaveman
A very fast 2D concave hull algorithm in JavaScript
https://github.com/mapbox/concaveman
Last synced: 8 days ago
JSON representation
A very fast 2D concave hull algorithm in JavaScript
- Host: GitHub
- URL: https://github.com/mapbox/concaveman
- Owner: mapbox
- License: isc
- Created: 2016-02-10T11:30:34.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2022-06-07T01:49:09.000Z (over 2 years ago)
- Last Synced: 2024-05-17T02:42:12.996Z (6 months ago)
- Language: JavaScript
- Homepage:
- Size: 80.1 KB
- Stars: 636
- Watchers: 118
- Forks: 82
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## concaveman
A very fast **2D concave hull** algorithm in JavaScript (generates a general outline of a point set).
[![Build Status](https://travis-ci.org/mapbox/concaveman.svg?branch=master)](https://travis-ci.org/mapbox/concaveman)
[![Coverage Status](https://coveralls.io/repos/github/mapbox/concaveman/badge.svg?branch=master)](https://coveralls.io/github/mapbox/concaveman?branch=master)
[![](https://img.shields.io/badge/simply-awesome-brightgreen.svg)](https://github.com/mourner/projects)### Usage
```js
var points = [[10, 20], [30, 12.5], ...];
var polygon = concaveman(points);
```Signature: `concaveman(points[, concavity = 2, lengthThreshold = 0])`
- `points` is an array of `[x, y]` points.
- `concavity` is a relative measure of concavity. `1` results in a relatively detailed shape, `Infinity` results in a convex hull.
You can use values lower than `1`, but they can produce pretty crazy shapes.
- `lengthThreshold`: when a segment length is under this threshold, it stops being considered for further detalization.
Higher values result in simpler shapes.### Algorithm
The algorithm is based on ideas from the paper [A New Concave Hull Algorithm and Concaveness Measure
for n-dimensional Datasets, 2012](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.676.6258&rep=rep1&type=pdf)
by Jin-Seo Park and Se-Jong Oh.This implementation dramatically improves performance over the one stated in the paper
(`O(rn)`, where `r` is a number of output points, to `O(n log n)`)
by introducing a fast _k nearest points to a segment_ algorithm,
a modification of a depth-first kNN R-tree search using a priority queue.### TypeScript
[TypeScript type definitions](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/concaveman)
are available through `npm install --save @types/concaveman`.### Dependencies
- [monotone-convex-hull-2d](https://github.com/mikolalysenko/monotone-convex-hull-2d) for the convex hull algorithm
- [rbush](https://github.com/mourner/rbush) for point indexing
- [tinyqueue](https://github.com/mourner/tinyqueue) as a priority queue
- [point-in-polygon](https://github.com/substack/point-in-polygon) for point in polygon queries
- [robust-orientation](https://github.com/mikolalysenko/robust-orientation) for 3-point orientation tests### C++ Port
In 2019, a [C++ port](https://github.com/sadaszewski/concaveman-cpp) has been created, allowing for efficient usage from C/C++, Python (via cffi) and other languages featuring an FFI and/or plug-in mechanism for C (e.g. a MATLAB MEX file should be easy to prepare).