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(); } }