Spark functions to control tree growth

spark_linear(x = 0, y = 0, tree = 0, time = 0, constant = 0)

spark_decay(x = 0, y = 0, tree = 0, time = 0, multiplier = 2, constant = 0)

spark_random(multiplier = 3, constant = 0)

spark_nothing()

## Arguments

x Weight given to the horizontal co-ordinate Weight given to the horizontal co-ordinate Weight given to the tree number Weight given to the time point Constant value to be added to the output Scaling parameter that multiplies the output

## Value

A function that takes coord_x, coord_y, id_tree, and id_time as input, and returns a numeric vector as output.

## Details

Some arguments to flametree_grow() take numeric input, but seg_col, seg_wid, shift_x, and shift_y all take functions as their input, and are used to control how the colours (seg_col) and width (seg_wid) of the segments are created, as well as the horizontal (shift_x) and vertical (shift_y) displacement of the trees are generated. Functions passed to these arguments take four inputs: coord_x, coord_y, id_tree, and id_time as input. Any function that takes these variables as input and produces a numeric vector of the same length as the input can be used for this purpose. However, as a convenience, four "spark" functions are provided that can be used to create functions that are suitable for this purpose: spark_linear(), spark_decay(), spark_random(), and spark_nothing(). Arguments passed to one of the spark functions determine the specific function is generated. For example, spark_linear() can be used to construct any linear combination of the inputs: spark_linear(x = 3, y = 2) would return a function that computes the sum (3 * coord_x) + (2 * coord_y). Different values provided as input produce different linear functions. Analogously, spark_decay() returns functions that are exponentially decaying functions of a linear combination of inputs. The spark_random() generator can be used to generate functions that return random values, and spark_nothing() produces a function that always returns zero regardless of input.

## Examples

# returns a linear function of x and y
spark_linear(x = 3,  y = 2)
#> function (coord_x, coord_y, id_tree, id_time)
#> {
#>     (x * coord_x) + (y * coord_y) + (tree * id_tree) + (time *
#>         id_time) + constant
#> }
#> <bytecode: 0x7f9ecb7f5288>
#> <environment: 0x7f9ecd78cb58>

# returns a function of time that decays
# exponentially to an asymptote
spark_decay(time = .1, constant = .1)
#> function (coord_x, coord_y, id_tree, id_time)
#> {
#>     multiplier * exp(-abs((x * coord_x) + (y * coord_y) + (tree *
#>         id_tree) + (time * id_time))^2) + constant
#> }
#> <bytecode: 0x7f9ecc80c2e8>
#> <environment: 0x7f9ecf487718>

# returns a numeric vector containing
# copies of the same uniform random number
# constrained to lie between -2.5 and 2.5
spark_random(multiplier = 5)
#> function (coord_x, coord_y, id_tree, id_time)
#> {
#>     n <- length(coord_x)
#>     u <- stats::runif(1, min = -multiplier/2, max = multiplier/2) +
#>         constant
#>     return(rep(u, n))
#> }
#> <bytecode: 0x7f9ecb7e4d10>
#> <environment: 0x7f9ece89ba00>

# returns a function that always produces
# a vector of zeros
spark_nothing()
#> function (coord_x, coord_y, id_tree, id_time)
#> {
#>     n <- length(coord_x)
#>     return(rep(0, n))
#> }
#> <bytecode: 0x7f9ecb7f2bc0>
#> <environment: 0x7f9ecaf14140>