-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathView.scala
66 lines (57 loc) · 2.07 KB
/
View.scala
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package scalabrot
import Direction._
import java.awt.Graphics2D
import swing.Panel
import scala.collection.mutable.{Queue, ArrayBuffer}
import MandelbrotColor.colorForIters
object View {
class SquareView(val resolution: Int, val field: Square) extends Panel {
val minWidth = 2 * field.halfWidth / resolution
var thisRoot = new SquareTree(field, None)
val todoQueue: Queue[Traversable[RegionTree[Square]]] = new Queue()
var doneTrees: ArrayBuffer[RegionTree[Square]] = new ArrayBuffer()
def init {
thisRoot = new SquareTree(field, None)
doneTrees = new ArrayBuffer()
thisRoot.divide
for (b <- thisRoot.branches) {
b.divide
for (c <- b.branches) {
c.divide
todoQueue += c.branches
}
}
}
def solve = {
while (!todoQueue.isEmpty) {
var group = todoQueue.dequeue()
divideIfNeeded(group)
}
}
// If a leaf needs to be subdivided, then all of its cousins need to be reexamined
def divideIfNeeded(group: Traversable[RegionTree[Square]]) {
for (tree <- group) {
if (tree.leaf & (tree.region.halfWidth.toDouble * 2 > minWidth)) {
val cousins = tree.cousins(field)
if (cousins.exists(_.iters != tree.iters)) {
tree.divide
todoQueue += cousins
todoQueue += tree.branches
} else {
doneTrees += tree
}
} else {
doneTrees += tree
}
}
}
override def paint(g: Graphics2D) {
for (tree <- doneTrees) {
if (tree.leaf) {
g.setColor(colorForIters(tree.iters))
tree.region.paint(g, field.north, field.east, resolution, 2 * field.halfWidth)
}
}
}
}
}