package fragmenter;

import Jama.Matrix;

import java.util.*;

import util.Model;
import geometric.Triangle;

/**
 * This class provides a segmentation algorithm, splitting the given mesh in 8 equal parts by the 3 axis
 * aligned planes defined by a center.
 * 
 */
public class BBOctFragmenter extends Fragmenter{
	private Matrix center;

	public BBOctFragmenter(Matrix center) {
		this.center = center;
	}

	@Override
	public void doFragmentation(Model mod) {
		List<Model> lst = new LinkedList<Model>();
		lst.add(mod);
		for (int i = 0; i < 3; i++) {
			lst = splitModels(lst, i);
		}
		Model[] tmp = new Model[0];
		fragments = lst.toArray(tmp);
	}	
	
	protected List<Model> splitModels(List<Model> lst, int coord) {
		List<Model> reLst = new LinkedList<Model>();
		for (Model model : lst) {
			setModel(model);
			Triangle[] triangles = model.getTriangles();
			List<Triangle> one = new LinkedList<Triangle>();
			List<Triangle> two = new LinkedList<Triangle>();
			for (Triangle triangle : triangles) {
				if (triangle.getCenter().get(coord, 0) < center.get(coord, 0)) {
					one.add(triangle);
				} else {
					two.add(triangle);
				}
			}
			Model first = buildModel(one);
			Model second = buildModel(two);
			reLst.add(first);
			reLst.add(second);
		}
		return reLst;
	}
}
