diff options
author | Jakob Odersky <jodersky@gmail.com> | 2009-11-28 20:25:35 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2009-11-28 20:25:35 +0000 |
commit | 5031df4b26afd515274b5ca34f0d5380a99e4223 (patch) | |
tree | 41aac12ec2c03426910de72486a2d87e58cebc44 /src/graphyx | |
parent | fbdf90f0deb14ddd8a457ff1f5f7715e4d3c2f2a (diff) | |
download | sims-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.scala | 3 | ||||
-rw-r--r-- | src/graphyx/graphics/GraphicalShape.scala | 4 | ||||
-rw-r--r-- | src/graphyx/graphics/Parser.scala | 3 | ||||
-rw-r--r-- | src/graphyx/gui/AboutHelpFrame.scala | 2 | ||||
-rw-r--r-- | src/graphyx/gui/OptionsPanel.scala | 10 | ||||
-rw-r--r-- | src/graphyx/gui/WorldPanel.scala | 30 | ||||
-rw-r--r-- | src/graphyx/tests/Atom.scala | 35 | ||||
-rw-r--r-- | src/graphyx/tests/Spring.scala | 32 | ||||
-rw-r--r-- | src/graphyx/tests/Wave.scala | 27 |
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 + + } + +} |