Построить линию между двумя точками географических координат графически - C#

Узнай цену своей работы

Формулировка задачи:

Имея широту и долготу двух точек, можно ли каким-то образом изобразить графически как она будет направлена?

Решение задачи: «Построить линию между двумя точками географических координат графически»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Windows.Forms;
  6.  
  7. namespace WindowsFormsApplication339
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         public PointF P1 { get; set; }
  12.         public PointF P2 { get; set; }
  13.  
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.  
  18.             SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
  19.  
  20.             P1 = new PointF(51.3f, -0.1f);
  21.             P2 = new PointF(28.6f, 77.2f);
  22.         }
  23.  
  24.         protected override void OnPaint(PaintEventArgs e)
  25.         {
  26.             e.Graphics.TranslateTransform(ClientSize.Width / 2, ClientSize.Height / 2);
  27.  
  28.             var path = new GraphicsPath();
  29.             var points = new List<PointF>();
  30.             var gridStep = 15;
  31.             var step = 5;
  32.  
  33.             //параллели
  34.             for (var lat = -90; lat < 90; lat += gridStep)
  35.             {
  36.                 for (var lon = -180; lon <= 180; lon += step)
  37.                     points.Add(new Point3(lat, rotate1 + lon).Projection(rotate2, R));
  38.  
  39.                 path.StartFigure();
  40.                 path.AddLines(points.ToArray());
  41.                 points.Clear();
  42.             }
  43.            
  44.             //меридианы
  45.             for (var lon = -180; lon <= 180; lon += gridStep)
  46.             {
  47.                 for (var lat = -90; lat <= 90; lat += step)
  48.                     points.Add(new Point3(lat, rotate1 + lon).Projection(rotate2, R));
  49.  
  50.                 path.StartFigure();
  51.                 path.AddLines(points.ToArray());
  52.                 points.Clear();
  53.             }
  54.  
  55.             //отрисовка
  56.             e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
  57.             e.Graphics.DrawPath(Pens.Silver, path);
  58.  
  59.             //рисуем линию между точками
  60.             var p1 = new Point3(P1.X, P1.Y + rotate1);
  61.             var p2 = new Point3(P2.X, P2.Y + rotate1);
  62.  
  63.             for (int i = 0; i <= 100; i++)
  64.                 points.Add(p1.Lerp(p2, i / 100f).Projection(rotate2, R));
  65.  
  66.             using(var pen = new Pen(Color.Red, 2))
  67.                 e.Graphics.DrawLines(pen, points.ToArray());
  68.         }
  69.  
  70.         private double rotate2 = 0;
  71.         private double rotate1 = 0;
  72.         private double R = 100;
  73.  
  74.         private Point lastMousePos;
  75.  
  76.         protected override void OnMouseMove(MouseEventArgs e)
  77.         {
  78.             if(MouseButtons == MouseButtons.Left)
  79.             {
  80.                 var dx = e.X - lastMousePos.X;
  81.                 var dy = e.Y - lastMousePos.Y;
  82.                 rotate1 += dx / 2.0;
  83.                 rotate2 -= dy / 2.0;
  84.                 Invalidate();
  85.             }
  86.             lastMousePos = e.Location;
  87.         }
  88.  
  89.         protected override void OnMouseWheel(MouseEventArgs e)
  90.         {
  91.             if (e.Delta < 0) R *= 0.98;
  92.             if (e.Delta > 0) R *= 1.02;
  93.            
  94.             Invalidate();
  95.         }
  96.     }
  97.  
  98.     class Point3
  99.     {
  100.         public double X;
  101.         public double Y;
  102.         public double Z;
  103.  
  104.         public Point3(double x, double y, double z)
  105.         {
  106.             X = x;
  107.             Y = y;
  108.             Z = z;
  109.         }
  110.  
  111.         public Point3(double latitude, double longitude)
  112.         {
  113.             latitude *= Math.PI / 180;
  114.             longitude *= Math.PI / 180;
  115.  
  116.             X = Math.Cos(latitude) * Math.Cos(longitude);
  117.             Y = Math.Cos(latitude) * Math.Sin(longitude);
  118.             Z = Math.Sin(latitude);
  119.         }
  120.  
  121.         public PointF Projection(double rotate, double R)
  122.         {
  123.             rotate *= Math.PI / 180;
  124.  
  125.             var kz = Math.Cos(rotate) * R;
  126.             var kx = Math.Sin(rotate) * R;
  127.  
  128.             return new PointF((float)(Y * R), -(float)(Z * kz + X * kx));
  129.         }
  130.  
  131.         public Point3 Lerp(Point3 p, float k)
  132.         {
  133.             var x = X * (1 - k) + p.X * k;
  134.             var y = Y * (1 - k) + p.Y * k;
  135.             var z = Z * (1 - k) + p.Z * k;
  136.             var l = Math.Sqrt(x * x + y * y + z * z);
  137.  
  138.             return new Point3(x / l, y / l, z / l);
  139.         }
  140.     }
  141. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы