Построить линию между двумя точками географических координат графически - C#
Формулировка задачи:
Имея широту и долготу двух точек, можно ли каким-то образом изобразить графически как она будет направлена?
Решение задачи: «Построить линию между двумя точками географических координат графически»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace WindowsFormsApplication339 { public partial class Form1 : Form { public PointF P1 { get; set; } public PointF P2 { get; set; } public Form1() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); P1 = new PointF(51.3f, -0.1f); P2 = new PointF(28.6f, 77.2f); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.TranslateTransform(ClientSize.Width / 2, ClientSize.Height / 2); var path = new GraphicsPath(); var points = new List<PointF>(); var gridStep = 15; var step = 5; //параллели for (var lat = -90; lat < 90; lat += gridStep) { for (var lon = -180; lon <= 180; lon += step) points.Add(new Point3(lat, rotate1 + lon).Projection(rotate2, R)); path.StartFigure(); path.AddLines(points.ToArray()); points.Clear(); } //меридианы for (var lon = -180; lon <= 180; lon += gridStep) { for (var lat = -90; lat <= 90; lat += step) points.Add(new Point3(lat, rotate1 + lon).Projection(rotate2, R)); path.StartFigure(); path.AddLines(points.ToArray()); points.Clear(); } //отрисовка e.Graphics.SmoothingMode = SmoothingMode.HighQuality; e.Graphics.DrawPath(Pens.Silver, path); //рисуем линию между точками var p1 = new Point3(P1.X, P1.Y + rotate1); var p2 = new Point3(P2.X, P2.Y + rotate1); for (int i = 0; i <= 100; i++) points.Add(p1.Lerp(p2, i / 100f).Projection(rotate2, R)); using(var pen = new Pen(Color.Red, 2)) e.Graphics.DrawLines(pen, points.ToArray()); } private double rotate2 = 0; private double rotate1 = 0; private double R = 100; private Point lastMousePos; protected override void OnMouseMove(MouseEventArgs e) { if(MouseButtons == MouseButtons.Left) { var dx = e.X - lastMousePos.X; var dy = e.Y - lastMousePos.Y; rotate1 += dx / 2.0; rotate2 -= dy / 2.0; Invalidate(); } lastMousePos = e.Location; } protected override void OnMouseWheel(MouseEventArgs e) { if (e.Delta < 0) R *= 0.98; if (e.Delta > 0) R *= 1.02; Invalidate(); } } class Point3 { public double X; public double Y; public double Z; public Point3(double x, double y, double z) { X = x; Y = y; Z = z; } public Point3(double latitude, double longitude) { latitude *= Math.PI / 180; longitude *= Math.PI / 180; X = Math.Cos(latitude) * Math.Cos(longitude); Y = Math.Cos(latitude) * Math.Sin(longitude); Z = Math.Sin(latitude); } public PointF Projection(double rotate, double R) { rotate *= Math.PI / 180; var kz = Math.Cos(rotate) * R; var kx = Math.Sin(rotate) * R; return new PointF((float)(Y * R), -(float)(Z * kz + X * kx)); } public Point3 Lerp(Point3 p, float k) { var x = X * (1 - k) + p.X * k; var y = Y * (1 - k) + p.Y * k; var z = Z * (1 - k) + p.Z * k; var l = Math.Sqrt(x * x + y * y + z * z); return new Point3(x / l, y / l, z / l); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д