Boxes example

library(chipmunkcore)
library(ggplot2)
set.seed(1)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Initialize a simulation space
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm <- Chipmunk$new()

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Add fixed segments
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$add_static_segment(-70, 0, 70, 0)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Fetch all the segments. Use for plotting
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
segments_df <- cm$get_static_segments()

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Add some boxes
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (i in 1:30) {
  cm$add_box(
    x      = runif(1, -20, 20),
    y      = runif(1,  10, 50),
    width  = runif(1, 2, 10),
    height = runif(1, 2, 10),
    angle  = runif(1, 0, 45)
  )
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# The raw box form is width height and angle of rotation.  However
# this isn't very handy for plotting with ggplot
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
boxes <- cm$get_boxes()
head(boxes, 10)
#>    idx           x        y      angle    width   height
#> 1    1   2.9141345 46.32831 0.15840062 4.124069 4.976991
#> 2    2   6.4319117 35.16456 0.04852682 9.187117 9.557402
#> 3    3   7.4809139 25.36415 0.60463204 3.647797 3.412454
#> 4    4  19.6762438 25.20141 0.61060405 5.981594 7.740948
#> 5    5   6.0669506 15.02220 0.20987462 9.477642 3.697140
#> 6    6  -4.7044817 44.78763 0.26730948 5.088913 2.107123
#> 7    7  -0.2583477 17.44870 0.64981748 5.856641 6.796527
#> 8    8 -15.6822550 38.94844 0.32301418 7.347734 8.353919
#> 9    9  11.3173105 32.12145 0.41604079 8.567570 7.176482
#> 10  10  -0.9107974 39.29255 0.54407009 8.314850 2.186650
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Get the boxes as a list of vertices. This is ideal for 
# ggplot::geom_polygon()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
boxes <- cm$get_boxes_as_polygons()
head(boxes, 8)
#>    idx vertex          x        y
#> 1    1      1  1.2704478 43.54571
#> 31   1      2  5.3428872 44.19623
#> 61   1      3  4.5578213 49.11092
#> 91   1      4  0.4853819 48.46039
#> 2    2      1  2.0755647 30.16866
#> 32   2      2 11.2518671 30.61431
#> 62   2      3 10.7882587 40.16046
#> 92   2      4  1.6119563 39.71481
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Advance the simulation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$advance(40)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot everything
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot(boxes) +
  geom_polygon(aes(x, y, group = idx, fill = as.factor(idx))) +
  geom_segment(data = segments_df, aes(x = x1, y = y1, xend = x2, yend = y2)) +
  coord_fixed() +
  theme_void() +
  theme(legend.position = 'none')

Full animation