Most modifications of values in a long_grid are quite simple due to the wealth of vectorised functions avaliable in R. ambient provides a little selection of handy functions to compliment these

blend(x, y, mask)

normalise(x, from = range(x), to = c(0, 1))

normalize(x, from = range(x), to = c(0, 1))

cap(x, lower = 0, upper = 1)


x, y

Values to modify


A vector of the same length as x and y. Assumed to be between 0 and 1 (values outside of this range is capped). The closer to 1 the more of x will be used and the closer to 0 the more of y will be used


The range of x to use for normalisation


The output domain to normalise to

lower, upper

The lower and upper bounds to cap to


grid <- long_grid(seq(1, 10, length.out = 1000), seq(1, 10, length.out = 1000))
grid$chess <- gen_checkerboard(grid$x, grid$y)
grid$noise <- gen_perlin(grid$x, grid$y)
grid$ripple <- gen_waves(grid$x, grid$y)

# Blend two values based on a third
grid$mix <- blend(grid$noise, grid$ripple, grid$chess)
plot(grid, mix)

# Cap values between 0 and 1
plot(grid, cap(noise))