Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2019, 13:51   #1
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию Объясните что происходит как работает сей код C#

Объясните что происходит как работает сей код.

Код:
using System;
using System.Collections.Generic;
using System.Drawing;
using WindowsFormsApp1.Model;

namespace WindowsFormsApp1.Util
{
    public static class ArrowCreator
    {
        private static Arrow createArrow(Edge edge, int r)
        {
            var x1 = edge.V1.XCord;
            var x2 = edge.V2.XCord;
            var y1 = edge.V1.YCord;
            var y2 = edge.V2.YCord;

            var YY = y1 - y2;
            var XX = x1 - x2;

            var kX = (XX == 0 ? 0 : (XX / Math.Abs(XX)));
            var kY = (YY == 0 ? 0 : (YY / Math.Abs(YY)));

            double Dx, Dy,lx,ly;

            if (YY < 0)
            {
                var angle = Math.Atan2(Math.Abs(YY), Math.Abs(XX));
                Dy = r * Math.Sin(angle);
                Dx = r * Math.Cos(angle);
                lx = (r + 10) * Math.Cos(angle);
                ly = (r + 10) * Math.Sin(angle);

            }
            else
            {
                var angle = Math.Atan2(Math.Abs(XX), YY);
                Dx = r * Math.Sin(angle);
                Dy = r * Math.Cos(angle);
                ly = (r + 10) * Math.Cos(angle);
                lx = (r + 10) * Math.Sin(angle);
            }


            var xN = x2 +  kX * Dx;
            var yN = y2 +  kY * Dy;

            var xP = x2 + kX * lx;
            var yP = y2 + kY * ly;

            double p1X, p1Y, p2X, p2Y;

            if (XX == 0)
            {
                p1X = xN - 3;
                p1Y = yN + kY * 10;

                p2X = xN + 3;
                p2Y = yN + kY * 10;
            }
            else if (YY == 0)
            {
                p1X = xN + kX * 10;
                p1Y = yN + 3;

                p2X = xN + kX * 10;
                p2Y = yN - 3;
            }
            else
            {
                p1X = xP + 4;
                p1Y = yP - kX * kY * 3;

                p2X = xP - 4;
                p2Y = yP + kX * kY * 3;
            }


            PointF PStart = new PointF((float)xN, (float)yN);
            PointF PLeft = new PointF((float)p1X, (float)p1Y);
            PointF PRight = new PointF((float)p2X, (float)p2Y);

            return new Arrow(PStart, PLeft, PRight);

        }

        public static List<Arrow> createArrowList(List<Edge> edges, int r)
        {
            var arrows = new List<Arrow>();
            foreach (var edge in edges)
            {
                arrows.Add(createArrow(edge,r));
            }

            return arrows;
        }
    }
}
Код:
using System.Collections.Generic;
using WindowsFormsApp1.Model;


namespace WindowsFormsApp1.Util
{
    
    static class Creator
    {
        public static Graph createNonDirected(int count)
        {
            List<List<byte?>> matrix = new List<List<byte?>>();
            List<byte> matrixValues = Generator.generate(count,Mode.NONDIRECTED);
            int num = 0;
            for (int i = 0; i < count; i++)
            {
                List<byte?> rowVal = new List<byte?>();
                for (int j = 0; j < count; j++)
                {
                    byte? value;
                    if (j < i)
                    {
                        value = null;
                    }

                    else
                    {
                        if (j == (i + 1))
                            value = 1;
                        else
                        {
                            value = i == j ? (byte)0 : matrixValues[num++];
                        }
                    }
                    
                    
                    rowVal.Add(value);
                }
                matrix.Add(rowVal);
                
            }
            return new Graph(matrix, false);

        }

        public  static Graph createDirected(int count)
        {
            List<List<byte?>> matrix = new List<List<byte?>>();
            List<byte> matrixValues = Generator.generate(count, Mode.DIRECTED);
            int num = 0;
            for (int i = 0; i < count; i++)
            {
                List<byte?> rowVal = new List<byte?>();
                for (int j = 0; j < count; j++)
                {
                    
                    byte? value = i == j ? (byte?)0 : matrixValues[num++];
                    rowVal.Add(value);
                }
                matrix.Add(rowVal);
            }

            checkDirectedGraph(ref matrix, count);

            return new Graph(matrix, true);

        }

        public  static void createWeight(Graph graph, int min, int max)
        {
            graph.setWeight(Generator.generateWeight(graph.matrix, min, max));
        }

        private static void checkDirectedGraph(ref List<List<byte?>> matrix, int count)
        {
            for (int i = 0; i < count; i++)
            {
                for (int j = 0; j < count; j++)
                {
                    if ((matrix[i][j] == 1) && (matrix[j][i] == 1))
                    {
                        matrix[j][i] = 0;
                    }
                }
            }
        }
    }
}
Код:
using System.Collections.Generic;
using System.Linq;
using WindowsFormsApp1.Model;

