Я бы порекомендовал создать простой решатель ограничений - используя релаксацию, чтобы получить нужный ответ. Это похоже на технику, используемую в некоторых приложениях, подобных Visio. По сути, вы можете добавить силы пружины между парами точек и границ холста. Вы занимаетесь симуляцией в течение короткого промежутка времени, и все «встанет на свои места».
Вы можете попробовать Box2DJS - простую систему физики javascript. Или прочитайте об интеграции / ограничениях Verlet - его довольно просто запустить и запустить, и он отлично подходит для такого рода приложений.