class Operateurs {

	public static IDirectPosition projection(IDirectPosition m, IDirectPosition a, IDirectPosition b) {
		Vecteur ab = new Vecteur(a, b);
		boolean to2d = Double.isNaN(m.getZ()) || Double.isNaN(a.getZ()) || Double.isNaN(b.getZ());
		if (to2d) {
			ab.setZ(Double.NaN);
		}
		if (ab.norme() == 0) {
			return a; // cas ou A et B sont confondus
		}
		Vecteur u_ab = ab.vectNorme();
		Vecteur am = new Vecteur(a, m);
		if (to2d) {
			am.setZ(Double.NaN);
		}
		double lambda = am.prodScalaire(u_ab);
		if (lambda <= 0) {
			return a; // Cas ou M se projete en A sur le segment [AB]
		}
		if (lambda >= (to2d ? a.distance2D(b) : a.distance(b))) {
			return b; // Cas ou M se projete en B sur le segment [AB]
		}
		// Cas ou M se projete entre A et B
		return Operateurs.translate(a, u_ab.multConstante(lambda));
	}

}