package org.iplantc.phyloviewer.shared.scene.intersect;
import java.util.HashSet;
import java.util.Set;
import org.iplantc.phyloviewer.shared.layout.ILayoutData;
import org.iplantc.phyloviewer.shared.math.Box2D;
import org.iplantc.phyloviewer.shared.math.Vector2;
import org.iplantc.phyloviewer.shared.model.INode;
public class IntersectTreeBox
{
public static Set<INode> intersect(INode node, ILayoutData layout, Box2D range)
{
Set<INode> result = new HashSet<INode>();
boolean ready = node != null && layout != null && range != null && range.valid();
if (ready)
{
visit(node, layout, range, result);
}
return result;
}
static void visit(INode node, ILayoutData layout, Box2D range, Set<INode> result)
{
Box2D boundingBox = layout.getBoundingBox(node);
Vector2 position = layout.getPosition(node);
if (node != null && boundingBox != null && position != null)
{
boolean nodeInRange = range.contains(position);
if (nodeInRange)
{
result.add(node);
}
if (nodeInRange || boundingBox.intersects(range))
{
traverse(node, layout, range, result);
}
}
}
static void traverse(INode node, ILayoutData layout, Box2D range, Set<INode> result) {
INode[] children = node.getChildren();
if (children != null)
{
for(int i = 0; i < children.length; ++i) {
visit(children[i], layout, range, result);
}
}
}
}