1 package cz.cuni.amis.pogamut.defcon.utils.quadtree;
2
3 import java.util.NoSuchElementException;
4
5
6
7
8
9
10
11 public class DepthLimitedQuadTreePostorderIterator extends
12 QuadTreePostorderIterator {
13
14 private int maxDepth;
15
16
17
18
19
20
21
22 public DepthLimitedQuadTreePostorderIterator(QuadTree tree, int maxDepth) {
23 super(tree);
24
25 if (maxDepth <= 0)
26 throw new IllegalArgumentException(
27 "maxDepth argument " + maxDepth + " cannot be <= 0.");
28
29 this.maxDepth = maxDepth;
30 }
31
32 @Override
33 public QuadTreeNode next() {
34
35 if (getNode() == null) {
36 if (isFinished() || getRoot() == null) {
37 throw new NoSuchElementException(
38 "No more elements in iterated QuadTree");
39 } else {
40 setNode(getRoot());
41
42 while (getNode().getNodes() != null
43 && getBranching().size() < maxDepth) {
44 setNode(getNode().getFirst());
45 getBranching().add(0);
46 }
47
48 if (getNode() == getRoot()) {
49 setFinished(true);
50 }
51
52 return getNode();
53 }
54 }
55
56 setNode(getNode().getParent());
57
58 int next = getBranching().pollLast();
59
60 if (next == 3) {
61
62 if (getNode() == getRoot())
63 setFinished(true);
64
65 return getNode();
66 } else {
67
68 getBranching().add(++next);
69 setNode(getNode().getNodes()[next]);
70
71 while (getNode().getNodes() != null
72 && getBranching().size() < maxDepth) {
73 setNode(getNode().getFirst());
74 getBranching().add(0);
75 }
76
77 return getNode();
78 }
79 }
80
81 }