/// <summary> /// Is loop clockwise normalized? /// </summary> /// <param name="loop"></param> /// <param name="isTransmeridian"></param> /// <returns></returns> private static bool IsClockwiseNormalized(this LinkedGeoLoop loop, bool isTransmeridian) { var sum = 0m; var nodes = loop.Nodes; for (var idx = 0; idx < nodes.Count; idx++) { var a = nodes[idx]; var b = nodes[(idx + 1) % nodes.Count]; // If we identify a transmeridian arc (> 180 degrees longitude), // start over with the transmeridian flag set if (!isTransmeridian && Math.Abs(a.Longitude - b.Longitude) > Constants.H3.M_PI) { return(loop.IsClockwiseNormalized(true)); } sum += (b.Longitude.NormalizeLongitude(isTransmeridian) - a.Longitude.NormalizeLongitude(isTransmeridian)) * (b.Latitude + a.Latitude); } return(sum > 0); }
/// <summary> /// Is loop clockwise? /// </summary> /// <param name="loop"></param> /// <returns></returns> public static bool IsClockwise(this LinkedGeoLoop loop) { return(loop.IsClockwiseNormalized(false)); }