summaryrefslogtreecommitdiff
path: root/src/sims/dynamics/Shape.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/sims/dynamics/Shape.scala')
-rw-r--r--src/sims/dynamics/Shape.scala93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/sims/dynamics/Shape.scala b/src/sims/dynamics/Shape.scala
new file mode 100644
index 0000000..f57bbc6
--- /dev/null
+++ b/src/sims/dynamics/Shape.scala
@@ -0,0 +1,93 @@
+/*
+ * Simple Mechanics Simulator (SiMS)
+ * copyright (c) 2009 Jakob Odersky
+ * made available under the MIT License
+*/
+
+package sims.dynamics
+
+import sims.geometry._
+import sims.collision._
+
+/**
+* Eine abstrakte Form.
+*/
+abstract class Shape{
+
+ /**Einzigartige Identifikationsnummer.*/
+ val uid: Int = Shape.nextUid
+
+ /**Kollisionsfaehigkeit.*/
+ var collidable: Boolean = true
+
+ /**Teil der Stosszahl bei einer Kollision zwischen dieser Form und einer anderen.
+ * Die Stosszahl wird aus dem Produkt der beiden Teile der Formen errechnet.*/
+ var restitution: Double = 0.7
+
+ /**Teil des Reibungskoeffizienten bei einer Kollision zwischen dieser Form und einer anderen.
+ * Der Reibungskoeffizient wird aus dem Produkt der beiden Teile der Formen errechnet.*/
+ var friction: Double = 0.707
+
+ /**Position des Schwerpunktes in Welt.*/
+ var pos: Vector2D = Vector2D.Null
+
+ /**Rotation. Entspricht Laenge des Rotationsvektors.*/
+ var rotation: Double = 0
+
+ /**Initiale Rotation. (Rotation ohne Koerper)*/
+ var rotation0 = 0.0
+
+ /**Referenzposition in Koerper. Wird zur Rotation von Formen in Koerpern verwendet.*/
+ var refLocalPos: Vector2D = Vector2D.Null
+
+ /**Dichte. (Masse pro Flaeche)*/
+ val density: Double
+
+ /**Volumen. Entspricht eigentlich der Flaeche dieser Form (in 2D) wird aber zum Errechnen der Masse verwendet.*/
+ val volume: Double
+
+ /**Errechnet die Masse dieser Form. Masse ist gleich Volumen mal Dichte.
+ @return Masse der Form*/
+ def mass = volume * density
+
+ /**Errechnet Traegheitsmoment zum Schwerpunkt dieser Form.
+ @return Traegheitsmoment zum Schwerpunkt*/
+ val I: Double
+
+ /**Beinhaltender Koerper. Sollte nicht selbst bei Initialisierung definiert werden.*/
+ var body: Body = _
+
+ /**Gibt das umfassende AABB dieser Form zurueck.
+ @return umfassendes AABB*/
+ def AABB: AABB
+
+ /**Ergibt die Projektion dieser Form auf eine Gerade gegeben durch den
+ * Richtungsvektor <code>axis</code>.
+ * @param axis Richtungsvektor der Geraden
+ * @return Projektion dieser Form*/
+ def project(axis: Vector2D): Projection
+
+ /**Ermittelt ob der gebene Punkt <code>point</code> in dieser Form enthalten ist.*/
+ def contains(point: Vector2D): Boolean
+
+ /**Baut einen Koerper aus dieser Form.
+ @return ein Koerper bestehend aus dieser Form. */
+ def asBody = new Body(this)
+
+ /**Formen mit denen diese Form nicht Kollidiert.*/
+ val transientShapes: collection.mutable.Set[Shape] = collection.mutable.Set()
+
+ /**Erstellt einen Koerper aus dieser Form und der Form <code>s</code>.*/
+ def ^(s: Shape) = new Body(this, s)
+
+ /**Erstellt einen Koerper aus dieser Form und den Formen des Koerpers <code>b</code>.*/
+ def ^(b: Body) = {
+ val shapes = this :: b.shapes
+ new Body(shapes: _*)
+ }
+}
+
+object Shape {
+ private var uidCounter = -1
+ private def nextUid = {uidCounter += 1; uidCounter}
+}