/// <summary> /// Находит точку, являющуюся пересечением перпендикуляра опущенного от заданной точки к прямой, проходящей на заданном углу (высота не учитывается) /// Работает на малых расстояниях (считается, что поверхность плоская) /// </summary> public static GeoPoint IntersectionLineAndPerpendicularFromPoint(GeoPoint lineX, GeoPoint lineY, double alpha) { var azimuth = lineX.Azimuth(lineY) + alpha; var b = Distance(lineX, lineY); var c = Math.Abs(b / Math.Cos(DegreesToRadians(alpha))); return(lineX.RadialPoint(c, azimuth)); }
/// <summary> /// Находит точку на заданной линии, являющуюся пересечением перпендикуляра опущенного из заданной точки к прямой (высота не учитывается) /// Работает на малых расстояниях (считается, что поверхность плоская) /// </summary> public static GeoPoint IntersectionLineAndPerpendicularFromPoint(GeoPoint lineX, GeoPoint lineY, GeoPoint p) { var azimuth = DegreesToRadians(lineX.Azimuth(lineY) - lineX.Azimuth(p)); var d = Distance(lineX, p); var h = Math.Abs(d * Math.Cos(azimuth)); return(lineX.RadialPoint(h, lineX.Azimuth(lineY))); }
public static IEnumerable <GeoPoint> SplitIntoGeoPoints(GeoPoint startLocation, GeoPoint endLocation, int stepCount) { var dist = startLocation.DistanceTo(endLocation) / stepCount; stepCount = stepCount == 0 ? 1 : Math.Abs(stepCount); var vAlt = 0.0; if (startLocation.Altitude.HasValue && endLocation.Altitude.HasValue) { vAlt = (double)((endLocation.Altitude - startLocation.Altitude) / stepCount); } var a = startLocation.Azimuth(endLocation); for (var i = 0; i <= stepCount; i++) { yield return(startLocation.RadialPoint(i * dist, a).AddAltitude(vAlt * i)); } }
/// <summary> /// Возвращает точку, которая находится на луче, начало которого в точке <paramref name="p1"/> /// Луч проходит через точку p2. Расстояние между p1 и возвращаемой точкой равно указанному <paramref name="distance"/> /// <param name="distance"> Расстояние в метрах</param> /// </summary> public static GeoPoint VectorMove(this GeoPoint p1, GeoPoint p2, int distance) { return(p1.RadialPoint(distance, p1.Azimuth(p2))); }