test_that("Flat CDT works", {
max.edge0 <- 0.25
min.angle0 <- 21
mesh <- fm_rcdt_2d_inla(cbind(0, 0),
extend = list(offset = 1, n = 16),
refine = list(max.edge = max.edge0, min.angle = min.angle0)
)
# expect_equal(fm_dof(mesh), 135) # 138 on M1?
expect_equal(fm_diameter(mesh), 2.039182, tolerance = midtol)
expect_equal(fm_manifold(mesh), "R2")
expect_equal(fm_manifold_type(mesh), "R")
expect_equal(fm_manifold_dim(mesh), 2)
expect_equal(fm_manifold(mesh, "R"), TRUE)
expect_equal(fm_manifold(mesh, "2"), TRUE)
expect_equal(fm_manifold(mesh, "R2"), TRUE)
expect_equal(fm_manifold(mesh, "S"), FALSE)
expect_equal(fm_manifold(mesh, "1"), FALSE)
expect_equal(fm_manifold(mesh, "S1"), FALSE)
# Check issue #16, where it ignored all but the first type option:
expect_equal(fm_manifold(mesh, c("R", "S")), TRUE)
expect_equal(fm_manifold(mesh, c("S", "R")), TRUE)
edges <- list(
mesh$loc[mesh$graph$tv[, 2], ] - mesh$loc[mesh$graph$tv[, 1], ],
mesh$loc[mesh$graph$tv[, 3], ] - mesh$loc[mesh$graph$tv[, 2], ],
mesh$loc[mesh$graph$tv[, 1], ] - mesh$loc[mesh$graph$tv[, 3], ]
)
min.angle <-
180 / pi * min(acos(pmin(1, pmax(
-1, c(
-rowSums(edges[[1]] * edges[[2]]) /
(rowSums(edges[[1]]^2)^0.5 * rowSums(edges[[2]]^2)^0.5),
-rowSums(edges[[2]] * edges[[3]]) /
(rowSums(edges[[2]]^2)^0.5 * rowSums(edges[[3]]^2)^0.5),
-rowSums(edges[[3]] * edges[[1]]) /
(rowSums(edges[[3]]^2)^0.5 * rowSums(edges[[1]]^2)^0.5)
)
))))
max.edge <- max(rowSums(do.call(rbind, edges)^2)^0.5)
expect_lte(max.edge, max.edge0 + lowtol)
expect_gte(min.angle, min.angle0 - lowtol)
})
test_that("Spherical CDT works", {
max.edge0 <- 0.5
mesh <- fm_rcdt_2d_inla(globe = 1, refine = list(max.edge = max.edge0))
# expect_equal(fm_dof(mesh), 108) # 106 or 107 on M1?
expect_equal(fm_diameter(mesh), pi)
expect_equal(fm_manifold(mesh), "S2")
expect_equal(fm_manifold_type(mesh), "S")
expect_equal(fm_manifold_dim(mesh), 2)
expect_equal(fm_manifold(mesh, "S"), TRUE)
expect_equal(fm_manifold(mesh, "2"), TRUE)
expect_equal(fm_manifold(mesh, "S2"), TRUE)
expect_equal(fm_manifold(mesh, "R"), FALSE)
expect_equal(fm_manifold(mesh, "1"), FALSE)
expect_equal(fm_manifold(mesh, "R1"), FALSE)
edges <- list(
mesh$loc[mesh$graph$tv[, 2], ] - mesh$loc[mesh$graph$tv[, 1], ],
mesh$loc[mesh$graph$tv[, 3], ] - mesh$loc[mesh$graph$tv[, 2], ],
mesh$loc[mesh$graph$tv[, 1], ] - mesh$loc[mesh$graph$tv[, 3], ]
)
sums <- list(
mesh$loc[mesh$graph$tv[, 2], ] + mesh$loc[mesh$graph$tv[, 1], ],
mesh$loc[mesh$graph$tv[, 3], ] + mesh$loc[mesh$graph$tv[, 2], ],
mesh$loc[mesh$graph$tv[, 1], ] + mesh$loc[mesh$graph$tv[, 3], ]
)
euc_len <- rowSums(do.call(rbind, edges)^2)^0.5
sum_len <- rowSums(do.call(rbind, sums)^2)^0.5
len <- 2 * atan2(euc_len, sum_len)
max.edge <- max(len)
expect_lte(max.edge, max.edge0 + lowtol)
})
test_that("fm_lattice_2d ordering", {
latt1 <- fm_lattice_2d(1:4, 1:3)
latt2 <- fm_lattice_2d(rev(1:4), 1:3)
expect_equal(latt1$x, latt2$x)
expect_equal(latt1$y, latt2$y)
expect_equal(latt1$loc, latt2$loc)
})
test_that("interior should be single object", {
# create boundary polygon
bnd <- sf::st_sfc(sf::st_polygon(list(as.matrix(
data.frame(x = c(0, 0, 10, 10, 0), y = c(0, 10, 10, 0, 0))
))))
# create interior polygon
interior <- sf::st_sfc(sf::st_polygon(list(as.matrix(
data.frame(x = c(3, 3, 7, 7, 3), y = c(0, 5, 5, 0, 0))
))))
# simple mesh
expect_error(fm_mesh_2d_inla(boundary = bnd, max.edge = 1), NA)
# with interior
expect_error(
fm_mesh_2d_inla(
boundary = bnd,
interior = interior,
max.edge = 1
),
NA
)
# extended boundary
expect_error(fm_mesh_2d_inla(boundary = bnd, max.edge = c(1, 2)), NA)
# or extended by running non-convex for the boundary
expect_error(fm_mesh_2d_inla(
boundary = list(bnd, fm_nonconvex_hull(bnd)),
max.edge = 1
), NA)
# combining extended and interior segment should not fail
expect_error(
fm_mesh_2d_inla(boundary = bnd, interior = interior, max.edge = c(1, 2)),
NA
)
expect_error(
fm_mesh_2d_inla(
boundary = list(bnd, fm_nonconvex_hull(bnd)),
interior = interior, max.edge = 1
),
NA
)
# List interior supported from 0.2.0.9016
expect_error(
fm_mesh_2d_inla(
boundary = bnd,
interior = list(interior),
max.edge = c(1, 2)
),
NA
)
expect_error(
fm_mesh_2d_inla(
boundary = list(bnd, fm_nonconvex_hull(bnd)),
interior = list(interior), max.edge = 1
),
NA
)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.