blob: d3f4d5747d70ff1ff12025cfd824710da054cc2f (
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
41
42
43
44
45
46
47
|
/*
* Simple Mechanics Simulator (SiMS)
* copyright (c) 2009 Jakob Odersky
* made available under the MIT License
*/
package sims.prefabs
import sims.geometry._
import sims.dynamics._
import sims.dynamics.joints._
class Net(width: Int, height: Int, initPos: Vector2D) extends Prefab {
val nodeDistance: Double = 0.2
val nodeRadius: Double = 0.05
val nodeDensity: Double = 4
val springConstant: Double = 50
val springDamping: Double = 0
private val connectors: Array[Array[Body]] =
makeConnectors(width, height)
override val bodies: List[Body] = for (row <- connectors.toList; elem <- row) yield elem
override val joints = connect(connectors)
private def makeConnectors(w: Int, h: Int): Array[Array[Body]] = {
for(i <- (0 until w).toArray[Int]) yield
for(j <- (0 until h).toArray[Int]) yield
new Body(new Circle(nodeRadius, nodeDensity) {pos = Vector2D(nodeDistance * i, nodeDistance * j) + initPos})
}
private def connect(connectors: Array[Array[Body]]): List[DistanceJoint] = {
var r: List[DistanceJoint] = Nil
for(i <- 0 to connectors.length - 1; j <- 0 to connectors(i).length - 1) {
if (i > 0)
r = connect(connectors(i-1)(j),connectors(i)(j)) :: r
if (j > 0)
r = connect(connectors(i)(j-1),connectors(i)(j)) :: r
}
r
}
private def connect(s1: Body, s2: Body): DistanceJoint =
new DistanceJoint(s1, s1.pos, s2, s2.pos)
}
|