@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();
        }
  • Вопрос задан
  • 3389 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
Собственно два варианта.
1. Рисовать вершины в конце и заполнять их фоном через FillEllipse
2. Так как размер вершины графа известен, то рисовать линии до границы вершины.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы