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()

x | Weight given to the horizontal co-ordinate |
---|---|

y | Weight given to the horizontal co-ordinate |

tree | Weight given to the tree number |

time | Weight given to the time point |

constant | Constant value to be added to the output |

multiplier | Scaling parameter that multiplies the output |

A function that takes `coord_x`

, `coord_y`

, `id_tree`

,
and `id_time`

as input, and returns a numeric vector as output.

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.

# 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>