--- title: "annulus_demo" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{annulus_demo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width=6, fig.height=6 ) ``` ```{r setup} library(ashapesampler) library(alphahull) library(ggplot2) library(doParallel) library(parallel) cores <- min(2L, detectCores()) ``` In this document, we demonstrate the $\alpha$-shape sampler pipeline by simulating the process of learning a set of two-dimensional shapes (in this case, annuli) and simulating a new shape from that. This vignette requires the packages `alphahull`, `ggplot2`, `parallel`, and `doParallel` in addition to `ashapesampler`. We begin by setting the parameters for our simulation. We will fix $\alpha=0.25$ and $n=100$, and draw 20 shapes for our data set. Our true underlying manifold will be the annulus with outer radius 0.75 and inner radius 0.25. ```{r} set.seed(201723) my_alpha = 0.15 n = 1000 N= 10 r_maj <- 0.75 r_min <- 0.25 ``` Next we will draw the shapes themselves. ```{r} ann_list <- list() complex_list <- list() tau_vec <- vector("numeric", N) for (k in 1:N){ ann_pts <- runif_annulus(n, r_maj, r_min) ann_list[[k]] <- ashape(ann_pts, alpha = my_alpha) complex_list[[k]] <- get_alpha_complex(ann_pts, my_alpha) tau_vec[k] <- tau_bound(ann_list[[k]]$x, complex_list[[k]]) } ``` Now that we have the shapes generated and imported, we want to sample point clouds to combine. We'll choose 2. ```{r} choose_2 <- sample(N,2) point_cloud = rbind(ann_list[[choose_2[1]]]$x, ann_list[[choose_2[[2]]]]$x) ``` Then we will have our $\tau$ bound be a summary statistic of the $\tau$ found for each input shape. Here, we will use mean, but one can tweak this to see different results. Note that if $\tau$ is too small, then the random walk won't be able to execute around the point cloud, but if $\tau$ is too big, then we risk losing geometric and topological information in the reconstruction. ```{r} tau_vec2 = c(tau_vec[choose_2[1]], tau_vec[choose_2[2]]) ``` Now we can take the parameters and generate a new shape and plot it. Here, we assume `k_min=2` as we are in two dimensions. ```{r} new_annulus <- generate_ashape2d(point_cloud, J=2, tau=min(tau_vec2), cores=cores) tri_keep = new_annulus$delvor.obj$tri.obj$trlist[which(new_annulus$delvor.obj$tri.obj$cclist[,3]