summaryrefslogtreecommitdiff
path: root/src/sims/dynamics/Rectangle.scala
blob: adaa634ebb2db0da609ca3709eb3234997b690cb (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
37
38
39
40
/*
 * Simple Mechanics Simulator (SiMS)
 * copyright (c) 2009 Jakob Odersky
 * made available under the MIT License
*/

package sims.dynamics

import sims.geometry._
import sims.collision._

/**Rechteck ist eine Art Polygon.
 * @param halfWidth halbe Breite dieses Rechtecks
 * @param halfHeight halbe Hoehe dieses Rechtecks
 * @param density dichte dieses Rechtecks
 */
case class Rectangle(halfWidth: Double,
                     halfHeight : Double,
                     density: Double) extends Shape with ConvexPolygon{
  
  val volume = halfWidth * halfHeight * 4
  
  val I = 1.0 / 12.0  * mass * ((2 * halfWidth) * (2 * halfWidth) + (2 * halfHeight) * (2 * halfHeight))
  
  /**Ergibt Vektoren vom Zentrum dieses Rectecks bis zu den Ecken.
   * Erste Ecke entspricht der Ecke oben rechts bei einer Rotation von 0.
   * Folgende Ecken sind gegen den Uhrzeigersinn geordnet.
   * @return Vektoren vom Zentrum dieses Rectecks bis zu den Ecken*/
  def halfDiags: Array[Vector2D] = Array(Vector2D(halfWidth, halfHeight),
                                         Vector2D(-halfWidth, halfHeight),
                                         Vector2D(-halfWidth, -halfHeight),
                                         Vector2D(halfWidth, -halfHeight)) map (_ rotate rotation)
  
  /**Ergibt die Ortsvektoren der Ecken dieses Rechtecks. 
   * Erste Ecke entspricht der Ecke oben rechts bei einer Rotation von 0.
   * Folgende Ecken sind gegen den Uhrzeigersinn geordnet.
   * @return Ortsvektoren der Ecken dieses Rechtecks*/
  def vertices = for (h <- halfDiags) yield pos + h
  
}