Создание диаграммы Венна в C # win Form

1

Мне нужно создать диаграмму Венна в форме выигрыша С#. Я пытался это сделать с помощью Graphics.DrawEllipse и FillElipse. Но я не уверен, как заполнить общую часть.

Я хочу добиться этого,

Изображение 174551

Вот мой код для этого,

private void panelControlVennDiagram_Paint(object sender, PaintEventArgs e)
{
  Brush brushLeft = new SolidBrush(Color.Blue);
  Brush brushRight = new SolidBrush(Color.LightPink);
  Brush brushCommon = new SolidBrush(Color.Purple);

  Pen pen = new Pen(brushLeft, 10);

  Rectangle leftVenn = new Rectangle(20, 50,100,100);
  Rectangle rightVenn = new Rectangle(90, 50, 100, 100);
  Rectangle commonVenn = new Rectangle(100, 120, 100, 100);

  Font stringFont = new Font("Times New Roman", 9);

  e.Graphics.DrawString("Left:" + leftValue, stringFont, brushLeft, 10,70);
  e.Graphics.DrawString("Right:" + rightValue, stringFont, brushRight, 90,70);
  e.Graphics.DrawString("Common:" + commonValue,stringFont, brushCommon, 100,70);

  // Fill ellipse on screen.
  e.Graphics.FillEllipse(brushLeft, leftVenn);
  e.Graphics.FillEllipse(brushRight, rightVenn);

  e.Graphics.DrawEllipse(Pens.White, leftVenn);
  e.Graphics.DrawEllipse(Pens.White, rightVenn);

}

Я рисую два эллипса и должен иметь другой цвет для общей части. Я не могу использовать какую-либо библиотеку. Пожалуйста помоги.

  • 0
    Примечание: Пожалуйста, утилизируйте все кисти и ручки или превратите их в поля вместо локальной переменной, чтобы использовать их повторно.
Теги:
winforms
graphics
onpaint

2 ответа

2
Лучший ответ

Вы можете добавить System.Drawing.Drawing2D; пространство имен для использования GraphicPath. Создайте графический путь и получите область пересечения.

Попробуйте этот код: (Я прокомментировал DrawString для целей тестирования)

private void panelControlVennDiagram_Paint(object sender, PaintEventArgs e)
{
    Rectangle leftVenn = new Rectangle(20, 50, 100, 100);
    Rectangle rightVenn = new Rectangle(90, 50, 100, 100);          
    Region region1 = new Region();

    //Font stringFont = new Font("Times New Roman", 9);
    //e.Graphics.DrawString("Left:" , stringFont, brushLeft, 10, 70);
    //e.Graphics.DrawString("Right:" , stringFont, brushRight, 90, 70);
    //e.Graphics.DrawString("Common:", stringFont, brushCommon, 100, 70);

    // Fill ellipse on screen.
    using(Brush brushLeft = new SolidBrush(Color.Blue))
    {    
        e.Graphics.FillEllipse(brushLeft, leftVenn);
        e.Graphics.DrawEllipse(Pens.White, leftVenn);
    }

    using(Brush brushRight = new SolidBrush(Color.LightPink))
    {
        e.Graphics.FillEllipse(brushRight, rightVenn);        
        e.Graphics.DrawEllipse(Pens.White, rightVenn);
    } 

    using (GraphicsPath circle_path = new GraphicsPath())
    {
        circle_path.AddEllipse(leftVenn);
        region1.Intersect(circle_path);
    }

    using (GraphicsPath circle_path = new GraphicsPath())
    {
        circle_path.AddEllipse(rightVenn);
        region1.Intersect(circle_path);
    }

    using(Brush brushCommon = new SolidBrush(Color.Purple))
    {  
        e.Graphics.FillRegion(brushCommon, region1);
    }

}

Выход:

Изображение 174551

  • 0
    Это работает хорошо ... Еще один вопрос, связанный с этим, я также хотел бы обрабатывать щелчки мыши в левой / правой и общей части диаграммы Венна. Как сохранить местоположение мыши?
3

вы можете использовать полупрозрачный цвет, чтобы цвет перекрывающихся частей был фактическим составным цветом двух кругов

Brush brushLeft = new SolidBrush(Color.FromArgb(50, Color.Blue));
Brush brushRight = new SolidBrush(Color.FromArgb(50, Color.Red));

Изображение 174551

  • 0
    Может кто-нибудь, пожалуйста, посоветуйте, как обрабатывать щелчки мышью в каждой из этих областей ... Левый / Правый / Общий?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню