diff options
Diffstat (limited to 'src/main/scala/sims/collision/PolyCircleCollision.scala')
-rw-r--r-- | src/main/scala/sims/collision/PolyCircleCollision.scala | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/main/scala/sims/collision/PolyCircleCollision.scala b/src/main/scala/sims/collision/PolyCircleCollision.scala new file mode 100644 index 0000000..20f1d49 --- /dev/null +++ b/src/main/scala/sims/collision/PolyCircleCollision.scala @@ -0,0 +1,36 @@ +/* + * Simple Mechanics Simulator (SiMS) + * copyright (c) 2009 Jakob Odersky + * made available under the MIT License +*/ + +package sims.collision + +import sims.dynamics._ +import sims.geometry._ + +/**Collision between a convex polygon and a circle.*/ +case class PolyCircleCollision(p: ConvexPolygon, c: Circle) extends Collision { + require(p.isInstanceOf[Shape]) + val shape1 = p.asInstanceOf[Shape] + val shape2 = c + + val normal = { + //minimum overlap + var min = (p.sides(0) distance c.pos) - c.radius + var axis = p.sides(0).n0 + for (s <- p.sides; val delta = (s distance c.pos) - c.radius) if (delta <= 0 && delta < min) { + min = delta + axis = s.n0 + } + for (v <- p.vertices; val delta = (v - c.pos).length - c.radius) if (delta <= 0 && delta <= min){ + min = delta + axis = (c.pos - v).unit + } + axis + } + + val points = List( + c.pos - normal * c.radius + ) +} |