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