package calcul;

import matrices.MatriceCreuse;

public abstract class Matrice {
	public abstract int getLargeur();
	public abstract int getHauteur();
	public abstract void set(int x, int y, int valeur);
	public abstract int get(int x, int y);
	public abstract int getNbNonNuls();
	public abstract Matrice optimiser();

	private static final double seuilCreuse = 0.2; // sous ce seuil la matrice devrait etre creuse

	protected static double getSeuilCreuse() { 
		return seuilCreuse;
	}	

	public static Matrice creer(int hauteur, int largeur) {
		return new MatriceCreuse(hauteur, largeur);
	}
	
	public boolean estCreuse() {
		return this instanceof MatriceCreuse;
	}
	
	public double getTauxRemplissage() {
		return getNbNonNuls() / (double)(getLargeur()*getHauteur());
	}

	public void recopier(Matrice m) {
		for (int x = 1; x <= getHauteur(); ++x)
			for (int y = 1; y<= getLargeur(); ++y)
				set(x, y, m.get(x,y));		
	}
}
