Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/shuoli84/poly2tri-rs
Rust port for poly2tri cpp library
https://github.com/shuoli84/poly2tri-rs
Last synced: 3 months ago
JSON representation
Rust port for poly2tri cpp library
- Host: GitHub
- URL: https://github.com/shuoli84/poly2tri-rs
- Owner: shuoli84
- License: apache-2.0
- Created: 2023-03-16T17:31:53.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-03-29T15:09:02.000Z (over 1 year ago)
- Last Synced: 2024-07-17T16:48:39.264Z (4 months ago)
- Language: Rust
- Size: 554 KB
- Stars: 15
- Watchers: 2
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-Apache
Awesome Lists containing this project
- awesome-georust - poly2tri-rs - Calculate CDT (Constrained Delaunay Triangulation) on a polygon. (Watchlist)
README
# poly2tri-rs
An idiomatic and fast(not just because the language) rust porting for `poly2tri` cpp project. It calculates CDT (Constrained Delaunay Triangulation) on a polygon.
# Install
Add following to cargo.toml
```toml
[dependencies]
poly2tri-rs = "0.1"
```Or
```bash
cargo add poly2tri-rs
```# Features
* Multiple hole and steiner points
* Fast
* Test coverage, there are both stable and random tests(prop test). Actually discovered and fixed several bugs from cpp lib.## Performance
Introduced a bunch of perf optimizations to meet the cpp version, without
breaking the type system.Timing at the time of writing on my m1 mbp:
| example | poly2tri-rs | poly2tri (cpp) | point count |
| -------- | ------------ | -------------- | ----------- |
| bird | 0.08ms | 0.17ms | 275 |
| debug | 0.06ms | 0.14ms | 200 |
| nazca_heron | 0.4ms | 0.55ms | 1036 |
| nazca_monkey | 0.52ms | 0.76ms | 1204 |# Limitations
* Only one polyline supported. For multiple polyline, need to preprocess them.
* Duplicate point not supported. (yet)# Examples
## A square with a hole
![Picture](https://raw.githubusercontent.com/shuoli84/assets/main/square_with_hole.svg)
```bash
cargo run --example square && open square_with_hole.svg
```Sample code
``` rust
fn example() {
// randomly generate steinier points (point with no edge)
let mut points = Vec::::new();
for _ in 0..100 {
let x: f64 = rand::thread_rng().gen_range(0.0..800.);
let y: f64 = rand::thread_rng().gen_range(0.0..800.);
points.push(Point::new(x, y));
}// outer square
let builder = SweeperBuilder::new(vec![
Point::new(-10., -10.),
Point::new(810., -10.),
Point::new(810., 810.),
Point::new(-10., 810.),
])
.add_steiner_points(points)
// square hole
.add_hole(vec![
Point::new(400., 400.),
Point::new(600., 400.),
Point::new(600., 600.),
Point::new(400., 600.),
]);// consume builder and grab a sweeper
let sweeper = builder.build();// triangulate with cdt
let triangles = sweeper.triangulate();// draw
draw(triangles, "square_with_hole.svg".into());
}
```## Draw test data from poly2tri's testbed
```bash
# clone repos
git clone [email protected]:jhasse/poly2tri.git
git clone [email protected]:shuoli84/poly2tri-rs.gitcd poly2tri-rs
cargo run --example draw --release -- --path ../poly2tri/testbed/data/funny.dat --output funny.svg# open the svg
open funny.svg
```