Basic Chipmunk

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

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


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Add fixed segments
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$add_static_segment(-20, 10, -5, 0)
cm$add_static_segment( 20, 10,  5, 0)

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

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Add some circles 
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (i in 1:10) {
  cm$add_circle(
    x = runif(1, -20, 20), 
    y = runif(1,  10, 50),
    vx = 10 * rnorm(1),
    vy = 10 * rnorm(1)
  )
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Get the current positions of the circles as a data.frame
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
circles <- cm$get_circles()
circles
#>    idx           x        y          vx         vy fx fy theta omega torque r
#> 1    1  -9.3796535 24.88496   1.8364332  -8.356286  0  0     0     0      0 1
#> 2    2  17.7870107 36.43191   3.2950777  -8.204684  0  0     0     0      0 1
#> 3    3   7.4809139 25.36415   7.3832471   5.757814  0  0     0     0      0 1
#> 4    4  -4.7985928 41.09781  15.1178117   3.898432  0  0     0     0      0 1
#> 5    5  -9.3111733 25.44456 -22.1469989  11.249309  0  0     0     0      0 1
#> 6    6  -0.7167954 33.98263  -0.1619026   9.438362  0  0     0     0      0 1
#> 7    7  11.7695944 14.31775   5.9390132   9.189774  0  0     0     0      0 1
#> 8    8  11.3173105 32.12145   0.7456498 -19.893517  0  0     0     0      0 1
#> 9    9   9.2925495 37.70926  -0.5612874  -1.557955  0  0     0     0      0 1
#> 10  10 -17.1728381 13.97865  -4.7815006   4.179416  0  0     0     0      0 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Advance the simulation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$advance(10)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Show me the circles in their new locations
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
circles <- cm$get_circles()
circles
#>    idx           x        y          vx          vy fx fy         theta omega
#> 1    1  -9.1697635 23.52691   1.8364332 -18.3562861  0  0 -4.440892e-18     0
#> 2    2  18.1165185 35.16144   3.2950777 -18.2046838  0  0  0.000000e+00     0
#> 3    3   8.2192386 25.48993   7.3832471  -4.2421865  0  0  0.000000e+00     0
#> 4    4  -3.2868117 41.03765  15.1178117  -6.1015676  0  0  0.000000e+00     0
#> 5    5 -11.5521198 26.19191 -22.1469989   1.2493092  0  0 -4.440892e-18     0
#> 6    6  -0.7329856 34.47647  -0.1619026  -0.5616379  0  0  0.000000e+00     0
#> 7    7  12.3634958 14.78672   5.9390132  -0.8102263  0  0  0.000000e+00     0
#> 8    8  11.3918755 29.68210   0.7456498 -29.8935170  0  0  0.000000e+00     0
#> 9    9   9.2364208 37.10347  -0.5612874 -11.5579551  0  0  0.000000e+00     0
#> 10  10 -17.6509882 13.94659  -4.7815006  -5.8205844  0  0  0.000000e+00     0
#>    torque r
#> 1       0 1
#> 2       0 1
#> 3       0 1
#> 4       0 1
#> 5       0 1
#> 6       0 1
#> 7       0 1
#> 8       0 1
#> 9       0 1
#> 10      0 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot everything
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot(circles) + 
  geom_point(aes(x, y), size = 5, colour = "grey80") + 
  geom_segment(data = segments_df, aes(x = x1, y = y1, xend = x2, yend = y2)) + 
  coord_fixed(xlim=c(-25, 25), ylim = c(0, 50)) + 
  theme_minimal() + 
  theme(legend.position = 'none')

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Advance the simulation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cm$advance(10)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Show me the circles in their new locations
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
circles <- cm$get_circles()
circles
#>    idx           x        y          vx         vy fx fy         theta omega
#> 1    1  -8.9861201 21.24129   1.8364332 -28.356286  0  0 -4.440892e-18     0
#> 2    2  18.4460263 32.89097   3.2950777 -28.204684  0  0  0.000000e+00     0
#> 3    3   8.9575633 24.61571   7.3832471 -14.242186  0  0  0.000000e+00     0
#> 4    4  -1.7750305 39.97750  15.1178117 -16.101568  0  0  0.000000e+00     0
#> 5    5 -13.7668197 25.86684 -22.1469989  -8.750691  0  0 -4.440892e-18     0
#> 6    6  -0.7491759 33.97031  -0.1619026 -10.561638  0  0  0.000000e+00     0
#> 7    7  12.9573971 14.25570   5.9390132 -10.810226  0  0  0.000000e+00     0
#> 8    8  11.4664405 26.24275   0.7456498 -39.893517  0  0  0.000000e+00     0
#> 9    9   9.1802921 35.49767  -0.5612874 -21.557955  0  0  0.000000e+00     0
#> 10  10 -18.1291382 12.91453  -4.7815006 -15.820584  0  0  0.000000e+00     0
#>    torque r
#> 1       0 1
#> 2       0 1
#> 3       0 1
#> 4       0 1
#> 5       0 1
#> 6       0 1
#> 7       0 1
#> 8       0 1
#> 9       0 1
#> 10      0 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plot everything
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ggplot(circles) + 
  geom_point(aes(x, y), size = 5, colour = "grey80") + 
  geom_segment(aes(x = x, y = y, xend = x + 0.1 * vx, yend = y + 0.1 * vy), arrow = arrow(angle = 15, length = unit(0.1, 'inches'))) + 
  geom_segment(data = segments_df, aes(x = x1, y = y1, xend = x2, yend = y2)) + 
  coord_fixed(xlim=c(-25, 25), ylim = c(0, 50)) + 
  theme_minimal() + 
  theme(legend.position = 'none')

Full animation