package edu.stanford.rsl.conrad.geometry.shapes.compound;
import edu.stanford.rsl.conrad.geometry.AbstractShape;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
/**
* Class to model an LinearOctree which uses either CompoundShapes or LinearOctrees as nodes. If the size of the CompoundShape is greater than MAX_NODE_SIZE the node is transformed to a LinearOctree.
* @author akmaier
*
*/
public class NestedOctree extends LinearOctree {
/**
*
*/
private static final long serialVersionUID = 577772012630565223L;
private static final int MAX_NODE_SIZE = 50;
public NestedOctree(PointND center) {
super(center);
}
public NestedOctree(PointND min, PointND max) {
super(min, max);
}
public NestedOctree(PointND min, PointND max, double nextRandom) {
super(min, max, nextRandom);
}
public NestedOctree(NestedOctree no){
super(no);
}
private boolean isUnbalanced(){
int totalSize = this.size();
if (octant1.size() == totalSize) return true;
if (octant2.size() == totalSize) return true;
if (octant3.size() == totalSize) return true;
if (octant4.size() == totalSize) return true;
if (octant5.size() == totalSize) return true;
if (octant6.size() == totalSize) return true;
if (octant7.size() == totalSize) return true;
if (octant8.size() == totalSize) return true;
return false;
}
@Override
protected synchronized void init(){
if (dirty){
if (octant1.size() > MAX_NODE_SIZE){
if (!(octant1 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant1.getMin(), octant1.getMax());
//System.out.println("New tree size: " + octant1.size());
tree.addAll(octant1);
if (!tree.isUnbalanced()) {
tree.init();
octant1 = tree;
}
}
}
if (octant2.size() > MAX_NODE_SIZE){
if (!(octant2 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant2.getMin(), octant2.getMax());
tree.addAll(octant2);
if (!tree.isUnbalanced()) {
tree.init();
octant2 = tree;
}
}
}
if (octant3.size() > MAX_NODE_SIZE){
if (!(octant3 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant3.getMin(), octant3.getMax());
tree.addAll(octant3);
if (!tree.isUnbalanced()) {
tree.init();
octant3 = tree;
}
}
}
if (octant4.size() > MAX_NODE_SIZE){
if (!(octant4 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant4.getMin(), octant4.getMax());
tree.addAll(octant4);
if (!tree.isUnbalanced()) {
tree.init();
octant4 = tree;
}
}
}
if (octant5.size() > MAX_NODE_SIZE){
if (!(octant5 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant5.getMin(), octant5.getMax());
tree.addAll(octant5);
if (!tree.isUnbalanced()) {
tree.init();
octant5 = tree;
}
}
}
if (octant6.size() > MAX_NODE_SIZE){
if (!(octant6 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant6.getMin(), octant6.getMax());
tree.addAll(octant6);
if (!tree.isUnbalanced()) {
tree.init();
octant6 = tree;
}
}
}
if (octant7.size() > MAX_NODE_SIZE){
if (!(octant7 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant7.getMin(), octant7.getMax());
tree.addAll(octant7);
if (!tree.isUnbalanced()) {
tree.init();
octant7 = tree;
}
}
}
if (octant8.size() > MAX_NODE_SIZE){
if (!(octant8 instanceof NestedOctree)) {
NestedOctree tree = new NestedOctree(octant8.getMin(), octant8.getMax());
tree.addAll(octant8);
if (!tree.isUnbalanced()) {
tree.init();
octant8 = tree;
}
}
}
super.init();
}
}
@Override
public AbstractShape clone() {
return new NestedOctree(this);
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/