summaryrefslogtreecommitdiff
path: root/src/graphyx
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 /src/graphyx
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.
Diffstat (limited to 'src/graphyx')
-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
9 files changed, 139 insertions, 7 deletions
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
+
+ }
+
+}