Boxes example

library(chipmunkbasic)
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 vx vy fx fy      theta omega torque    width
#> 1    1   2.9141345 46.32831  0  0  0  0 0.15840062     0      0 4.124069
#> 2    2   6.4319117 35.16456  0  0  0  0 0.04852682     0      0 9.187117
#> 3    3   7.4809139 25.36415  0  0  0  0 0.60463204     0      0 3.647797
#> 4    4  19.6762438 25.20141  0  0  0  0 0.61060405     0      0 5.981594
#> 5    5   6.0669506 15.02220  0  0  0  0 0.20987462     0      0 9.477642
#> 6    6  -4.7044817 44.78763  0  0  0  0 0.26730948     0      0 5.088913
#> 7    7  -0.2583477 17.44870  0  0  0  0 0.64981748     0      0 5.856641
#> 8    8 -15.6822550 38.94844  0  0  0  0 0.32301418     0      0 7.347734
#> 9    9  11.3173105 32.12145  0  0  0  0 0.41604079     0      0 8.567570
#> 10  10  -0.9107974 39.29255  0  0  0  0 0.54407009     0      0 8.314850
#>      height
#> 1  4.976991
#> 2  9.557402
#> 3  3.412454
#> 4  7.740948
#> 5  3.697140
#> 6  2.107123
#> 7  6.796527
#> 8  8.353919
#> 9  7.176482
#> 10 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        x        y vx vy fx fy      theta omega torque vertex    xvertex
#> 1    1 2.914135 46.32831  0  0  0  0 0.15840062     0      0      1  1.2704478
#> 31   1 2.914135 46.32831  0  0  0  0 0.15840062     0      0      2  5.3428872
#> 61   1 2.914135 46.32831  0  0  0  0 0.15840062     0      0      3  4.5578213
#> 91   1 2.914135 46.32831  0  0  0  0 0.15840062     0      0      4  0.4853819
#> 2    2 6.431912 35.16456  0  0  0  0 0.04852682     0      0      1  2.0755647
#> 32   2 6.431912 35.16456  0  0  0  0 0.04852682     0      0      2 11.2518671
#> 62   2 6.431912 35.16456  0  0  0  0 0.04852682     0      0      3 10.7882587
#> 92   2 6.431912 35.16456  0  0  0  0 0.04852682     0      0      4  1.6119563
#>     yvertex
#> 1  43.54571
#> 31 44.19623
#> 61 49.11092
#> 91 48.46039
#> 2  30.16866
#> 32 30.61431
#> 62 40.16046
#> 92 39.71481
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Advance the simulation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$advance(40)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot everything
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot(boxes) + 
  geom_polygon(aes(xvertex, yvertex, 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