package millie.operator;
 
import millie.image.Image;
import millie.image.navier.Flow;
import millie.image.navier.GradientOperator;
import millie.image.navier.VectorField;
 
public class SpecialNavierOperator {
 
	Image in;
 
	int factor;
 
	Flow[] flows;
 
	public SpecialNavierOperator(Image in, int factor) {
		if (factor < 0)
			throw new IllegalArgumentException("bad argument");
 
		this.in = in;
		this.factor = factor;
 
		flows = new Flow[in.getNumComponents()];
 
		for (int n = 0; n < in.getNumComponents(); n++) {
			Flow flow = new Flow(in.getWidth(), in.getHeight(), 1);
 
			VectorField f = GradientOperator.compute(in, n);
 
			for (int j = 0; j < f.getSizeY(); j++)
				for (int i = 0; i < f.getSizeX(); i++) {
					//flow.setVelocity(i, j, f.getX(i, j) / factor, f.getY(i, j)
						//	/ factor);
 
					flow.setDiffusion(i, j, in.getPixel(i, j, n) / 255);
				}
			flows[n] = flow;
			
			flow.setVelocity(150, 150, 10,10 );
			//flow.setDiffusion(i, j, value);
		}
 
	}
 
	public void compute() {
		for (int i = 0; i < flows.length; i++)
			flows[i].evolve();
	}
 
	public void saveOuput(Image out) {
		if (out.getNumComponents() != in.getNumComponents())
			throw new IllegalArgumentException("bad argument");
		out.resize(in.getWidth(), in.getHeight());
 
		for (int n = 0; n < flows.length; n++)
			for (int j = 0; j < out.getHeight(); j++)
				for (int i = 0; i < out.getWidth(); i++) {
					// double value = Math.sqrt(carre(flows[n].getVelocityX(i,
					// j)) + carre(flows[n].getVelocityY(i, j)));
				//	double value = Math.abs(flows[n].getVelocityX(i, j));
					
			//		out.setPixel(i, j, n, value*255);
					out.setPixel(i, j, n, flows[n].getDiffusion(i, j) * 255);
				}
	}
 
}
 