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