@Nem0_o

Как сделать так, чтобы линии не перекрывали фигуры (Windows Forms)?

Делаю редактор графа, и столкнулся с одной проблемой - при рисовании ребер графа линии перекрывают вершину, так как рисую линию от центра к центру окружности:
860c423fb6544995a695812ec08c272d.png
Можно как-то сделать, чтобы линии не перекрывали окружности? Т.е. вот так:
0fb305e152b34c0dac1660844abe4fc9.png

Код (С#):
//рисует вершину графа
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            // проверка флага нажатия
            if (!crc_OK)
                return;

            if (step == 9)
                button1.Enabled = false;

            Point pointLocation = pictureBox1.PointToClient(Cursor.Position);
            if (pictureBox1.Image == null) { pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); }
            var bmp = new Bitmap(pictureBox1.Image);
            var g = Graphics.FromImage(bmp);
            g.DrawString(step.ToString(), DefaultFont, Brushes.Black, e.X - 5, e.Y - 5);
            g.DrawEllipse(Pens.Black, e.X - 10, e.Y - 10, 20, 20);
            label1.Text = "Добавлена вершина " + Convert.ToString(step);
            pictureBox1.Image = bmp;
            masX[step] = e.X;
            masY[step] = e.Y;
            label3.Text = "X:" + Convert.ToString(masX[step]);
            label2.Text = "Y:" + Convert.ToString(masY[step]);
            step++;
            crc_OK = false;
        }

        //рисует ребро
        private void button2_Click(object sender, EventArgs e)
        {
            int first_toop = Convert.ToInt16(textBox1.Text);
            int second_toop = Convert.ToInt16(textBox2.Text);
            if (first_toop > 9 || second_toop > 9)
            {
                MessageBox.Show("Недопустимое значение.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            if (pictureBox1.Image == null) { pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); }
            var bmp = new Bitmap(pictureBox1.Image);
            var g = Graphics.FromImage(bmp);
            g = Graphics.FromImage(pictureBox1.Image);
            g.DrawLine(Pens.DarkGray, masX[first_toop], masY[first_toop], masX[second_toop], masY[second_toop]);
            label1.Text = "Добавлено ребро " + Convert.ToString(first_toop) + " - " + Convert.ToString(second_toop);
            pictureBox1.Refresh();
        }
  • Вопрос задан
  • 3370 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
Собственно два варианта.
1. Рисовать вершины в конце и заполнять их фоном через FillEllipse
2. Так как размер вершины графа известен, то рисовать линии до границы вершины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы