package GrandeursPhysiques;

import java.util.Vector;
import java.awt.*;
public class Donnees {
	Vector<Charge> charges;
	Vector<Point> pointsATracer;
	int methode;
	public Donnees(){
		methode=1;
		charges=new Vector<Charge>();
		pointsATracer=new Vector<Point>();
	}
	public Vector<Charge> getCharges(){
		return charges;
	}
	public Vector<Point> getPoints(){
		return pointsATracer;
	}
	public void ajouterCharge(Charge c){
		charges.add(c);
	}
	public void ajouterPoint(Point p){
		pointsATracer.add(p);
	}
	public void DessinerLignes(Graphics g){
		Vector<Point> PointsLigne;
		Double cte=0.0;
		if (pointsATracer.size()!=0&&charges.size()!=0){
			if (methode==1){//méthode 1 :
				for (int a=0;a<pointsATracer.size();a++){
					PointsLigne=new Vector<Point>();
					cte=fonctionPhi(pointsATracer.get(a));
					for(int i=0;i<600;i++)
						for(int j=0;j<600;j++)
							if(Math.abs(fonctionPhi(new Point(i,j))-cte)<0.012)
								PointsLigne.add(new Point(i,j));
					tracerLigne(g,PointsLigne);
				}
			}
			else {//methode 2 :
				Vector<Point> pointsAAfficher=new Vector<Point>();
				for (int a=0;a<pointsATracer.size();a++){
					Point p=pointsATracer.get(a);
					p=p.pixelEnCoord(p);
					double x0=p.getX();
					double xi1=p.getX();
					double yi1=p.getY();
					double xi2=p.getX();
					double yi2=p.getY();
					for (int i=1;i<600;i++){
						yi1=yi1+fonctionPsi(new Point(xi1,yi1))/20.0;
						xi1=x0+(double)i/20.0;
						pointsAAfficher.add(new Point(xi1,yi1));
						pointsAAfficher.add(new Point(xi1,-yi1));
						yi2=yi2-fonctionPsi(new Point(xi2,yi2))/20.0;
						xi2=x0-(double)i/20.0;
						pointsAAfficher.add(new Point(xi2,yi2));
						pointsAAfficher.add(new Point(xi2,-yi2));
					}
				}
				tracerLigneCoord(g,pointsAAfficher);
			}
		}
	}
	public void tracerLigneCoord(Graphics g,Vector<Point> pts){
		g.setColor(Color.magenta);
		if (pts.size()!=0){
			Point p=new Point(2,2);
			for (int i=0;i<pts.size();i++){
				p=pts.get(i).coordEnPixels();
				g.drawLine((int)(p.getX()), (int)(p.getY()), (int)(p.getX()), (int)(p.getY()));
			}
		}
	}
	public double fonctionPsi(Point p){
		double Ex=0;
		double Ey=0;
		for (int i=0;i<charges.size();i++){
			Ey+=(charges.get(i).getValeur()*p.getY())/(Math.pow(Math.pow(p.getX()-charges.get(i).getAbs(), 2)+Math.pow(p.getY(), 2), 1.5));
			Ex+=(charges.get(i).getValeur()*(p.getX()-charges.get(i).getAbs()))/(Math.pow(Math.pow(p.getX()-charges.get(i).getAbs(), 2)+Math.pow(p.getY(), 2), 1.5));
		}
		return (Ey/Ex);
	}
	public void setMethode(int n){
		methode=n;
	}
	public void tracerLigne(Graphics g,Vector<Point> pts){
		g.setColor(Color.magenta);
		if (pts.size()!=0){
			for (int i=0;i<pts.size();i++){
				g.drawLine((int)(pts.get(i).getX()), (int)(pts.get(i).getY()), (int)(pts.get(i).getX()), (int)(pts.get(i).getY()));
			}
		}
	}
	public double fonctionPhi(Point p){
		p=p.pixelEnCoord(p);
		double phi=0;
		for (int i=0;i<charges.size();i++){
			phi+=charges.get(i).getValeur()*(p.getX()-charges.get(i).getAbs())/(Math.sqrt(Math.pow(p.getX()-charges.get(i).getAbs(), 2)+Math.pow(p.getY(), 2)));
		}
		return phi;
	}
}
