Title: | Constrained Triangulation of Polygons by 'Ear Clipping/Cutting' |
---|---|
Description: | Constrained triangulation of polygons implemented by the 'Mapbox' 'Javascript' library 'earcut'. |
Authors: | Michael Sumner [aut, cre] |
Maintainer: | Michael Sumner <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.1.0 |
Built: | 2024-11-01 11:17:59 UTC |
Source: | https://github.com/hypertidy/rearcut |
Ear cutting for polygons, a method for constrained triangulation.
earcut(x, holes = NULL, ...) ## Default S3 method: earcut(x, holes = NULL, ...)
earcut(x, holes = NULL, ...) ## Default S3 method: earcut(x, holes = NULL, ...)
x |
object to triangulate, any convertible to silicate PATH |
holes |
1-based index indicating where hole/s begin |
... |
arguments passed to methods |
index triplets of triangles from vertex pool
A minimum polygon data set, with a small concavity and a single hole. The data is in 'xy.coords' form, with two columns for 'x_' and 'y_' values, with 'NA' rows separating separate polygon paths. (All but the first path are holes).
plot(minpoly) polypath(minpoly, col = "grey", rule = "evenodd") lines(na.omit(minpoly)) ## see the connection in the sequence nas <- which(is.na(minpoly$x_)) ## this is the "indicate where holes start" convention hole_index <- nas - (seq_along(nas) - 1) minpoly_xy <- na.omit(minpoly) tri_index <- earcut(minpoly_xy, hole_index) rearcut:::plot_tri(minpoly_xy$x_, minpoly_xy$y_, tri_index) rearcut:::plot_tri(minpoly_xy$x_, minpoly_xy$y_, tri_index, col = "firebrick")
plot(minpoly) polypath(minpoly, col = "grey", rule = "evenodd") lines(na.omit(minpoly)) ## see the connection in the sequence nas <- which(is.na(minpoly$x_)) ## this is the "indicate where holes start" convention hole_index <- nas - (seq_along(nas) - 1) minpoly_xy <- na.omit(minpoly) tri_index <- earcut(minpoly_xy, hole_index) rearcut:::plot_tri(minpoly_xy$x_, minpoly_xy$y_, tri_index) rearcut:::plot_tri(minpoly_xy$x_, minpoly_xy$y_, tri_index, col = "firebrick")
A polygon data set with multiple holes. The data is in 'xy.coords' form, with two columns for 'x_' and 'y_' values, with 'NA' rows separating separate polygon paths. (All but the first path are holes).
This shape represents the mainland island of Tasmania with internal holes for inland waters. The coordinates are in Lambert Conformal Conic centred on 136E and 32S, with standard parallels at 17S and 47S. This shape is taken from a broader region where that local projection was suitable. The
plot(taslakes, pch = ".") lines(na.omit(taslakes)) polypath(taslakes, col = "grey") tasnas <- which(is.na(taslakes$x_)) ## this is the "indicate where holes start" convention hole_index <- tasnas - (seq_along(tasnas)-1) taslakes_xy <- na.omit(taslakes) tri_index <- earcut(taslakes_xy, hole_index) rearcut:::plot_tri(taslakes_xy$x_, taslakes_xy$y_, tri_index) rearcut:::plot_tri(taslakes_xy$x_, taslakes_xy$y_, tri_index, col = "grey") ## Not run: library(ggplot2) d <- taslakes_xy[tri_index, ] %>% mutate(g = (row_number() -1) %/% 3 ) %>% group_by(g) ggplot(d, aes(x_, y_, group = g)) + geom_path() ## End(Not run)
plot(taslakes, pch = ".") lines(na.omit(taslakes)) polypath(taslakes, col = "grey") tasnas <- which(is.na(taslakes$x_)) ## this is the "indicate where holes start" convention hole_index <- tasnas - (seq_along(tasnas)-1) taslakes_xy <- na.omit(taslakes) tri_index <- earcut(taslakes_xy, hole_index) rearcut:::plot_tri(taslakes_xy$x_, taslakes_xy$y_, tri_index) rearcut:::plot_tri(taslakes_xy$x_, taslakes_xy$y_, tri_index, col = "grey") ## Not run: library(ggplot2) d <- taslakes_xy[tri_index, ] %>% mutate(g = (row_number() -1) %/% 3 ) %>% group_by(g) ggplot(d, aes(x_, y_, group = g)) + geom_path() ## End(Not run)