namespace WindowsFormsApp1.Util
{
    public static class EdgeCreator
    {
        public static List<Edge> AddEdges(List<Vertex> vertexes, List<List<byte?>> matrix, List<List<string>> weight = null)
        {
            var edges = new List<Edge>();
           
            var count = matrix.Count;
            for (int i = 0; i < count; i++)
                for (int j = 0; j < matrix[i].Count; j++)
                {
                    if (matrix[i][j] == 1)
                    {
                        var vertexP = vertexes.First(x => x.Name == (i+1).ToString());
                        var vertexC = vertexes.First(x => x.Name == (j+1).ToString());
                        var edgesWeight = weight != null ? weight[i][j] : null;
                        edges.Add(new Edge(vertexP, vertexC, edgesWeight));
                    }                            
                }
            return edges;
        }

    }
}
asertrussia вне форума Ответить с цитированием
Старый 07.11.2019, 13:52   #2
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию

Код:
using System.Collections.Generic;
using WindowsFormsApp1.Model;


namespace WindowsFormsApp1.Util
{
    class Generator
    {
        private static void calculate(int count, out int res)
        {
            res = 0;
            for (int i = 1; i <= count; i++)
            {
                res += i;
            }
        }

        public static List<byte> generate(int count,Mode mode)
        {
            List<byte> matrixValues = new List<byte>();
            int res;
            if (mode == Mode.NONDIRECTED)
                calculate(count - 2, out res);
            else {
                res = count * (count - 1);
            }
            for (int i = 0; i < res; i++)
            {
                matrixValues.Add(RandomNumber.genrateBinary());
            }

            return matrixValues;
        }

        public static List<List<string>> generateWeight(List<List<byte?>> matrix, int min, int max)
        {
            List<List<string>> weightValues = new List<List<string>>();
            foreach (var row in matrix)
            {
                List<string> rowWeight = new List<string>();
                foreach (var value in row)
                {
                    if (value == null)
                        rowWeight.Add(null);
                    else
                    {
                        var weight = value == 0 ? "-" : RandomNumber.generateInRange(min, max).ToString();
                        rowWeight.Add(weight);
                    }
                }
                weightValues.Add(rowWeight);
            }
            return weightValues;
        }
    }
}
Код:
using System.Collections.Generic;
using System.Drawing;
using WindowsFormsApp1.Model;

namespace WindowsFormsApp1.Util
{
    public class GraphDrawer
    {
        Bitmap bitmap;
        Pen blackPen;
        Graphics gr;
        Font fo;
        Brush br;
        PointF point;
        public int R = 20; 

        public GraphDrawer(int width, int height)
        {
            bitmap = new Bitmap(width, height);
            gr = Graphics.FromImage(bitmap);
            clearSheet();
            blackPen = new Pen(Color.Black);
            blackPen.Width = 2;
            fo = new Font("Arial", 12);
            br = Brushes.Black;
        }

        public Bitmap GetBitmap()
        {
            return bitmap;
        }

        public void DrawVertex(Vertex V, string number)
        {
            var x = V.XCord;
            var y = V.YCord;
            gr.FillEllipse(Brushes.White, (x - R), (y - R), 2 * R, 2 * R);
            gr.DrawEllipse(blackPen, (x - R), (y - R), 2 * R, 2 * R);
            point = new PointF(x - 9, y - 9);
            gr.DrawString(number, fo, br, point);
            
        }

        public void drawALLGraph(List<Vertex> V, List<Edge> E)
        {
                       
            for (int i = 0; i < E.Count; i++)
            {
                gr.DrawLine(blackPen, E[i].V1.XCord, E[i].V1.YCord, 
                    E[i].V2.XCord, E[i].V2.YCord);
                

            }
            
            for (int i = 0; i < V.Count; i++)
            {
                DrawVertex(V[i], (V[i].Name).ToString());
            }

        }

        public void drawOrientedGraph(List<Vertex> V, List<Edge> E, List<Arrow> arrows)
        {
            for (int i = 0; i < E.Count; i++)
            {
                gr.DrawLine(blackPen, E[i].V1.XCord, E[i].V1.YCord,
                    E[i].V2.XCord, E[i].V2.YCord);
            }


            for (int i = 0; i < V.Count; i++)
            {
                DrawVertex(V[i], (V[i].Name).ToString());
            }

            drawArrow(arrows);
            
            

        }

        public void clearSheet()
        {
            gr.Clear(Color.White);
        }

