Advertisement
vovkakorben

Untitled

Feb 14th, 2022
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.19 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace autopilot_win
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         // ------------------------------------------------------------------------------------------
  16.         //
  17.         //  воспомогательные классы и переменные
  18.         //
  19.         // ------------------------------------------------------------------------------------------
  20.  
  21.         public struct Coordinate
  22.         {
  23.             public double x;
  24.             public double y;
  25.             public double dist(Coordinate other)
  26.             {
  27.                 return Math.Sqrt(Math.Pow(x - other.x, 2) + Math.Pow(y - other.y, 2));
  28.             }
  29.             public double distX(Coordinate other)
  30.             {
  31.                 return (x - other.x);
  32.             }
  33.             public double distY(Coordinate other)
  34.             {
  35.                 return (y - other.y);
  36.             }
  37.         }
  38.         //public struct Neighbour        {            public double n;            public double len;        }
  39.         private const int HOUSE_DENSITY = 1;
  40.         private const double TRESHOLD = 1.0;
  41.         //static Node[] nodes;
  42.         static List<node_item> Nodes = new List<node_item>();
  43.         static List<graph_item> Graph = new List<graph_item>();
  44.  
  45.         public struct node_item
  46.         {
  47.             public node_item(int _street, Coordinate _pos)
  48.             {
  49.                 street = _street;
  50.                 pos = _pos;
  51.                 con = new Dictionary<int, double>();
  52.             }
  53.  
  54.             public int street { get; }
  55.             public Coordinate pos { get; }
  56.             public double dist(node_item other)
  57.             {
  58.                 return Math.Sqrt(Math.Pow(pos.x - other.pos.x, 2) + Math.Pow(pos.y - other.pos.y, 2));
  59.             }
  60.             public Dictionary<int, double> con;
  61.         }
  62.         public struct graph_item
  63.         {
  64.             public graph_item(int _start, int _end, int _type, List<node_item> Nodes)
  65.             {
  66.                 start = _start;
  67.                 end = _end;
  68.                 type = _type;
  69.                 len = Nodes[end].dist(Nodes[start]);
  70.             }
  71.  
  72.             public int start { get; }
  73.             public int end { get; }
  74.             public double len { get; }
  75.             public int type { get; }
  76.         }
  77.  
  78.         static Coordinate str_to_coord(string s)
  79.         {
  80.             string[] xy = s.Split(',');
  81.             Coordinate c;
  82.             Double.TryParse(xy[0], out c.x);
  83.             Double.TryParse(xy[1], out c.y);
  84.             return c;
  85.         }
  86.  
  87.         public void load_text_data(string filename)
  88.         {
  89.  
  90.             // ------------------------------------------------------------------------------------------
  91.             //
  92.             //  читаем сегменты улиц, разбиваем на "дома", создаем из них узлы и графы
  93.             //
  94.             // ------------------------------------------------------------------------------------------
  95.             int street_index = 0;
  96.             int nodes_count = 0;
  97.             Coordinate segment_start, segment_end, coord_insert;
  98.             char[] charsToTrim = { '\n', '\r', ' ' };
  99.             foreach (string line in System.IO.File.ReadLines(filename))
  100.             {
  101.                 string street_line = line.Trim(charsToTrim);
  102.                 string[] segments = street_line.Split('\t');
  103.                 if (segments.Length > 2)
  104.                 {
  105.                     segment_start = str_to_coord(segments[1]);
  106.                     // add first node of street
  107.                     Nodes.Add(new node_item(street_index, segment_start));
  108.                     nodes_count++;
  109.  
  110.                     // for each segment add nodes
  111.                     for (int i = 2; i < segments.Length; i++)
  112.                     {
  113.                         segment_end = str_to_coord(segments[i]);
  114.                         double segment_len = segment_end.dist(segment_start);
  115.                         int house_per_segment = (int)(segment_len / HOUSE_DENSITY);
  116.  
  117.                         double dx = segment_end.distX(segment_start) / house_per_segment;
  118.                         double dy = segment_end.distY(segment_start) / house_per_segment;
  119.  
  120.                         for (int h = 1; h < house_per_segment + 1; h++)
  121.                         {
  122.                             // добавляем очередную точку
  123.                             coord_insert.x = segment_start.x + h * dx;
  124.                             coord_insert.y = segment_start.y + h * dy;
  125.                             Nodes.Add(new node_item(street_index, coord_insert));
  126.                             // создаем граф из 2 последних добавленных точек
  127.                             Graph.Add(new graph_item(nodes_count - 1, nodes_count, 0, Nodes));
  128.                             nodes_count++;
  129.                         }
  130.                         segment_start = segment_end;
  131.                     }
  132.                 }
  133.                 else
  134.                 {
  135.                     Console.WriteLine(String.Format("Строка {0} содержит меньше координат, ожидается 2 или больше, есть {1}",
  136.                                street_index, segments.Length));
  137.                 }
  138.                 street_index++;
  139.             }
  140.  
  141.             // ------------------------------------------------------------------------------------------
  142.             //
  143.             //  добавляем для каждого узла его соседей
  144.             //
  145.             // ------------------------------------------------------------------------------------------
  146.             node_item n;
  147.             for (int g = 0; g < Graph.Count; g++)
  148.             {
  149.                 n = Nodes[Graph[g].start];
  150.                 if (!n.con.ContainsKey(Graph[g].end))
  151.                 {
  152.                     n.con.Add(Graph[g].end, n.dist(Nodes[Graph[g].end]));
  153.                 }
  154.                 n = Nodes[Graph[g].end];
  155.                 if (!n.con.ContainsKey(Graph[g].start))
  156.                 {
  157.                     n.con.Add(Graph[g].start, n.dist(Nodes[Graph[g].start]));
  158.                 }
  159.  
  160.             }
  161.             // ------------------------------------------------------------------------------------------
  162.             //
  163.             //  добавляем стыки улиц
  164.             //
  165.             // ------------------------------------------------------------------------------------------
  166.  
  167.             bool graph_exists(int node1, int node2)
  168.             {
  169.                 for (int g = 0; g < Graph.Count; g++)
  170.                 {
  171.                     if (((Graph[g].start == node1) && (Graph[g].end == node2)) || ((Graph[g].start == node2) && (Graph[g].end == node1)))
  172.                         return true;
  173.                 }
  174.                 return false;
  175.             }
  176.  
  177.             int graph_count = Graph.Count;
  178.             double l;
  179.             for (int ns = 0; ns < Nodes.Count; ns++)
  180.                 for (int nd = 0; nd < Nodes.Count; nd++)
  181.                 {
  182.                     if (Nodes[ns].street != Nodes[nd].street)
  183.                     {
  184.                         l = Nodes[nd].dist(Nodes[ns]);
  185.                         if (l <= TRESHOLD)
  186.                         {
  187.                             if (!Nodes[ns].con.ContainsKey(nd))
  188.                                 Nodes[ns].con.Add(nd, l);
  189.                             if (!Nodes[nd].con.ContainsKey(ns))
  190.                                 Nodes[nd].con.Add(ns, l);
  191.                             if (!graph_exists(ns, nd))
  192.                                 Graph.Add(new graph_item(ns, nd, 1, Nodes));
  193.                         }
  194.                     }
  195.                 }
  196.            
  197.             /*
  198.             Form1.textBox1.Lines = string.Format("Прочитано улиц: {0}\r\n", street_index);
  199.             Console.WriteLine(String.Format("Созданно узлов: {0}", Nodes.Count));
  200.             Console.WriteLine(String.Format("Графов: {0} (добавлено: {1})", Graph.Count, Graph.Count - graph_count));
  201.             Console.WriteLine("");
  202.             Console.WriteLine("Нажмите любую кнопку для выхода...");
  203.  
  204.             Console.ReadKey();
  205.             */
  206.         }
  207.  
  208.         private PictureBox pictureBox1 = new PictureBox();
  209.         private Font fnt = new Font("Arial", 10);
  210.  
  211.         public Form1()
  212.         {
  213.             InitializeComponent();
  214.         }
  215.         private void Form1_Load(object sender, EventArgs e)
  216.         {
  217.             // Dock the PictureBox to the form and set its background to white.
  218.             pictureBox1.Dock = DockStyle.Fill;
  219.             pictureBox1.BackColor = Color.White;
  220.             // Connect the Paint event of the PictureBox to the event handler method.
  221.             pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
  222.  
  223.             // Add the PictureBox control to the Form.
  224.             this.Controls.Add(pictureBox1);
  225.             textBox1.Text = string.Format("Прочитано улиц: {0}\r\n",1);
  226.             //load_text_data(@"f:\tusur2\map1.txt");
  227.         }
  228.         private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  229.         {
  230.             // Create a local version of the graphics object for the PictureBox.
  231.             Graphics g = e.Graphics;
  232.  
  233.             // Draw a string on the PictureBox.
  234.             g.DrawString("This is a diagonal line drawn on the control",
  235.                 fnt, System.Drawing.Brushes.Blue, new Point(30, 30));
  236.             // Draw a line in the PictureBox.
  237.             g.DrawLine(System.Drawing.Pens.Red, pictureBox1.Left, pictureBox1.Top,
  238.                 pictureBox1.Right, pictureBox1.Bottom);
  239.         }
  240.         private void textBox1_TextChanged(object sender, EventArgs e)
  241.         {
  242.  
  243.         }
  244.         private void Form1_MouseDown(object sender, MouseEventArgs e)
  245.         {
  246.  
  247.         }
  248.         private void Form1_Resize(object sender, EventArgs e)
  249.         {
  250.  
  251.         }
  252.     }
  253. }
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement