private double MidDay(double time) { SunPosition sunPosition = new SunPosition(julianDate + time); double eqt = sunPosition.Equation; double noon = Utils.FixHour(12 - eqt); return noon; }
// Compute the time at which sun reaches a specific angle below horizon private double SunAngleTime(double angle, double time, string direction = "") { SunPosition sunPosition = new SunPosition(julianDate + time); double decl = sunPosition.Declinaison; double noon = MidDay(time); double acos = (-DegreeMath.Sin(angle) - DegreeMath.Sin(decl) * DegreeMath.Sin(latitude)) / (DegreeMath.Cos(decl) * DegreeMath.Cos(latitude)); if (acos > 1) acos = 1; double t = 1 / 15.0 * DegreeMath.Acos(acos); return noon + (direction == "ccw" ? -t : t); }
// Compute asr time private double AsrTime(double factor, double time) { SunPosition sunPosition = new SunPosition(julianDate + time); double decl = sunPosition.Declinaison; double angle = -DegreeMath.Acot(factor + DegreeMath.Tan(Math.Abs(latitude - decl))); return SunAngleTime(angle, time); }