blob: 20f1d49e3410ad6e79aee8100346a754b08822ab (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
)
}
|