https://github.com/luciopaiva/graham-scan
A JavaScript implementation of the Graham scan algorithm for finding the convex hull of a set of points.
https://github.com/luciopaiva/graham-scan
Last synced: 7 months ago
JSON representation
A JavaScript implementation of the Graham scan algorithm for finding the convex hull of a set of points.
- Host: GitHub
- URL: https://github.com/luciopaiva/graham-scan
- Owner: luciopaiva
- License: mit
- Created: 2020-03-18T14:59:23.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-06-16T10:58:00.000Z (over 1 year ago)
- Last Synced: 2025-03-18T04:42:51.867Z (7 months ago)
- Language: JavaScript
- Size: 194 KB
- Stars: 8
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Graham scan
[](https://travis-ci.com/luciopaiva/graham-scan) [](https://codecov.io/gh/luciopaiva/graham-scan)
A JavaScript implementation of the [Graham scan](https://en.wikipedia.org/wiki/Graham_scan) algorithm for finding the convex hull of a set of points.
## Installation
npm i @lucio/graham-scan
## Usage
```javascript
const grahamScan = new GrahamScan();
grahamScan.setPoints([[1,0], [0,1], [2,1], [1,0.5]]);
const hull = grahamScan.getHull(); // [1,0], [2,1], [0,1]
```### API
#### `new GrahamScan()`
Creates a new instance of the algorithm, meant to be reusable.
```javascript
const grahamScan = new GrahamScan();
```#### `grahamScan.addPoint(point)`
Adds a point to the set. The point must be an array of two numbers: the x and y coordinates.
```javascript
const grahamScan = new GrahamScan();
grahamScan.addPoint([10, 20]);
```#### `grahamScan.clear()`
Clear the underlying array of points.
```javascript
const grahamScan = new GrahamScan();
grahamScan.addPoint([10, 20]);
grahamScan.clear();
```#### `grahamScan.getHull()`
Computes the convex hull. Returns a new array containing all the hull vertices, starting from the one with the lowest y value (in case there are multiple ones, it will be the one with the lowest x as well) and going in counter-clockwise direction.
```javascript
const grahamScan = new GrahamScan();
grahamScan.setPoints([[1,0], [0,1], [2,1], [1,0.5]]);
const hull = grahamScan.getHull(); // [1,0], [2,1], [0,1]
```#### `grahamScan.getPoints()`
Returns a reference to the underlying array containing all the points.
```javascript
const grahamScan = new GrahamScan();
grahamScan.addPoint([10, 20]);
grahamScan.addPoint([30, 40]);
grahamScan.getPoints(); // [10, 20], [30, 40]
```#### `grahamScan.setPoints(points)`
Replace the underlying array with the given one.
```javascript
const grahamScan = new GrahamScan();
grahamScan.setPoints([[10, 20], [30, 40]]);
```## Contributing
git clone git@github.com:luciopaiva/graham-scan.git
cd graham-scan
nvm install
npm install## Tests
npm test
## FAQ
### Is this the fastest way to build a convex hull?
No. Graham scan runs in O(n log n), where n is the total number of points in the set. [Chan's algorithm](https://en.wikipedia.org/wiki/Chan%27s_algorithm) does a bit better, O(n log h), where h is the number of vertices composing the final hull.
It is still much better than Jarvis march, though, which runs in O(nh).
### Why use the .mjs extension?
Node.js projects that use this library by directly copying the script file instead of installing it via npm would need to add `type: module` to `package.json`, which may be undesired.