internal GeodesicLineExact(GeodesicExact g, double lat1, double lon1, double azi1, double salp1, double calp1, GeodesicFlags caps, bool arcmode, double s13_a13) { LineInit(g, lat1, lon1, azi1, salp1, calp1, caps, ref _lat1, ref _lon1, ref _azi1, ref _salp1, ref _calp1, ref _a, ref _f, ref _b, ref _c2, ref _f1, ref _e2, ref _caps, ref _dn1, ref _salp0, ref _calp0, ref _ssig1, ref _csig1, ref _somg1, ref _comg1, ref _cchi1, ref _k2, ref _E0, ref _E1, ref _stau1, ref _ctau1, ref _D0, ref _D1, ref _H0, ref _H1, ref _A4, ref _B41, ref _s13, ref _a13); SetDistance(arcmode, s13_a13); }
/// <summary> /// Constructor for a exact geodesic line staring at latitude <i>lat1</i>, longitude <i>lon1</i>, /// and azimuth <i>azi1</i> (all in degrees). /// </summary> /// <param name="g"> /// A <see cref="GeodesicExact"/> object used to compute the necessary information about the <see cref="GeodesicLineExact"/>. /// </param> /// <param name="lat1">latitude of point 1 (degrees).</param> /// <param name="lon1">longitude of point 1 (degrees).</param> /// <param name="azi1">azimuth at point 1 (degrees).</param> /// <param name="caps">bitor'ed combination of <see cref="GeodesicFlags"/> values specifying the capabilities /// the <see cref="GeodesicLineExact"/> object should possess, i.e., which quantities can be returned in calls to /// <see cref="GeodesicLineBase.Position(double, out double, out double, out double, out double, out double, out double, out double)"/>.</param> /// <remarks> /// <i>lat1</i> should be in the range [−90°, 90°]. /// <para> /// The <see cref="GeodesicFlags"/> values possible for <i>caps</i> are /// <list type="bullet"> /// <item><i>caps</i> |= <see cref="GeodesicFlags.Latitude"/> for the latitude <i>lat2</i>; this is added automatically;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.Longitude"/> for the latitude <i>lon2</i>;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.Azimuth"/> for the latitude <i>azi2</i>;this is added automatically;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.Distance"/> for the distance <i>s12</i>;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.ReducedLength"/> for the reduced length <i>m12</i>;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.GeodesicScale"/> for the geodesic scales <i>M12</i> and <i>M21</i>;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.Area"/> for the area <i>S12</i>;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.DistanceIn"/> /// permits the length of the geodesic to be given in terms of <i>s12</i>; /// without this capability the length can only be specified in terms of arc length;</item> /// <item><i>caps</i> |= <see cref="GeodesicFlags.All"/> for all of the above.</item> /// </list> /// The default value of <i>caps</i> is <see cref="GeodesicFlags.All"/>. /// </para> /// <para> /// If the point is at a pole, the azimuth is defined by keeping lon1 fixed, /// writing <i>lat1</i> = ±(90° − ε), and taking the limit ε → 0+. /// </para> /// </remarks> public GeodesicLineExact(GeodesicExact g, double lat1, double lon1, double azi1, GeodesicFlags caps) { azi1 = AngNormalize(azi1); // Guard against underflow in salp0. Also -0 is converted to +0. SinCosd(AngRound(azi1), out var salp1, out var calp1); LineInit(g, lat1, lon1, azi1, salp1, calp1, caps, ref _lat1, ref _lon1, ref _azi1, ref _salp1, ref _calp1, ref _a, ref _f, ref _b, ref _c2, ref _f1, ref _e2, ref _caps, ref _dn1, ref _salp0, ref _calp0, ref _ssig1, ref _csig1, ref _somg1, ref _comg1, ref _cchi1, ref _k2, ref _E0, ref _E1, ref _stau1, ref _ctau1, ref _D0, ref _D1, ref _H0, ref _H1, ref _A4, ref _B41, ref _s13, ref _a13); }