        public void drawWeights(List<Edge> edges)
        {
            var fo = new Font("Arial", 8);
            foreach (var edge in edges)
            {
                point = new PointF((edge.V1.XCord + edge.V2.XCord) / 2, (edge.V1.YCord + edge.V2.YCord) / 2);
                gr.DrawString(edge.Weight.ToString(), fo, br, point);
            }
            
        }
        public void drawArrow(List<Arrow> arrows)
        {
           
            foreach (var arrow in arrows)
            {
                gr.DrawLine(blackPen, arrow.pStart, arrow.pRight);
                gr.DrawLine(blackPen, arrow.pStart, arrow.pLeft);
            }

        }
    }
}
Код:
using System;
using System.Collections.Generic;
using WindowsFormsApp1.Model;

namespace WindowsFormsApp1.Util
{
    public class VertexCreator
    {
        public static List<Vertex> addVertexes(int count)
        {

            var angle = 360 / count;
            var a = 0;
            var rad = count * 15;
            float x, y;
            var vertexes = new List<Vertex>();
            for (int i = 0; i < count; i++)
            {
                getCord(rad, a, out x, out y);
                vertexes.Add(new Vertex(x, y, (i+1).ToString()));
                a += angle;
            }

            return vertexes;
        }

        private static void getCord(int rad, float a, out float x, out float y)
        {
            float x0 = 150, y0 = 150;
            x = (float)(rad * Math.Sin(a * Math.PI / 180) + x0);
            y = (float)(rad * Math.Cos(a * Math.PI / 180) + y0);
        }
    }
}
asertrussia вне форума Ответить с цитированием
Старый 07.11.2019, 13:54   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Кто то где то раздобыл исходники какой то игры и теперь таким способом решили разобраться что к чему?? Уже наверное 10 тема с однотипным кодом.

Что конкретно объяснить то?? код делает то что задумал автор. Грани добавляет, графы создает и стрелки.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 07.11.2019, 14:02   #4
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Кто то где то раздобыл исходники какой то игры и теперь таким способом решили разобраться что к чему?? Уже наверное 10 тема с однотипным кодом.

Что конкретно объяснить то?? код делает то что задумал автор. Грани добавляет, графы создает и стрелки.
Это не игра.

Исходник https://dropmefiles.com/OTNCE

"Грани добавляет, графы создает и стрелки" - покажите конкретные места.
Попытаюсь сама разобраться.
Изображения
Тип файла: png 21erdfr.PNG (30.5 Кб, 30 просмотров)
asertrussia вне форума Ответить с цитированием
Старый 07.11.2019, 14:06   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от asertrussia Посмотреть сообщение
"Грани добавляет, графы создает и стрелки" - покажите конкретные места.
Попытаюсь сама разобраться.
1. Грани добавляет - гугл транслейт - add edges - ctrl-F "addedges" - разбирайтесь
2. Повторить п.1 для остальных слов
p51x вне форума Ответить с цитированием
Старый 07.11.2019, 14:15   #6
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Грани добавляет - гугл транслейт - add edges - ctrl-F "addedges" - разбирайтесь
2. Повторить п.1 для остальных слов
можете блок-схему нарисовать если не лень.
кода.
asertrussia вне форума Ответить с цитированием
Старый 07.11.2019, 14:17   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от asertrussia Посмотреть сообщение
можете блок-схему
Зачем она нужна то?? программ же полно которые рисуют это дело. Но тут код то в большинстве случаев линейный. Какой смысл в прямоугольничках друг под другом??
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 07.11.2019, 14:27   #8
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Зачем она нужна то?? программ же полно которые рисуют это дело. Но тут код то в большинстве случаев линейный. Какой смысл в прямоугольничках друг под другом??
Ну, мне нужно конкретном примере этом.
Больше тем создавать не буду.

Чтобы в общем понимание было. С блок-схемой будет мне понятней.
asertrussia вне форума Ответить с цитированием
Старый 07.11.2019, 14:32   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Ну так открывайте мейн и идите по порядку.
p51x вне форума Ответить с цитированием
Старый 07.11.2019, 14:35   #10
asertrussia
Новичок
Джуниор
 
Аватар для asertrussia
 
Регистрация: 07.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну так открывайте мейн и идите по порядку.
ох уж если бы я знала
asertrussia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объясните пожалуйста как происходит решение в си YElaman1995 Помощь студентам 1 22.01.2018 10:04
Объясните что здесь происходит, или комментарии понятные weqw121 Помощь студентам 1 15.10.2017 15:00
Объясните, что происходит в части кода fr0st1k123 C# (си шарп) 0 22.05.2017 07:42
PASCAL-Объясните пошагово что происходит в этом цикле пожалуйста kanav2 Паскаль, Turbo Pascal, PascalABC.NET 1 17.03.2017 08:21