private void PracticePicBox_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Переменная, отвечающая за рисование Pen apPen = new Pen(Color.DarkBlue); // Ручка для вершин Brush apBrush = new SolidBrush(Color.DarkBlue); // Заливка вершин Pen linePen = new Pen(Color.Black, 5); // Ручка для дуги linePen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; // На конце – указатель Brush textBrush = new SolidBrush(Color.White); // Цвет названия вершины Font textFont = new Font("Arial", 10, FontStyle.Bold); // Шрифт названия вершины int numberOfApexes = adjMatrix.GetLength(0); // Кол-во вершин ApexPos[] apexPosArr = new ApexPos[numberOfApexes]; // Массив вершин int k = 0; // Номер вершины int picBoxBorder = 510; // Длина стороны квадратного пикчербокса (смещено, на самом деле 716х660) // Идем по координате х с безопасным для 9 вершин шагом for (int x = 0; x <= picBoxBorder; x += picBoxBorder / ((numberOfApexes + 1) / 2)) { // Значение коорд у выражается из формулы круга (x-255)^2 + (y-255)^2 = 255^2 double y1 = Math.Sqrt(Math.Pow(picBoxBorder / 2, 2) - Math.Pow(x - picBoxBorder / 2, 2)); // Считаем первый у (+) y1 += picBoxBorder / 2; g.DrawEllipse(apPen, x, Convert.ToInt32(y1), 20, 20); // Нарисовали вершину g.FillEllipse(apBrush, x, Convert.ToInt32(y1), 20, 20); // Залили вершину g.DrawString((k + 1).ToString(), textFont, textBrush, x + 4, Convert.ToInt32(y1) + 3); // Вставили текст (номер вершины) apexPosArr[k] = new ApexPos(k, x, Convert.ToInt32(y1)); // Записали вершину в массив k++; if (k == numberOfApexes) { break; } if (x != 0 && x != picBoxBorder) // Если х не на границе (на границе будет одна вершина) { double y2 = -Math.Sqrt(Math.Pow(picBoxBorder / 2, 2) - Math.Pow(x - picBoxBorder / 2, 2)); // Считаем второй у (-) y2 += picBoxBorder / 2; g.DrawEllipse(apPen, x, Convert.ToInt32(y2), 20, 20); // Нарисовали вершину g.FillEllipse(apBrush, x, Convert.ToInt32(y2), 20, 20); // Залили вершину g.DrawString((k + 1).ToString(), textFont, textBrush, x + 4, Convert.ToInt32(y2) + 3); // Вставили текст (номер вершины) apexPosArr[k] = new ApexPos(k, x, Convert.ToInt32(y2)); // Записали вершину в массив k++; if (k == numberOfApexes) { break; } } } for (int i = 0; i < numberOfApexes; i++) // Соединяем вершины { for (int j = 0; j < numberOfApexes; j++) { if (adjMatrix[i, j]) { if (apexPosArr[i].X < apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый выше левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y + 20, apexPosArr[j].X, apexPosArr[j].Y); } if (apexPosArr[i].X == apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый над вторым { g.DrawLine(linePen, apexPosArr[i].X + 10, apexPosArr[i].Y + 20, apexPosArr[j].X + 10, apexPosArr[j].Y); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый выше правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y + 20, apexPosArr[j].X + 20, apexPosArr[j].Y); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y == apexPosArr[j].Y) // Если первый правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y + 10, apexPosArr[j].X + 20, apexPosArr[j].Y + 10); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y > apexPosArr[j].Y) // Если первый ниже правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y, apexPosArr[j].X + 20, apexPosArr[j].Y + 20); } if (apexPosArr[i].X == apexPosArr[j].X && apexPosArr[i].Y > apexPosArr[j].Y) // Если первый ниже второго { g.DrawLine(linePen, apexPosArr[i].X + 10, apexPosArr[i].Y, apexPosArr[j].X + 10, apexPosArr[j].Y + 20); } if (apexPosArr[i].X <apexPosArr[j].X && apexPosArr[i].Y> apexPosArr[j].Y) // Если первый ниже левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y, apexPosArr[j].X, apexPosArr[j].Y + 20); } if (apexPosArr[i].X < apexPosArr[j].X && apexPosArr[i].Y == apexPosArr[j].Y) // Если первый левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y + 10, apexPosArr[j].X, apexPosArr[j].Y + 10); } } } } }
private void ParallelPicBox_Paint(object sender, PaintEventArgs e) // РИСУЕМ ЯПФ { Graphics g = e.Graphics; // Переменная, отвечающая за рисование Pen apPen = new Pen(Color.DarkBlue); // Ручка для вершин Brush apBrush = new SolidBrush(Color.DarkBlue); // Заливка вершин Pen linePen = new Pen(Color.Black, 5); // Ручка для дуги linePen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; // На конце – указатель Brush textBrush = new SolidBrush(Color.White); // Цвет названия вершины Font textFont = new Font("Arial", 10, FontStyle.Bold); // Шрифт названия вершины ApexPos[] apexPosArr = new ApexPos[numberOfApexes]; // Массив вершин string[] floors = Controller.Floors(adjMatrix); // Получаем массив с ярусами int picBoxBorder = 530; // Длина стороны квадратного пикчербокса (смещено, на самом деле 716х660) for (int i = 0; i < floors.Length; i++) // Идем по ярусам и рисуем вершины { string[] apNames = floors[i].Split('&'); apNames = Controller.Mas(apNames); // Получили массив названий вершин на i ярусе int Y = Convert.ToInt32((picBoxBorder / floors.Length) * i); // Получили координату Y для i яруса Brush floorsBrush = new SolidBrush(Color.DarkBlue); // Заливка для подписей ярусов Font floorsFont = new Font("Arial", 12, FontStyle.Bold); g.DrawString(i + " яр.", floorsFont, floorsBrush, 0, Y); // Подписали ярус int move = rnd.Next(-picBoxBorder / apNames.Length / 2 + 50, picBoxBorder / apNames.Length / 2 - 20); // Рандомный коэфф сдвига вершины (для избежания наслоения дуг) for (int j = 0; j < apNames.Length; j++) // Идем по вершинам { int X = Convert.ToInt32((picBoxBorder / apNames.Length) * (j + 0.5)) + move; // Получили координату X для j вершины g.DrawEllipse(apPen, X, Y, 20, 20); // Нарисовали вершину g.FillEllipse(apBrush, X, Y, 20, 20); // Залили вершину g.DrawString(apNames[j], textFont, textBrush, X + 4, Y + 3); // Вставили название вершины apexPosArr[Convert.ToInt32(apNames[j]) - 1] = new ApexPos(Convert.ToInt32(apNames[j]), X, Y); // Записали вершину в массив } } for (int i = 0; i < numberOfApexes; i++) // Соединяем вершины { for (int j = 0; j < numberOfApexes; j++) { if (adjMatrix[i, j]) { if (apexPosArr[i].X < apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый выше левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y + 20, apexPosArr[j].X, apexPosArr[j].Y); } if (apexPosArr[i].X == apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый над вторым { g.DrawLine(linePen, apexPosArr[i].X + 10, apexPosArr[i].Y + 20, apexPosArr[j].X + 10, apexPosArr[j].Y); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y < apexPosArr[j].Y) // Если первый выше правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y + 20, apexPosArr[j].X + 20, apexPosArr[j].Y); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y == apexPosArr[j].Y) // Если первый правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y + 10, apexPosArr[j].X + 20, apexPosArr[j].Y + 10); } if (apexPosArr[i].X > apexPosArr[j].X && apexPosArr[i].Y > apexPosArr[j].Y) // Если первый ниже правее второго { g.DrawLine(linePen, apexPosArr[i].X, apexPosArr[i].Y, apexPosArr[j].X + 20, apexPosArr[j].Y + 20); } if (apexPosArr[i].X == apexPosArr[j].X && apexPosArr[i].Y > apexPosArr[j].Y) // Если первый ниже второго { g.DrawLine(linePen, apexPosArr[i].X + 10, apexPosArr[i].Y, apexPosArr[j].X + 10, apexPosArr[j].Y + 20); } if (apexPosArr[i].X <apexPosArr[j].X && apexPosArr[i].Y> apexPosArr[j].Y) // Если первый ниже левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y, apexPosArr[j].X, apexPosArr[j].Y + 20); } if (apexPosArr[i].X < apexPosArr[j].X && apexPosArr[i].Y == apexPosArr[j].Y) // Если первый левее второго { g.DrawLine(linePen, apexPosArr[i].X + 20, apexPosArr[i].Y + 10, apexPosArr[j].X, apexPosArr[j].Y + 10); } } } } }