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()