Boxes example

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

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

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

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

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Stack boxes
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$add_box(x = 0, y =  5, width = 2, height = 2 * 5)
cm$add_box(x = 4, y =  5, width = 2, height = 2 * 5)
cm$add_box(x = 2, y = 11, width = 6, height = 2 * 1)

cm$add_box(x = 0, y = 17, width = 2, height = 2 * 5)
cm$add_box(x = 4, y = 17, width = 2, height = 2 * 5)
cm$add_box(x = 2, y = 23, width = 6, height = 2 * 1)

cm$add_box(x = 0, y = 29, width = 2, height = 2 * 5)
cm$add_box(x = 4, y = 29, width = 2, height = 2 * 5)
cm$add_box(x = 2, y = 35, width = 6, height = 2 * 1)

cm$add_box(x = 0, y = 41, width = 2, height = 2 * 5)
cm$add_box(x = 4, y = 41, width = 2, height = 2 * 5)
cm$add_box(x = 2, y = 47, width = 6, height = 2 * 1)


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Bowling ball
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$add_circle(x = -40, y = 8, radius = 8, vx = 50, mass = 100, friction = 0.2)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Get the boxes as a list of vertices. This is ideal for 
# ggplot::geom_polygon()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
boxes <- cm$get_boxes_as_polygons()
bball <- cm$get_circles()

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot everything
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot() +
  geom_polygon(data = boxes, aes(x, y, group = idx, fill = as.factor(idx))) +
  geom_point(data = bball, aes(x, y), size = 35) +
  geom_segment(data = segments_df, aes(x = x1, y = y1, xend = x2, yend = y2)) +
  coord_fixed(xlim = c(-50, 50), ylim = c(0, 50)) +
  theme_void() +
  theme(legend.position = 'none')

Full animation