C # WinForms - диаграмма рисует больше точек, которые указаны - PullRequest
0 голосов
/ 01 июня 2018

Я пишу простое приложение WinForm, которое должно рисовать графики на основе входных ребер.

В примере, где я ввожу 5 ребер (с меткой: 0,1,2,3,4), диаграмма рисует 8 дополнительных точек для каждого ребра, которые идут как линия.Я подозреваю, что WinForm пытается выполнить некоторую нормализацию графа, которая создает дополнительные точки на основе существующих, но я не могу найти вариант, который вызывает это.

Only Points labeled are the ones that I entered, the rest of them is coming from I don't know where

Код, который рисует массив Points:

foreach (int pt in points)
                    {

                        double dx = pointsToDraw[pt].X;
                        double dy = pointsToDraw[pt].Y;
                        chart1.Series[0].Points.AddXY(dx, dy);
                        chart1.Series[0].Points[pt].Label = pt.ToString();

                    }

массив точек в выражении foreach:

[0] 0   int
[1] 1   int
[2] 2   int
[3] 3   int
[4] 4   int
* 1015Список * pointsToDraw, со всеми точками с прикрепленными координатами:
+       [0] {X = 260 Y = 385}   System.Drawing.Point
+       [1] {X = 320 Y = 385}   System.Drawing.Point
+       [2] {X = 240 Y = 385}   System.Drawing.Point
+       [3] {X = 250 Y = 370}   System.Drawing.Point
+       [4] {X = 400 Y = 370}   System.Drawing.Point

РЕДАКТИРОВАТЬ:

Это странно, потому что метод chart1_Paint выполняется бесконечно, и именно поэтому есть так много точек.Вот метод:

private void chart1_Paint(object sender, PaintEventArgs e)
        {
            List<Point> pointsToDraw = new List<Point>();
            List<int> pointsList = new List<int>();
            int[] points;

            if (Tree != null)
            {
               foreach(Tuple<int,int> tp in Tree)
                {
                    pointsList.Add(tp.Item1);
                    pointsList.Add(tp.Item2);
                }
                IEnumerable<int> pointsDistinct = pointsList.Distinct();
                pointsDistinct = pointsDistinct.OrderBy(s => s);
                points = pointsDistinct.ToArray();

                for (int i = 0; i < points.Count(); i++)
                {
                    Point pt = new Point(begX, begY);
                    pointsToDraw.Add(pt);
                }
                int y = 1;
                List<int> pointsAdded = new List<int>();
                for (int i = 0; i < points.Count(); i++)
                {
                    foreach (Tuple<int, int> tp in Tree)
                    {

                        if(points[i] == tp.Item1)
                        {
                            if(pointsAdded.Where(x => x == points[i]).Count() == 0)
                            {
                                pointsToDraw[tp.Item1] = new Point(begX, begY);
                                begX = begX + 10;
                                begY = begY - 15;
                                pointsAdded.Add(points[i]);
                            }
                            if (pointsAdded.Where(x => x == tp.Item2).Count() == 0)
                            {

                                pointsToDraw[tp.Item2] = new Point(pointsToDraw[tp.Item1].X+(10*y), pointsToDraw[tp.Item1].Y-15);

                                pointsAdded.Add(tp.Item2);
                            }
                        }
                        if (points[i] == tp.Item2)
                        {
                            if (pointsAdded.Where(x => x == points[i]).Count() == 0)
                            {
                                pointsToDraw[tp.Item2] = new Point(begX, begY);
                                begX = begX - 10;
                                begY = begY - 15;
                                pointsAdded.Add(points[i]);
                            }
                            if (pointsAdded.Where(x => x == tp.Item1).Count() == 0)
                            {
                                pointsToDraw[tp.Item2] = new Point(pointsToDraw[tp.Item1].X + (10 * y), pointsToDraw[tp.Item1].Y - 15);

                                pointsAdded.Add(tp.Item2);
                            }
                        }
                        y++;
                    }
                }

                    foreach (int pt in points)
                    {

                    double dx = pointsToDraw[pt].X;//chart1.ChartAreas[0].AxisX.PixelPositionToValue(pointsToDraw[pt].X);
                        double dy = pointsToDraw[pt].Y;//chart1.ChartAreas[0].AxisY.PixelPositionToValue(pointsToDraw[pt].Y);
                        chart1.Series[0].Points.AddXY(dx, dy);
                        chart1.Series[0].Points[pt].Label = pt.ToString();

                    }
                if (pointsToDraw.Count > 1)
                    using (Pen pen = new Pen(Color.Red, 2.5f))
                        foreach (Tuple<int, int> tp in Tree)
                        {
                            Point[] eds = new Point[] { pointsToDraw[tp.Item1], pointsToDraw[tp.Item2] };
                            e.Graphics.DrawLines(pen, eds);
                        }
            }

            }

Я запускаю его, нажимая кнопку и выполняя метод chart1.Invalidate ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...