diff options
Diffstat (limited to 'src/sims')
-rw-r--r-- | src/sims/collision/GridDetector.scala | 10 | ||||
-rw-r--r-- | src/sims/collision/Pair.scala | 7 | ||||
-rw-r--r-- | src/sims/dynamics/joints/ForceJoint.scala | 2 | ||||
-rw-r--r-- | src/sims/geometry/ConvexPolygon.scala | 4 |
4 files changed, 13 insertions, 10 deletions
diff --git a/src/sims/collision/GridDetector.scala b/src/sims/collision/GridDetector.scala index abc40f2..9a71c6d 100644 --- a/src/sims/collision/GridDetector.scala +++ b/src/sims/collision/GridDetector.scala @@ -12,14 +12,14 @@ import scala.collection._ import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.HashMap -/**A conrete implementation of <code>Detector</code>. <code>GridDetector</code> divides the world into a grid +/**A concrete implementation of <code>Detector</code>. <code>GridDetector</code> divides the world into a grid * for faster collision detection.*/ class GridDetector(override val world: World) extends Detector { /**Array of collision detection methods. These methods return <code>true</code> if two shapes are colliding.*/ val detectionMethods = new ArrayBuffer[PartialFunction[(Shape, Shape), Boolean]] detectionMethods += { - case (c1: Circle, c2: Circle) => { //Kollision wenn Distanz <= Summe der Radien + case (c1: Circle, c2: Circle) => { //collision if distance <= sum of radiuses val d = (c1.pos - c2.pos).length val rSum = c1.radius + c2.radius d - rSum <= 0 @@ -31,12 +31,12 @@ class GridDetector(override val world: World) extends Detector { axes.forall((a: Vector2D) => p1.project(a) overlaps p2.project(a)) } - case (p: ConvexPolygon, c: Circle) => { //Distanz von Zentrum zu Seiten oder Eckpunkten + case (p: ConvexPolygon, c: Circle) => { //distance form center to sides or vertices val distances = for (s <- p.sides) yield (s distance c.pos) distances.exists(_ - c.radius <= 0) || (p contains c.pos) } - case (c: Circle, p: ConvexPolygon) => { //Distanz von Zentrum zu Seiten oder Eckpunkten + case (c: Circle, p: ConvexPolygon) => { //distance form center to sides or vertices val distances = for (s <- p.sides) yield (s distance c.pos) distances.exists(_ - c.radius <= 0) || (p contains c.pos) } @@ -97,7 +97,7 @@ class GridDetector(override val world: World) extends Detector { } for(s <- world.shapes) addToGrid(s) var ps: List[Pair] = Nil - for(cell <- grid.values) { + for(cell <- grid.valuesIterator) { ps = ps ::: (for (s1: Shape <- cell; s2: Shape <- cell; if (s1 ne s2); if (s1.body ne s2.body); diff --git a/src/sims/collision/Pair.scala b/src/sims/collision/Pair.scala index e4ae947..a01fb00 100644 --- a/src/sims/collision/Pair.scala +++ b/src/sims/collision/Pair.scala @@ -9,8 +9,7 @@ package sims.collision import sims.dynamics._ /**Pair of shapes.*/ -case class Pair(s1: Shape, s2: Shape) extends Tuple2(s1, s2){ - def this(t: Tuple2[Shape, Shape]) = this(t._1, t._2) +case class Pair(s1: Shape, s2: Shape){ override def equals(other: Any) = { //overriden to prevent removal during "GridDetector.getPairs" other match { @@ -19,3 +18,7 @@ case class Pair(s1: Shape, s2: Shape) extends Tuple2(s1, s2){ } } } + +object Pair { + implicit def pair2Tuple(x: Pair) = (x.s1, x.s2) +} diff --git a/src/sims/dynamics/joints/ForceJoint.scala b/src/sims/dynamics/joints/ForceJoint.scala index 1eed850..2074ee4 100644 --- a/src/sims/dynamics/joints/ForceJoint.scala +++ b/src/sims/dynamics/joints/ForceJoint.scala @@ -9,6 +9,6 @@ package sims.dynamics.joints /**A joint which can apply a force to its anchor bodies, thus adding or removing energy to the system.*/ trait ForceJoint { - /**Applies a force on the achor bodies.*/ + /**Applies a force on the anchor bodies.*/ def applyForce(): Unit } diff --git a/src/sims/geometry/ConvexPolygon.scala b/src/sims/geometry/ConvexPolygon.scala index cb4a429..0b05aaa 100644 --- a/src/sims/geometry/ConvexPolygon.scala +++ b/src/sims/geometry/ConvexPolygon.scala @@ -36,8 +36,8 @@ trait ConvexPolygon { def AABB = { val xs = vertices map (_.x) val ys = vertices map (_.y) - new AABB(Vector2D(Iterable.min(xs), Iterable.min(ys)), - Vector2D(Iterable.max(xs), Iterable.max(ys))) + new AABB(Vector2D(xs.min, ys.min), + Vector2D(xs.max, ys.max)) } /**Checks if the point <code>point</code> is contained in this polygon. |