View Javadoc

1   package cz.cuni.amis.pogamut.defcon.utils.quadtree;
2   
3   import java.util.NoSuchElementException;
4   
5   /**
6    * Quadtree iterator with a limited depth of access.
7    * 
8    * @author Radek 'Black_Hand' Pibil
9    * 
10   */
11  public class DepthLimitedQuadTreePostorderIterator extends
12  		QuadTreePostorderIterator {
13  
14  	private int maxDepth;
15  
16  	/**
17  	 * Level 1 is root.
18  	 * 
19  	 * @param tree
20  	 * @param maxDepth
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  		} // else node != null
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  }