cacatoo
Version:
Building, exploring, and sharing spatially structured models
114 lines (90 loc) • 5.46 kB
HTML
<html>
<script src="../../dist/cacatoo.js"></script> <!-- Include cacatoo library (compiled with rollup) -->
<script src="../../lib/all.js"></script> <!-- Include other libraries (concattenated in 1 file) -->
<link rel="stylesheet" href="../../style/cacatoo.css"> <!-- Set style sheet -->
<head>
<title>Cacatoo</title>
</head>
<script>
/*-----------------------Start user-defined code ---------------------*/
let sim; // Declare a variable named "sim" globally, so that we can access our cacatoo-simulation from wherever we need.
/**
* function cacatoo() contains all the user-defined parts of a cacatoo-model. Configuration, update rules, what is displayed or plotted, etc. It's all here.
*/
function cacatoo() {
/*
1. SETUP. First, set up a configuration-object. Here we define how large the grid is, how long will it run, what colours will the critters be, etc.
*/
let config =
{
title: "Predator prey model", // The name of your cacatoo-simulation
description: "Yellow are prey. Red are predators. Black is empty.", // And a description if you wish
maxtime: 1000000, // How many time steps the model continues to run
ncol: 210, // Number of columns (width of your grid)
nrow: 60, // Number of rows (height of your grid)
wrap: [true, true], // Wrapped boundary conditions? [COLS, ROWS]
scale: 3, // Scale of the grid (nxn pixels per grid point)
statecolours: { 'species': { 'prey': [245, 245, 50], 'predator': [255, 0, 96] } }, // Colours for each state. Defaults to black.
}
/*
1. SETUP. (continued) Now, let's use that configuration-object to generate a new Cacatoo simulation
*/
sim = new Simulation(config) // Initialise the Cacatoo simulation
sim.makeGridmodel("model") // Build a new Gridmodel within the simulation called "model"
sim.initialGrid(sim.model, 'species', 0, 'prey', 0.2, 'predator', 0.2) // Set half (20%) of the Gridmodel's grid points to 1 (prey), and 20% to 2 (predator)
sim.createDisplay("model", "species", "") // Create a display so we can see our newly made gridmodel
/*
2. DEFINING THE RULES. Below, the user defines the nextState function. This function will be applied for each grid point when we will update the grid later.
*/
sim.model.nextState = function (i, y) {
let randomneigh = this.randomMoore8(this, i, y).species // Random neighbour
if (!this.grid[i][y].species) // If empty
{
if (randomneigh == 'prey' && this.rng.genrand_real1() < 0.5)
this.grid[i][y].species = 'prey' // 1 (prey) reproduces
}
else if (this.grid[i][y].species == 'prey') // If prey
{
if (randomneigh == 'predator' && this.rng.genrand_real1() < 0.3)
this.grid[i][y].species = 'predator' // 2 (pred) reproduces
}
if (this.rng.genrand_real1() < 0.05)
this.grid[i][y].species = undefined // death
}
/*
3. MAIN SIMULATION LOOP. Finally, we need to set the update-function, which is the mainwill be applied to the whole grid each time step. For now, all we will do is call "synchronous", which
applies the next-state function shown above to each grid point. All cells are updated at the same time, rather than in turn (for this, use the function "asynchonous")
*/
sim.model.update = function () {
this.synchronous() // Applied as many times as it can in 1/60th of a second
this.plotPopsizes('species', ['prey', 'predator'])
}
/*
OPTIONAL: Now that we have everything setup, we can also add some interactive elements (buttons or sliders). See cheater.html for more examples of this.
*/
sim.addButton("Play/pause sim", function () { sim.toggle_play() })
sim.addButton("Disable/enable mix", function () { sim.toggle_mix() })
sim.addButton("Kill prey", function () { sim.my_custom_killprey_function() })
sim.my_custom_killprey_function = function () {
for (let i = 0; i < sim.model.nc; i++) for (let y = 0; y < sim.model.nr; y++) {
if (sim.model.grid[i][y].species == 'prey' && this.rng.genrand_real1() < 0.9)
sim.model.grid[i][y].species = undefined
}
}
sim.start()
}
/*-------------------------End user-defined code ---------------------*/
</script>
<body onload="cacatoo()">
<div class="header" id="header">
<h2>Cacatoo (example project)</h2>
</div>
<div class="content" id="canvas_holder"> </div>
<div class="content" id="graph_holder"> </div>
<div class="content" id="form_holder"></div>
<div class="content" id="examples">
</div>
<div class="footer" id="footer"></div>
</div>
</body>
</html>