## ----include = FALSE---------------------------------------------------------- knitr::opts_knit$set(purl = FALSE) ggwebgl_truthy <- function(x) { tolower(x) %in% c("1", "true", "yes", "y") } ggwebgl_ci_vars <- c( "CI", "GITHUB_ACTIONS", "GITLAB_CI", "BUILDKITE", "TRAVIS", "APPVEYOR", "CIRCLECI", "JENKINS_URL" ) ggwebgl_is_ci <- any(vapply(Sys.getenv(ggwebgl_ci_vars), ggwebgl_truthy, logical(1))) ggwebgl_is_check <- nzchar(Sys.getenv("_R_CHECK_PACKAGE_NAME_")) ggwebgl_eval_code <- !ggwebgl_is_ci && !ggwebgl_is_check && ( ggwebgl_truthy(Sys.getenv("NOT_CRAN")) || ggwebgl_truthy(Sys.getenv("GGWEBGL_EVAL_COVERAGE_VIGNETTE")) ) ggwebgl_eval_widgets <- ggwebgl_eval_code && ggwebgl_truthy(Sys.getenv("GGWEBGL_EVAL_LIVE_WIDGETS")) knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = ggwebgl_eval_code) if (file.exists("../DESCRIPTION") && requireNamespace("pkgload", quietly = TRUE)) { pkgload::load_all("..", export_all = FALSE, helpers = FALSE, quiet = TRUE) } else { library(ggWebGL) } boids4r_available <- requireNamespace("boids4R", quietly = TRUE) ## ----eval = ggwebgl_eval_code------------------------------------------------- # if (!boids4r_available) { # cat("boids4R is unavailable, so live custom corridor widgets are skipped.\n") # } else if (!ggwebgl_eval_widgets) { # cat("boids4R is available, but live custom corridor widgets are skipped because live widget evaluation is disabled.\n") # } else { # cat("boids4R is available; live custom corridor widgets will be rendered below.\n") # } ## ----include = FALSE, eval = ggwebgl_eval_code-------------------------------- # simulate_custom_corridor <- function(stronger_avoidance = FALSE, seed = 221L) { # bounds <- matrix( # c(-2.4, -1.35, 2.4, 1.35), # ncol = 2, # dimnames = list(c("x", "y"), c("min", "max")) # ) # # n_school <- 96L # n_scout <- 32L # n_boids <- n_school + n_scout # school_axis <- seq(0, 1, length.out = n_school) # scout_axis <- seq(0, 1, length.out = n_scout) # positions <- rbind( # cbind(-2.18 + 0.83 * school_axis, -0.70 + 0.95 * abs(sin(pi * school_axis))), # cbind(-2.22 + 0.77 * scout_axis, 0.28 + 0.64 * abs(cos(pi * scout_axis))) # ) # velocity_phase <- seq(0, 2 * pi, length.out = n_boids) # velocities <- cbind( # 0.35 + 0.20 * cos(velocity_phase), # 0.08 * sin(velocity_phase) # ) # # custom_state <- boids4R::boids_state( # n_boids, # "2d", # bounds = bounds, # positions = positions, # velocities = velocities, # species = c(rep("school", n_school), rep("scout", n_scout)) # ) # # custom_world <- boids4R::boids_world( # "2d", # bounds = bounds, # boundary = "reflect", # obstacles = data.frame( # x = c(-0.82, -0.05, 0.72), # y = c(0.42, -0.36, 0.48), # radius = c(0.30, 0.36, 0.31) # ), # predators = data.frame( # x = -0.25, # y = 0.92, # radius = 0.58, # strength = 1.2 # ), # attractors = data.frame( # x = 2.08, # y = -0.86, # strength = 0.95 # ) # ) # # params <- boids4R::boids_params( # "2d", # separation_weight = 1.35, # alignment_weight = 0.94, # cohesion_weight = 0.62, # obstacle_weight = if (isTRUE(stronger_avoidance)) 2.8 else 2.5, # predator_weight = if (isTRUE(stronger_avoidance)) 3.2 else 2.3, # goal_weight = if (isTRUE(stronger_avoidance)) 0.20 else 0.16, # max_speed = 1.18, # max_force = 0.12, # noise = 0.001 # ) # # boids4R::simulate_boids( # custom_state, # custom_world, # params, # steps = 240L, # record_every = 3L, # seed = seed # ) # } # # render_custom_corridor <- function(name, stronger_avoidance = FALSE, seed = 221L) { # sim <- simulate_custom_corridor(stronger_avoidance = stronger_avoidance, seed = seed) # spec <- ggWebGL:::ggwebgl_boids_display_spec( # sim, # boid_size = 4.4, # prey_size = 5.0, # predator_size = 8.0, # current_alpha = 0.96, # trail_alpha = 0.18, # vector_mode = "current", # vector_colour_mode = "species", # vector_every = 1L, # vector_alpha = 0.68, # vector_width = 1.25, # vector_scale = 0.14, # obstacle_mode = "ring", # obstacle_segments = 48L, # obstacle_alpha = 0.9, # trail = "recent", # trail_length = 32L, # shader = "default", # speed = 1.5, # fps = 24L # ) # spec$labels$title <- paste("boids4R custom corridor:", name) # ggWebGL::ggWebGL(spec, height = 500) # } ## ----baseline-corridor, eval = ggwebgl_eval_widgets--------------------------- # if (!boids4r_available) { # cat("Baseline corridor widget skipped.\n") # } else { # render_custom_corridor("baseline", stronger_avoidance = FALSE, seed = 221L) # } ## ----stronger-avoidance-corridor, eval = ggwebgl_eval_widgets----------------- # if (!boids4r_available) { # cat("Stronger avoidance corridor widget skipped.\n") # } else { # render_custom_corridor("stronger_avoidance", stronger_avoidance = TRUE, seed = 222L) # }