summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2009-11-28 20:25:35 +0000
committerJakob Odersky <jodersky@gmail.com>2009-11-28 20:25:35 +0000
commit5031df4b26afd515274b5ca34f0d5380a99e4223 (patch)
tree41aac12ec2c03426910de72486a2d87e58cebc44
parentfbdf90f0deb14ddd8a457ff1f5f7715e4d3c2f2a (diff)
downloadsims-5031df4b26afd515274b5ca34f0d5380a99e4223.tar.gz
sims-5031df4b26afd515274b5ca34f0d5380a99e4223.tar.bz2
sims-5031df4b26afd515274b5ca34f0d5380a99e4223.zip
Minor graphyx modifications. Added tests. Added 'PrismaticJoint' (still incomplete). Started to transfer 'ForceJoints' to ordinary joints who use only constraints for correction. Started to add materials.
-rw-r--r--doc/graphyx/graphics/Parser$object.html20
-rw-r--r--doc/sims/dynamics/World.html36
-rw-r--r--doc/sims/dynamics/joints/SpringJoint.html8
-rw-r--r--doc/sims/math/Matrix22.html12
-rw-r--r--doc/sims/prefabs/Ragdoll.html4
-rw-r--r--doc/sims/util/RelativeVector.html8
-rw-r--r--src/graphyx/Graphyx.scala3
-rw-r--r--src/graphyx/graphics/GraphicalShape.scala4
-rw-r--r--src/graphyx/graphics/Parser.scala3
-rw-r--r--src/graphyx/gui/AboutHelpFrame.scala2
-rw-r--r--src/graphyx/gui/OptionsPanel.scala10
-rw-r--r--src/graphyx/gui/WorldPanel.scala30
-rw-r--r--src/graphyx/tests/Atom.scala35
-rw-r--r--src/graphyx/tests/Spring.scala32
-rw-r--r--src/graphyx/tests/Wave.scala27
-rw-r--r--src/sims/collision/PolyCollision.scala6
-rw-r--r--src/sims/dynamics/World.scala2
-rw-r--r--src/sims/dynamics/joints/SpringJoint.scala32
-rw-r--r--src/sims/dynamics/joints/test/PrismaticJoint.scala84
-rw-r--r--src/sims/materials/Material.scala7
-rw-r--r--src/sims/materials/Rubber.scala5
-rw-r--r--src/sims/materials/Steel.scala5
-rw-r--r--src/sims/prefabs/Ragdoll.scala2
23 files changed, 319 insertions, 58 deletions
diff --git a/doc/graphyx/graphics/Parser$object.html b/doc/graphyx/graphics/Parser$object.html
index 4e88dfa..a03729d 100644
--- a/doc/graphyx/graphics/Parser$object.html
+++ b/doc/graphyx/graphics/Parser$object.html
@@ -56,8 +56,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.dynamics.Body%29" target="_self">toGraphical</a></em>
- (<em>real</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="../../graphyx/graphics/GraphicalBody.html" target="_self">GraphicalBody</a>
+ <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.AABB%29" target="_self">toGraphical</a></em>
+ (<em>real</em> : <a href="../../sims/collision/AABB.html" target="_self">AABB</a>) : <a href="../../graphyx/graphics/GraphicalAABB.html" target="_self">GraphicalAABB</a>
</td>
@@ -67,8 +67,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.Pair%29" target="_self">toGraphical</a></em>
- (<em>real</em> : <a href="../../sims/collision/Pair.html" target="_self">Pair</a>) : <a href="../../graphyx/graphics/GraphicalPair.html" target="_self">GraphicalPair</a>
+ <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.dynamics.Shape%29" target="_self">toGraphical</a></em>
+ (<em>real</em> : <a href="../../sims/dynamics/Shape.html" target="_self">Shape</a>) : <a href="../../graphyx/graphics/GraphicalShape.html" target="_self">GraphicalShape</a><code> with </code><a href="" target="contentFrame" class="scala/Product">scala.Product</a>
</td>
@@ -78,8 +78,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.dynamics.Shape%29" target="_self">toGraphical</a></em>
- (<em>real</em> : <a href="../../sims/dynamics/Shape.html" target="_self">Shape</a>) : <a href="../../graphyx/graphics/GraphicalShape.html" target="_self">GraphicalShape</a><code> with </code><a href="" target="contentFrame" class="scala/Product">scala.Product</a>
+ <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.Pair%29" target="_self">toGraphical</a></em>
+ (<em>real</em> : <a href="../../sims/collision/Pair.html" target="_self">Pair</a>) : <a href="../../graphyx/graphics/GraphicalPair.html" target="_self">GraphicalPair</a>
</td>
@@ -100,8 +100,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.AABB%29" target="_self">toGraphical</a></em>
- (<em>real</em> : <a href="../../sims/collision/AABB.html" target="_self">AABB</a>) : <a href="../../graphyx/graphics/GraphicalAABB.html" target="_self">GraphicalAABB</a>
+ <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.Collision%29" target="_self">toGraphical</a></em>
+ (<em>real</em> : <a href="../../sims/collision/Collision.html" target="_self">Collision</a>) : <a href="../../graphyx/graphics/GraphicalCollision.html" target="_self">GraphicalCollision</a>
</td>
@@ -111,8 +111,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.collision.Collision%29" target="_self">toGraphical</a></em>
- (<em>real</em> : <a href="../../sims/collision/Collision.html" target="_self">Collision</a>) : <a href="../../graphyx/graphics/GraphicalCollision.html" target="_self">GraphicalCollision</a>
+ <em><a href="../../graphyx/graphics/Parser$object.html#toGraphical%28sims.dynamics.Body%29" target="_self">toGraphical</a></em>
+ (<em>real</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="../../graphyx/graphics/GraphicalBody.html" target="_self">GraphicalBody</a>
</td>
diff --git a/doc/sims/dynamics/World.html b/doc/sims/dynamics/World.html
index 6c882fe..f9b0217 100644
--- a/doc/sims/dynamics/World.html
+++ b/doc/sims/dynamics/World.html
@@ -202,10 +202,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.dynamics.Body%29" target="_self">+=</a></em>
- (<em>body</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.prefabs.Prefab%29" target="_self">+=</a></em>
+ (<em>p</em> : <a href="../../sims/prefabs/Prefab.html" target="_self">Prefab</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Fuegt dieser Welt einen Koerper hinzu.</div>
+ <div>Fuegt dieser Welt ein vorangefertigtes System vaus Koerpern und Verbindungen hinzu.</div>
</td>
</tr>
<tr>
@@ -213,10 +213,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.prefabs.Prefab%29" target="_self">+=</a></em>
- (<em>p</em> : <a href="../../sims/prefabs/Prefab.html" target="_self">Prefab</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.dynamics.joints.Joint%29" target="_self">+=</a></em>
+ (<em>joint</em> : <a href="../../sims/dynamics/joints/Joint.html" target="_self">Joint</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Fuegt dieser Welt ein vorangefertigtes System vaus Koerpern und Verbindungen hinzu.</div>
+ <div>Fuegt dieser Welt eine Verbindung hinzu.</div>
</td>
</tr>
<tr>
@@ -224,10 +224,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.dynamics.joints.Joint%29" target="_self">+=</a></em>
- (<em>joint</em> : <a href="../../sims/dynamics/joints/Joint.html" target="_self">Joint</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#%2B%3D%28sims.dynamics.Body%29" target="_self">+=</a></em>
+ (<em>body</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Fuegt dieser Welt eine Verbindung hinzu.</div>
+ <div>Fuegt dieser Welt einen Koerper hinzu.</div>
</td>
</tr>
<tr>
@@ -246,10 +246,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#-%3D%28sims.dynamics.Body%29" target="_self">-=</a></em>
- (<em>body</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#-%3D%28sims.prefabs.Prefab%29" target="_self">-=</a></em>
+ (<em>p</em> : <a href="../../sims/prefabs/Prefab.html" target="_self">Prefab</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Entfernt den gegebenen Koerper aus dieser Welt.</div>
+ <div>Entfernt das gegebene System aus Koerpern und Verbindungen aus dieser Welt.</div>
</td>
</tr>
<tr>
@@ -257,10 +257,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#-%3D%28sims.dynamics.joints.Joint%29" target="_self">-=</a></em>
- (<em>joint</em> : <a href="../../sims/dynamics/joints/Joint.html" target="_self">Joint</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#-%3D%28sims.dynamics.Body%29" target="_self">-=</a></em>
+ (<em>body</em> : <a href="../../sims/dynamics/Body.html" target="_self">Body</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Entfernt die gegebene Verbindung aus dieser Welt.</div>
+ <div>Entfernt den gegebenen Koerper aus dieser Welt.</div>
</td>
</tr>
<tr>
@@ -268,10 +268,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/dynamics/World.html#-%3D%28sims.prefabs.Prefab%29" target="_self">-=</a></em>
- (<em>p</em> : <a href="../../sims/prefabs/Prefab.html" target="_self">Prefab</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
+ <em><a href="../../sims/dynamics/World.html#-%3D%28sims.dynamics.joints.Joint%29" target="_self">-=</a></em>
+ (<em>joint</em> : <a href="../../sims/dynamics/joints/Joint.html" target="_self">Joint</a>) : <a href="http://www.scala-lang.org/docu/files/api/scala/Unit.html" target="_self">Unit</a>
- <div>Entfernt das gegebene System aus Koerpern und Verbindungen aus dieser Welt.</div>
+ <div>Entfernt die gegebene Verbindung aus dieser Welt.</div>
</td>
</tr>
<tr>
diff --git a/doc/sims/dynamics/joints/SpringJoint.html b/doc/sims/dynamics/joints/SpringJoint.html
index ba601bb..b361835 100644
--- a/doc/sims/dynamics/joints/SpringJoint.html
+++ b/doc/sims/dynamics/joints/SpringJoint.html
@@ -55,8 +55,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../../sims/dynamics/joints/SpringJoint.html#this%28sims.dynamics.Body%2Csims.dynamics.Body%2CDouble%2CDouble%29" target="_self">this</a></em>
- (<em>node1</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>node2</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>springConstant</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>, <em>initialLength</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>) : <a href="../../../sims/dynamics/joints/SpringJoint.html" target="_self">SpringJoint</a>
+ <em><a href="../../../sims/dynamics/joints/SpringJoint.html#this%28sims.dynamics.Body%2Csims.geometry.Vector2D%2Csims.dynamics.Body%2Csims.geometry.Vector2D%2CDouble%29" target="_self">this</a></em>
+ (<em>node1</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>anchor1</em> : <a href="../../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>, <em>node2</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>anchor2</em> : <a href="../../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>, <em>springConstant</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>) : <a href="../../../sims/dynamics/joints/SpringJoint.html" target="_self">SpringJoint</a>
</td>
@@ -66,8 +66,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../../sims/dynamics/joints/SpringJoint.html#this%28sims.dynamics.Body%2Csims.geometry.Vector2D%2Csims.dynamics.Body%2Csims.geometry.Vector2D%2CDouble%29" target="_self">this</a></em>
- (<em>node1</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>anchor1</em> : <a href="../../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>, <em>node2</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>anchor2</em> : <a href="../../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>, <em>springConstant</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>) : <a href="../../../sims/dynamics/joints/SpringJoint.html" target="_self">SpringJoint</a>
+ <em><a href="../../../sims/dynamics/joints/SpringJoint.html#this%28sims.dynamics.Body%2Csims.dynamics.Body%2CDouble%2CDouble%29" target="_self">this</a></em>
+ (<em>node1</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>node2</em> : <a href="../../../sims/dynamics/Body.html" target="_self">Body</a>, <em>springConstant</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>, <em>initialLength</em> : <a href="http://www.scala-lang.org/docu/files/api/scala/Double.html" target="_self">Double</a>) : <a href="../../../sims/dynamics/joints/SpringJoint.html" target="_self">SpringJoint</a>
</td>
diff --git a/doc/sims/math/Matrix22.html b/doc/sims/math/Matrix22.html
index fe05b63..b3a5906 100644
--- a/doc/sims/math/Matrix22.html
+++ b/doc/sims/math/Matrix22.html
@@ -72,10 +72,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/math/Matrix22.html#*%28sims.math.Matrix22%29" target="_self">*</a></em>
- (<em>m</em> : <a href="../../sims/math/Matrix22.html" target="_self">Matrix22</a>) : <a href="../../sims/math/Matrix22.html" target="_self">Matrix22</a>
+ <em><a href="../../sims/math/Matrix22.html#*%28sims.geometry.Vector2D%29" target="_self">*</a></em>
+ (<em>v</em> : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
- <div>Multiplikation mit einer anderen 2x2-Matrix.</div>
+ <div>Multiplikation mit einer 2x1-Matrix (2-dimensionaler Vektor).</div>
</td>
</tr>
<tr>
@@ -83,10 +83,10 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/math/Matrix22.html#*%28sims.geometry.Vector2D%29" target="_self">*</a></em>
- (<em>v</em> : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
+ <em><a href="../../sims/math/Matrix22.html#*%28sims.math.Matrix22%29" target="_self">*</a></em>
+ (<em>m</em> : <a href="../../sims/math/Matrix22.html" target="_self">Matrix22</a>) : <a href="../../sims/math/Matrix22.html" target="_self">Matrix22</a>
- <div>Multiplikation mit einer 2x1-Matrix (2-dimensionaler Vektor).</div>
+ <div>Multiplikation mit einer anderen 2x2-Matrix.</div>
</td>
</tr>
<tr>
diff --git a/doc/sims/prefabs/Ragdoll.html b/doc/sims/prefabs/Ragdoll.html
index f7cc846..0ae14d2 100644
--- a/doc/sims/prefabs/Ragdoll.html
+++ b/doc/sims/prefabs/Ragdoll.html
@@ -131,7 +131,7 @@
</td>
<td class="signature">
<em><a href="../../sims/prefabs/Ragdoll.html#joints" target="_self">joints</a></em>
- : <a href="" target="contentFrame" class="scala/List">scala.List</a>[<a href="../../sims/dynamics/joints/RevoluteJoint.html" target="_self">RevoluteJoint</a>]
+ : <a href="#Nil" target="contentFrame" class="scala">scala.Nil</a>
</td>
@@ -402,7 +402,7 @@
<code>override</code>
<code>val</code>
- <em>joints</em> : <a href="" target="contentFrame" class="scala/List">scala.List</a>[<a href="../../sims/dynamics/joints/RevoluteJoint.html" target="_self">RevoluteJoint</a>]
+ <em>joints</em> : <a href="#Nil" target="contentFrame" class="scala">scala.Nil</a>
</dt>
<dd></dd>
</dl><dl>
diff --git a/doc/sims/util/RelativeVector.html b/doc/sims/util/RelativeVector.html
index ed726df..323edb5 100644
--- a/doc/sims/util/RelativeVector.html
+++ b/doc/sims/util/RelativeVector.html
@@ -87,8 +87,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/util/RelativeVector.html#from%28sims.dynamics.Shape%29" target="_self">from</a></em>
- (<em>s</em> : <a href="../../sims/dynamics/Shape.html" target="_self">Shape</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
+ <em><a href="../../sims/util/RelativeVector.html#from%28sims.geometry.Vector2D%29" target="_self">from</a></em>
+ (<em>point</em> : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
</td>
@@ -98,8 +98,8 @@
<code> def</code>
</td>
<td class="signature">
- <em><a href="../../sims/util/RelativeVector.html#from%28sims.geometry.Vector2D%29" target="_self">from</a></em>
- (<em>point</em> : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
+ <em><a href="../../sims/util/RelativeVector.html#from%28sims.dynamics.Shape%29" target="_self">from</a></em>
+ (<em>s</em> : <a href="../../sims/dynamics/Shape.html" target="_self">Shape</a>) : <a href="../../sims/geometry/Vector2D.html" target="_self">Vector2D</a>
</td>
diff --git a/src/graphyx/Graphyx.scala b/src/graphyx/Graphyx.scala
index 81a8ee8..01caea8 100644
--- a/src/graphyx/Graphyx.scala
+++ b/src/graphyx/Graphyx.scala
@@ -18,7 +18,10 @@ object Graphyx{
CompositeShape,
Joints1,
Joints2,
+ Spring,
+ Atom,
Chain,
+ Wave,
Stacking,
BallStack,
Cup,
diff --git a/src/graphyx/graphics/GraphicalShape.scala b/src/graphyx/graphics/GraphicalShape.scala
index e6f61a7..256c041 100644
--- a/src/graphyx/graphics/GraphicalShape.scala
+++ b/src/graphyx/graphics/GraphicalShape.scala
@@ -7,8 +7,8 @@
package graphyx.graphics
import sims.dynamics._
-trait GraphicalShape extends Shape with GraphicalObject{
- val real: Shape
+trait GraphicalShape extends Shape with GraphicalObject{
+ val real: Shape
override val uid: Int = real.uid
pos = real.pos
rotation = real.rotation
diff --git a/src/graphyx/graphics/Parser.scala b/src/graphyx/graphics/Parser.scala
index 7871ae8..9468d16 100644
--- a/src/graphyx/graphics/Parser.scala
+++ b/src/graphyx/graphics/Parser.scala
@@ -24,7 +24,8 @@ object Parser {
case j: DistanceJoint => GraphicalDistanceJoint(j)
case j: SpringJoint => GraphicalSpringJoint(j)
case j: RevoluteJoint => GraphicalRevoluteJoint(j)
- case _ => throw new IllegalArgumentException("Cannot cast '" + real.getClass + "' to a graphical object.")
+ case j: Joint => if (!throwOnUnknown) new GraphicalJoint{override val real = j; def draw = ()}
+ else throw new IllegalArgumentException("Cannot cast '" + real.getClass + "' to a graphical object.")
}
def toGraphical(real: Collision) = GraphicalCollision(real)
diff --git a/src/graphyx/gui/AboutHelpFrame.scala b/src/graphyx/gui/AboutHelpFrame.scala
index 5afa58e..4dba9f1 100644
--- a/src/graphyx/gui/AboutHelpFrame.scala
+++ b/src/graphyx/gui/AboutHelpFrame.scala
@@ -14,7 +14,7 @@ class AboutHelpFrame extends Frame {
|SiMS and Graphyx are made available under the MIT License
|
|http://sourceforge.net/projects/simplemechanics/""".stripMargin
- )
+ ) {editable = false}
}
object AboutHelpFrame {
diff --git a/src/graphyx/gui/OptionsPanel.scala b/src/graphyx/gui/OptionsPanel.scala
index 3ec3921..525f352 100644
--- a/src/graphyx/gui/OptionsPanel.scala
+++ b/src/graphyx/gui/OptionsPanel.scala
@@ -13,7 +13,7 @@ import scala.swing._
import scala.swing.event._
import GridBagPanel._
-class OptionsPanel(container: Container) extends GridPanel(11,2){
+class OptionsPanel(container: Container) extends GridPanel(12,2){
/*
val c = new Constraints
c.anchor = Anchor.West
@@ -55,6 +55,9 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){
val lblDrawCollisions = new Label("Collisions")
val chckDrawCollisions = new CheckBox {selected = false}
+ val lblTrace = new Label("Trace")
+ val chckTrace = new CheckBox {selected = false}
+
val components = List(
lblTimeStep, txtTimeStep,
lblIterations, txtIterations,
@@ -66,7 +69,8 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){
lblDrawJoints, chckDrawJoints,
lblDrawAABBs, chckDrawAABBs,
lblDrawPairs, chckDrawPairs,
- lblDrawCollisions, chckDrawCollisions
+ lblDrawCollisions, chckDrawCollisions,
+ lblTrace, chckTrace
)
contents ++= components
listenTo(components: _*)
@@ -82,6 +86,7 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){
case ButtonClicked(`chckDrawAABBs`) => container.mainFrame.mainPanel.worldPanel.drawAABBs = chckDrawAABBs.selected
case ButtonClicked(`chckDrawPairs`) => container.mainFrame.mainPanel.worldPanel.drawPairs = chckDrawPairs.selected
case ButtonClicked(`chckDrawCollisions`) => container.mainFrame.mainPanel.worldPanel.drawCollisions = chckDrawCollisions.selected
+ case ButtonClicked(`chckTrace`) => container.mainFrame.mainPanel.worldPanel.trace = chckTrace.selected
}
def update() = {
@@ -97,6 +102,7 @@ class OptionsPanel(container: Container) extends GridPanel(11,2){
chckDrawAABBs.selected = container.mainFrame.mainPanel.worldPanel.drawAABBs
chckDrawPairs.selected = container.mainFrame.mainPanel.worldPanel.drawPairs
chckDrawCollisions.selected = container.mainFrame.mainPanel.worldPanel.drawCollisions
+ chckTrace.selected = container.mainFrame.mainPanel.worldPanel.trace
}
diff --git a/src/graphyx/gui/WorldPanel.scala b/src/graphyx/gui/WorldPanel.scala
index 13765e5..cd91f00 100644
--- a/src/graphyx/gui/WorldPanel.scala
+++ b/src/graphyx/gui/WorldPanel.scala
@@ -42,6 +42,7 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){
var drawAABBs = false
var drawPairs = false
var drawCollisions = false
+ var trace = false
override def paintComponent(g: java.awt.Graphics) = {
var parts: Seq[graphyx.graphics.Drawable] = Seq()
@@ -55,6 +56,7 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){
drawAxes(g)
g.translate(offset.x.toInt, -offset.y.toInt)
drawParts(parts, g)
+ if (trace) trace(scene.shapes, g)
g.translate(-offset.x.toInt, offset.y.toInt)
}
@@ -80,6 +82,30 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){
}
}
+ import collection.mutable._
+ val prevPos: collection.mutable.Map[Int, collection.mutable.Queue[Vector2D]] = Map()
+ def trace(shapes: Iterable[graphics.GraphicalShape], g: java.awt.Graphics) = {
+ for (s <- shapes) {
+ s.g = g
+ s.windowHeight = super.size.height
+ s.ppm = ppm
+ s.scale = this.scale
+
+
+ if (!prevPos.contains(s.uid)) prevPos += (s.uid -> new Queue[Vector2D])
+ else {
+ prevPos(s.uid).enqueue(s.pos)
+ for(i <- 0 until prevPos(s.uid).length - 1) {
+ val sp = prevPos(s.uid)(i)
+ val ep = prevPos(s.uid)(i + 1)
+ s.g.setColor(java.awt.Color.cyan)
+ s.drawLine(sp, ep)
+ }
+ if (prevPos(s.uid).length == 50) prevPos(s.uid).dequeue
+ }
+ }
+ }
+
def getBody(p: Vector2D): Option[Body] = {
val shape = scene.shapes.find(_.contains(p))
if (shape != None) Some(shape.get.real.body)
@@ -106,8 +132,10 @@ class WorldPanel(container: Container) extends BoxPanel(Orientation.Vertical){
case MousePressed(c,p,x,y,b) => {
mousePressed = true; startPoint = p; endPoint = p
x match {
- case 1024 if (getBody(p) != None) => grab(getBody(p).get, p)
+ case 1024 if (getBody(p) != None) => grab(getBody(p).get, p)
+ case 1152 if (getBody(p) != None) => {grabbedBody = Some(new GrabbedBody(getBody(p).get, p)); popup.body = grabbedBody.get.body; popup.peer.setLocation(p); popup.visible = true}
case 4096 if (getBody(p) != None) => {grabbedBody = Some(new GrabbedBody(getBody(p).get, p)); popup.body = grabbedBody.get.body; popup.peer.setLocation(p); popup.visible = true}
+ case _ => ()
}
}
diff --git a/src/graphyx/tests/Atom.scala b/src/graphyx/tests/Atom.scala
new file mode 100644
index 0000000..84fe05c
--- /dev/null
+++ b/src/graphyx/tests/Atom.scala
@@ -0,0 +1,35 @@
+package graphyx.tests
+
+import sims.dynamics._
+import sims.dynamics.joints._
+import sims.geometry._
+
+object Atom extends Test{
+ val title = "Atom"
+ val world = new World
+
+ var nucleus = new Body(Circle(0.05, 1000)) {fixed = true}
+ var electrons: List[Body] = Nil
+ var connections: List[SpringJoint] = Nil
+
+ def init = {
+ world -= nucleus
+ nucleus = new Body(Circle(0.05, 10)) {fixed = true}
+ world += nucleus
+ world --= electrons
+ electrons = Nil
+ for (c <- connections) world -= c
+ connections = Nil
+ }
+
+ override def fireEvent = {
+ val e = (new Circle(0.1, 10) {pos = Vector2D(0, -1)}).asBody
+ e.linearVelocity = Vector2D(-50,100)
+ electrons = e :: electrons
+ world += e
+
+ val c = new SpringJoint(nucleus, e, 500)
+ connections = c :: connections
+ world += c
+ }
+}
diff --git a/src/graphyx/tests/Spring.scala b/src/graphyx/tests/Spring.scala
new file mode 100644
index 0000000..4eec8de
--- /dev/null
+++ b/src/graphyx/tests/Spring.scala
@@ -0,0 +1,32 @@
+package graphyx.tests
+
+import sims.dynamics._
+import sims.dynamics.joints._
+import sims.geometry._
+import java.io._
+
+object Spring extends Test{
+ val title = "Spring"
+ val fout = new java.io.FileOutputStream("out.csv")
+ val sout = new java.io.PrintStream(fout)
+ val world = new World {
+ override def postStep = {
+ //for (b <- bodies; if (b.monitor)) sout.println(monitors(0)._2(b))
+ }
+ }
+
+ def init = {
+ val anchor = Circle(0.05, 10).asBody
+ anchor.fixed = true
+ val particle = (new Circle(0.1, 10) {pos = Vector2D(0, -1)}).asBody
+ val spring = new SpringJoint(anchor, particle, 500, 0.6)
+ //val spring = new PrismaticJoint(anchor, particle)
+ spring.damping = 1
+ particle.monitor = true
+ world.monitors += ("", _.pos.y.toString)
+
+ world += anchor
+ world += particle
+ world += spring
+ }
+}
diff --git a/src/graphyx/tests/Wave.scala b/src/graphyx/tests/Wave.scala
new file mode 100644
index 0000000..62ec194
--- /dev/null
+++ b/src/graphyx/tests/Wave.scala
@@ -0,0 +1,27 @@
+package graphyx.tests
+
+import sims.dynamics._
+import sims.dynamics.joints._
+import sims.dynamics.joints.test._
+import sims.geometry._
+
+object Wave extends Test{
+ val title = "Wave"
+ val world = new World {gravity = Vector2D.Null}
+
+ def init = {
+ val n = 50
+ val anchors = for (i <- (0 to n).toList) yield (new Body(new Circle(0.01,1) {pos = Vector2D(0.4 * i, 5)}) {fixed = true})
+ val particles = for (i <- (0 to n).toList) yield (new Body(new Circle(0.1,10) {pos = Vector2D(0.4 * i, 0)}))
+ val rails = (for (i <- (0 to n).toList) yield (new PrismaticJoint(anchors(i), particles(i))))
+ val springs = (for (i <- (0 to n).toList) yield (new SpringJoint(anchors(i), particles(i), 5)))// {damping = 0.00}))
+ world ++= anchors
+ world ++= particles
+ for (j <- rails ++ springs) world += j
+
+ val lateralSprings = (for (i <- (0 to (n - 1)).toList) yield (new SpringJoint(particles(i), particles(i + 1), 50.0)))
+ for (j <- lateralSprings) world += j
+
+ }
+
+}
diff --git a/src/sims/collision/PolyCollision.scala b/src/sims/collision/PolyCollision.scala
index bbe5568..3eeb7ca 100644
--- a/src/sims/collision/PolyCollision.scala
+++ b/src/sims/collision/PolyCollision.scala
@@ -40,11 +40,15 @@ case class PolyCollision(p1: ConvexPolygon, p2: ConvexPolygon) extends Collision
lazy val shape2 = incPoly.asInstanceOf[Shape]
lazy val normal = refPoly.sides(minOverlap.sideNum).n0
- lazy val points = (for (v <- incPoly.vertices; if refPoly.contains(v)) yield v) ++
+ lazy val points = (for (v <- incPoly.vertices; if refPoly.contains(v)) yield v)++
+ (for (v <- refPoly.vertices; if incPoly.contains(v)) yield v)
+
+ /* ++
(for (s <- incPoly.sides;
val clip = s.clipToSegment(refPoly.sides((refPoly.sides.length - (minOverlap.sideNum + 1)) % refPoly.sides.length));
if (clip != None)) yield clip.get) ++
(for (s <- incPoly.sides;
val clip = s.clipToSegment(refPoly.sides((refPoly.sides.length - (minOverlap.sideNum - 1)) % refPoly.sides.length));
if (clip != None)) yield clip.get)
+ */
}
diff --git a/src/sims/dynamics/World.scala b/src/sims/dynamics/World.scala
index d7ac8ae..7b165f5 100644
--- a/src/sims/dynamics/World.scala
+++ b/src/sims/dynamics/World.scala
@@ -67,7 +67,7 @@ class World {
for (j <- p.joints) this += j
}
- def ++=(bs: Seq[Body]) = for(b <- bs) this += b
+ def ++=(bs: Seq[Body]): Unit = for(b <- bs) this += b
/**Entfernt den gegebenen Koerper aus dieser Welt.*/
def -=(body: Body): Unit = bodies -= body
diff --git a/src/sims/dynamics/joints/SpringJoint.scala b/src/sims/dynamics/joints/SpringJoint.scala
index f03b35d..67ea57f 100644
--- a/src/sims/dynamics/joints/SpringJoint.scala
+++ b/src/sims/dynamics/joints/SpringJoint.scala
@@ -46,15 +46,39 @@ case class SpringJoint(node1: Body, anchor1: Vector2D, node2: Body, anchor2: Vec
/**Relative Position der Bindungspunkte.*/
def x = connection2 - connection1
+ /**Relative Geschwindigkeit der Bindungspunkte.*/
+ def v = node2.velocityOfPoint(connection2) - node1.velocityOfPoint(connection1)
+
/**Ergibt die Federkraft nach dem Hookschen Gesetz.*/
def force = (x.length - initialLength) * springConstant
/**Uebt die Federkraft auf die Bindungspunkte aus.*/
def applyForce() = {
- node1.applyForce(x.unit * force - ((node1 velocityOfPoint connection1) * damping) project x, connection1)
- node2.applyForce(-x.unit * force - ((node2 velocityOfPoint connection2) * damping) project x, connection2)
+ node1.applyForce(x.unit * force - (v * damping) project x, connection1)
+ node2.applyForce(-x.unit * force - (v * damping) project x, connection2)
+ //println("this should not happen")
}
- def correctPosition(h: Double) = ()
- def correctVelocity(h: Double) = ()
+ def correctVelocity(h: Double) = {
+ /*
+ val x = this.x //relativer Abstand
+ val v = this.v //relative Geschwindigkeit
+ val r1 = (connection1 - node1.pos) //Abstand Punkt-Schwerpunkt, Koerper 1
+ val r2 = (connection2 - node2.pos) //Abstand Punkt-Schwerpunkt, Koerper 2
+ val cr1 = r1 cross x.unit //Kreuzprodukt
+ val cr2 = r2 cross x.unit //Kreuzprodukt
+ val Cdot = x.unit dot v //Velocity-Constraint
+ val invMass = 1/node1.mass + 1/node1.I * cr1 * cr1 + 1/node2.mass + 1/node2.I * cr2 * cr2 //=J M^-1 JT
+ val m = if (invMass == 0.0) 0.0 else 1/invMass //Test um Nulldivision zu vermeiden
+ val lambda = Math.min(Math.max(-this.force * h, (-m * Cdot)), this.force * h)
+ println (force * h, -m * Cdot)
+ val impulse = x.unit * lambda
+ node1.applyImpulse(-impulse, connection1)
+ node2.applyImpulse(impulse, connection2)
+ */
+ }
+
+ def correctPosition(h: Double) = {
+
+ }
} \ No newline at end of file
diff --git a/src/sims/dynamics/joints/test/PrismaticJoint.scala b/src/sims/dynamics/joints/test/PrismaticJoint.scala
new file mode 100644
index 0000000..f163261
--- /dev/null
+++ b/src/sims/dynamics/joints/test/PrismaticJoint.scala
@@ -0,0 +1,84 @@
+package sims.dynamics.joints.test
+
+import sims.geometry._
+
+case class PrismaticJoint(node1: Body, anchor1: Vector2D, node2: Body, anchor2: Vector2D) extends Joint{
+ def this(node1: Body, node2: Body) = this(node1, node1.pos, node2, node2.pos)
+
+ val angle = node2.rotation - node1.rotation
+
+ private val a1 = anchor1 - node1.pos
+ private val a2 = anchor2 - node2.pos
+ private val initRotation1 = node1.rotation
+ private val initRotation2 = node2.rotation
+
+ def connection1 = (a1 rotate (node1.rotation - initRotation1)) + node1.pos
+ def connection2 = (a2 rotate (node2.rotation - initRotation2)) + node2.pos
+
+ /**Relative Position der Bindungspunkte.*/
+ def x = connection2 - connection1
+
+ /**Relative Geschwindigkeit der Bindungspunkte.*/
+ def v = node2.velocityOfPoint(connection2) - node1.velocityOfPoint(connection1)
+
+
+ def correctVelocity(h: Double) = {
+ correctLinear(h)
+ //correctAngular(h)
+ }
+
+ def correctLinear(h: Double) = {
+ val x = this.x.unit //relativer Abstand
+ val n0 = x.leftNormal
+ val v = this.v //relative Geschwindigkeit
+ val r1 = (connection1 - node1.pos) //Abstand Punkt-Schwerpunkt, Koerper 1
+ val r2 = (connection2 - node2.pos) //Abstand Punkt-Schwerpunkt, Koerper 2
+ val cr1 = r1 cross n0 //Kreuzprodukt
+ val cr2 = r2 cross n0 //Kreuzprodukt
+ val Cdot = n0 dot v
+ val invMass = 1/node1.mass + 1/node1.I * cr1 * cr1 + 1/node2.mass + 1/node2.I * cr2 * cr2
+ val m = if (invMass == 0.0) 0.0 else 1/invMass
+ val impulse = -n0 * m * Cdot
+ node1.applyImpulse(-impulse, connection1)
+ node2.applyImpulse(impulse, connection2)
+ }
+
+ //J=[-1,1]
+
+ def correctAngular(h: Double) = {
+ val w = node2.angularVelocity - node1.angularVelocity
+ val Cdot = w
+ val invMass = node1.I + node2.I
+ val m = 1 / invMass
+ val lambda = m * Cdot
+ node1.angularVelocity += lambda / node1.I
+ node2.angularVelocity += -lambda / node2.I
+ }
+
+ def correctPosition(h: Double) = {
+ /*
+ val x = this.x.unit //relativer Abstand
+ val n0 = x.leftNormal
+ val v = this.v //relative Geschwindigkeit
+ val r1 = (connection1 - node1.pos) //Abstand Punkt-Schwerpunkt, Koerper 1
+ val r2 = (connection2 - node2.pos) //Abstand Punkt-Schwerpunkt, Koerper 2
+ val cr1 = r1 cross n0 //Kreuzprodukt
+ val cr2 = r2 cross n0 //Kreuzprodukt
+ val C = n0 dot x
+ val invMass = 1/node1.mass + 1/node1.I * cr1 * cr1 + 1/node2.mass + 1/node2.I * cr2 * cr2
+ val m = if (invMass == 0.0) 0.0 else 1/invMass
+ val impulse = -n0 * m * C
+ node1.pos += -impulse
+ node1.rotation += -impulse cross r1
+ node2.pos += impulse
+ node2.rotation += impulse cross r2
+
+ val relOmega = node2.angularVelocity - node2.angularVelocity
+ val invMassOmega = node1.I + node2.I
+ val mOmega = if (invMassOmega == 0.0) 0.0 else 1/invMassOmega
+ val Crot = node2.rotation - node2.rotation + angle
+ node1.rotation += mOmega * Crot
+ node2.rotation += -mOmega * Crot
+ */
+ }
+}
diff --git a/src/sims/materials/Material.scala b/src/sims/materials/Material.scala
new file mode 100644
index 0000000..b05e082
--- /dev/null
+++ b/src/sims/materials/Material.scala
@@ -0,0 +1,7 @@
+package sims.materials
+
+trait Material {
+ val density: Double
+ val restitution: Double
+ val friction: Double
+}
diff --git a/src/sims/materials/Rubber.scala b/src/sims/materials/Rubber.scala
new file mode 100644
index 0000000..b408d2d
--- /dev/null
+++ b/src/sims/materials/Rubber.scala
@@ -0,0 +1,5 @@
+package sims.materials
+
+object Rubber {
+
+}
diff --git a/src/sims/materials/Steel.scala b/src/sims/materials/Steel.scala
new file mode 100644
index 0000000..71594b8
--- /dev/null
+++ b/src/sims/materials/Steel.scala
@@ -0,0 +1,5 @@
+package sims.materials
+
+object Steel {
+
+}
diff --git a/src/sims/prefabs/Ragdoll.scala b/src/sims/prefabs/Ragdoll.scala
index ad58653..00e4b8d 100644
--- a/src/sims/prefabs/Ragdoll.scala
+++ b/src/sims/prefabs/Ragdoll.scala
@@ -38,6 +38,6 @@ class Ragdoll(position: Vector2D) extends Prefab {
val shoulder1 = RevoluteJoint(headTorso, upperArm1, position + Vector2D(0, -0.16))
val shoulder2 = RevoluteJoint(headTorso, upperArm2, position + Vector2D(0, -0.16))
- override val joints = List(shoulder1, shoulder2)
+ override val joints = Nil //List(shoulder1, shoulder2)
}