Мне нужно создать диаграмму Венна в форме выигрыша С#. Я пытался это сделать с помощью Graphics.DrawEllipse и FillElipse. Но я не уверен, как заполнить общую часть.
Я хочу добиться этого,
Вот мой код для этого,
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);
}
Я рисую два эллипса и должен иметь другой цвет для общей части. Я не могу использовать какую-либо библиотеку. Пожалуйста помоги.
Вы можете добавить 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);
}
}
Выход:
вы можете использовать полупрозрачный цвет, чтобы цвет перекрывающихся частей был фактическим составным цветом двух кругов
Brush brushLeft = new SolidBrush(Color.FromArgb(50, Color.Blue));
Brush brushRight = new SolidBrush(Color.FromArgb(50, Color.Red));