Skip to contents

Computes a refined constrained Delaunay triangulation on R2 or S2.



  loc = NULL,
  tv = NULL,
  boundary = NULL,
  interior = NULL,
  extend = (missing(tv) || is.null(tv)),
  refine = FALSE,
  lattice = NULL,
  globe = NULL,
  cutoff = 1e-12,
  quality.spec = NULL,
  crs = NULL,

fm_delaunay_2d(loc, crs = NULL, ...)



Currently passed on to fm_mesh_2d_inla or converted to fmesher_rcdt() options.


Input coordinates that should be part of the mesh. Can be a matrix, sf, sfc, SpatialPoints, or other object supported by fm_unify_coords().


Initial triangulation, as a N-by-3 index vector into loc

boundary, interior

Objects supported by fm_as_segm(). If boundary is numeric, fm_nonconvex_hull(loc, convex = boundary) is used.


logical or list specifying whether to extend the data region, with parameters


the number of edges in the extended boundary (default=16)


the extension distance. If negative, interpreted as a factor relative to the approximate data diameter (default=-0.10)

Setting to FALSE is only useful in combination lattice or boundary.


logical or list specifying whether to refine the triangulation, with parameters


the minimum allowed interior angle in any triangle. The algorithm is guaranteed to converge for min.angle at most 21 (default=21)


the maximum allowed edge length in any triangle. If negative, interpreted as a relative factor in an ad hoc formula depending on the data density (default=Inf)


the maximum number of vertices allowed, overriding min.angle and max.edge (default=-1, meaning no limit)


the maximum number of vertices allowed, overriding max.edge only (default=-1, meaning no limit)


An fm_lattice_2d object, generated by fm_lattice_2d(), specifying points on a regular lattice.


If non-NULL, an integer specifying the level of subdivision for global mesh points, used with fmesher_globe_points()


The minimum allowed distance between points. Point at most as far apart as this are replaced by a single vertex prior to the mesh refinement step.


List of vectors of per vertex max.edge target specification for each location in loc, boundary/interior (segm), and lattice. Only used if refining the mesh.


Optional crs object


An fm_mesh_2d object


  • fm_rcdt_2d_inla(): Legacy method for the INLA::inla.mesh.create() interface

  • fm_delaunay_2d(): Construct a plain Delaunay triangulation.

INLA compatibility

For mesh and curve creation, the fm_rcdt_2d_inla(), fm_mesh_2d_inla(), and fm_nonconvex_hull_inla() methods will keep the interface syntax used by INLA::inla.mesh.create(), INLA::inla.mesh.2d(), and INLA::inla.nonconvex.hull() functions, respectively, whereas the fm_rcdt_2d(), fm_mesh_2d(), and fm_nonconvex_hull() interfaces may be different, and potentially change in the future.


(m <- fm_rcdt_2d_inla(
  boundary = fm_nonconvex_hull(cbind(0, 0), convex = 5)
#> fm_mesh_2d object:
#>   Manifold:	R2
#>   V / E / T:	16 / 29 / 14
#>   Euler char.:	1
#>   Constraints:	16 boundary edges (1 group: 1), 0 boundary edges
#>   Bounding box: (-4.999623, 4.999623) x (-4.999623, 4.999623)
#>   Basis d.o.f.:	16

fm_delaunay_2d(matrix(rnorm(30), 15, 2))
#> fm_mesh_2d object:
#>   Manifold:	R2
#>   V / E / T:	15 / 35 / 21
#>   Euler char.:	1
#>   Constraints:	7 boundary edges (1 group: 1), 0 boundary edges
#>   Bounding box: (-1.116393, 1.654247) x (-1.706687, 3.480540)
#>   Basis d.o.f.:	15