summaryrefslogtreecommitdiff
path: root/src/sims/prefabs/Net.scala
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)
  
}