Triangle mesh
@examples rgl::rgl.clear() r <- raster::raster(volcano) tm <- triangle_mesh(r) rgl::shade3d(tm, col = viridis::viridis(25)[scales::rescale(tm\(vb[3, tm\)it], c(0, 1))*24 + 1]) rgl::rglwidget()
triangle_mesh <- function(x) {
## POINT interpretation
ex <- raster::extent(x)
ex <- c(raster::xmin(ex), raster::xmax(ex), raster::ymin(ex), raster::ymax(ex)) + c(-1, 1, -1, 1)/2 * c(raster::res(x)[c(1, 1, 2, 2)])
b <- quadmesh::quadmesh(raster::crop(x, raster::extent(x, 1, raster::nrow(x) - 1, 1, raster::ncol(x) - 1)), z = NULL)
b$vb[1:2, ] <- t(coordinates(x))
b$vb[3, ] <- values(x)
b$it <- quadmesh:::triangulate_quads(b$ib)
delete_quads(b)
}
Drop quad or triangle index
@param x
@return @export @aliases delete_triangles @examples
delete_quads <- function(x) {
x$ib <- NULL
x
}
delete_triangles <- function(x) {
x$it <- NULL
x
}
unmeshed quads.
Quads as discrete tiles, from a raster.
@param x a Raster
@return mesh3d @export
@examples rgl::rgl.clear() r <- raster::raster(volcano) qu <- quad_unmeshed(r) rgl::shade3d(qu, col = viridis::viridis(25)[scales::rescale(qu$vb[3, ], c(0, 1))*24 + 1][qu$ib]) rgl::rglwidget()
quad_unmeshed <- function(x) {
z <- values(x)
x <- quadmesh::quadmesh(x, z = NULL)
vb <- ib <- NULL
for (i in 1:ncol(x$ib)) {
quadv <- x$vb[, x$ib[,i]]
quadv[3, ] <- z[i]
vb <- cbind(vb, quadv)
ib <- cbind(ib, 1:4 + (i-1) * 4)
}
x$ib <- ib
x$vb <- vb
x
}
library(raster)
## Loading required package: sp
library(quadmesh)
library(rgl)
## Warning in rgl.init(initValue, onlyNULL): RGL: unable to open X11 display
## Warning: 'rgl_init' failed, running with rgl.useNULL = TRUE
## make a simple raster
r <- aggregate(raster::raster(volcano), fact = 4, fun = median)
## create a quad mesh (corner based, discrete tiles)
qu <- quad_unmeshed(r)
## create a triangle mesh (centre based, continuous triangulated surface)
tm <- triangle_mesh(r)
rgl.clear()
wire3d(tm, col = "red")
wire3d(qu, lwd = 4, col = "black")
aspect3d(1, 1, 1/3)
rglwidget()