public class CatenaryModel {
	private double w;		// Unit weight
	private double yMin;	// Min height
	private double yPole;	// Pole
	private double xPole;	// Pole
	private double T;		// Tension
	private final static double epsilon = 0.0000001;

	public CatenaryModel(double w, double yMin, double xp, double yp) {
		this.w = w;
		this.yMin = yMin;
		this.xPole = xp;
		this.yPole = yp;
		this.T = calcTension();
	}

	private double f(double T0) {
		double answer = yPole - T0 / w * cosh(w * xPole / T0) - yMin + T0 / w;
		return answer;
	}

	private double cosh(double x) {
		double answer = 0.5 * (Math.exp(x) + Math.exp(-x));
		return answer;
	}

	public double getY(double x) {
		return T / w * cosh(w * x / T) + yMin - T / w;
	}

	public double calcTension() {
		double m;
		double T1 = w;
		double T2 = w * xPole * yPole;
		for (m = (T1 + T2) / 2.0;
			Math.abs(T1 - T2) > epsilon;
			m = (T1 + T2) / 2.0)
			if (f(T1) * f(m) <= 0.0)
				// If func crosses zero in left sub
				T2 = m; // Use left subinterval
		else
			T1 = m; // Use right subinterval
		return m;
	}

	//Getters
	public double getW() {
		return w;
	}
	public double getXPole() {
		return xPole;
	}
	public double getYPole() {
		return yPole;
	}
	public double getYMin() {
		return yMin;
	}
	public double getT() {
		return T;
	}

	//Setters
	public void setW(double w) {
		this.w = w;
	}
	public void setXPole(double xPole) {
		this.xPole = xPole;
	}
	public void setYPole(double yPole) {
		this.yPole = yPole;
	}
	public void setYMin(double yMin) {
		this.yMin = yMin;
	}
	public void setTension() {
		this.T = calcTension();
	}
}