@@ -14,6 +14,8 @@ class ViewController: UIViewController, MetaballDataSource {
1414
1515 var selectedMetaball: Metaball?
1616
17+ let edgeAnimationDuration: Float = 1
18+
1719 override func viewDidLoad() {
1820 super.viewDidLoad()
1921
@@ -28,8 +30,6 @@ class ViewController: UIViewController, MetaballDataSource {
2830 metaballGraph.addEdge(0, 3)
2931 metaballGraph.addEdge(1, 2)
3032 metaballGraph.addEdge(2, 3)
31− metaballGraph.removeEdge(2, 3)
32− print(metaballGraph.adjacencyMatrix)
3333
3434 let border = 20
3535 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
@@ -45,6 +45,41 @@ class ViewController: UIViewController, MetaballDataSource {
4545 metaballView.addSubview(metaball)
4646 }
4747
48+ addEdge(0, 2)
49+
50+ renderer.state = .Running
51+ }
52+
53+ func addEdge(i: Int, _ j: Int) {
54+ animateEdge(i, j, fadeIn: true)
55+ }
56+
57+ func removeEdge(i: Int, _ j: Int) {
58+ animateEdge(i, j, fadeIn: false)
59+ }
60+
61+ func animateEdge(i: Int, _ j: Int, fadeIn: Bool) {
62+ let parameters = EdgeAnimationParameters(startDate: NSDate(), duration: edgeAnimationDuration, fadeIn: fadeIn, i: i, j: j)
63+ NSTimer.scheduledTimerWithTimeInterval(1.0/60.0, target: self, selector: "animateEdgeWithTimer:", userInfo: parameters, repeats: true)
64+ }
65+
66+ func animateEdge(withTimer timer: NSTimer) {
67+ let (animationStart, duration, fadeIn, i, j) = (timer.userInfo as! EdgeAnimationParameters).unpack()
68+
69+ let now = NSDate()
70+ var timeElapsed = Float(now.timeIntervalSinceDate(animationStart))
71+
72+ if timeElapsed > duration {
73+ timer.invalidate()
74+ timeElapsed = duration
75+ }
76+
77+ let linearValue = timeElapsed / duration
78+ let interpolatedValue = fadeIn ? interpolateSquareEaseOut(linearValue) : (1 - interpolateSquareEaseIn(linearValue))
79+
80+ metaballGraph.adjacencyMatrix.set(i, j, value: interpolatedValue)
81+ metaballGraph.adjacencyMatrix.set(j, i, value: interpolatedValue)
82+
4883 renderer.state = .Running
4984 }
5085