C#:如何在C#中获取图表中两个系列之间的面积?

C#:如何在C#中获取图表中两个系列之间的面积?,c#,charts,area,C#,Charts,Area,我在c#的图表中有两个系列。我只想得到这两个系列之间的面积。这些系列是相互连接的 我已附上图表图像 这里有两个系列。例如,系列1和系列2。如果序列2跨越级数1,则该区域将不被考虑。仅当series2低于series1时,此区域仅需计算。静态void Main(字符串[]args) static void Main(string[] args) { List<Point> Points1 = new List<Point>(); //Points1.Add

我在c#的图表中有两个系列。我只想得到这两个系列之间的面积。这些系列是相互连接的

我已附上图表图像

这里有两个系列。例如,系列1和系列2。如果序列2跨越级数1,则该区域将不被考虑。仅当series2低于series1时,此区域仅需计算。

静态void Main(字符串[]args)
static void Main(string[] args)
{
    List<Point> Points1 = new List<Point>();
    //Points1.Add(); assign your series points

    List<Point> Points2 = new List<Point>();
    //Points2.Add(); assign your series points

    Series Series1 = new Series(Points1);
    Series Series2 = new Series(Points2);

    var betweenArea = Math.Abs(Series1.Area() - Series2.Area());
}

public class Series
{

    List<Point> Points { get; set; }

    public Series(List<Point> points)
    {
        Points = points;
    }

    public double Area()
    {
        double Area = 0;
        var points = Points.OrderBy(P => P.X).ToList();
        for (int i = 0; i < points.Count - 1; i++)
        {
            Point Point1;
            Point Point2;
            if (points[i].Y < points[i + 1].Y)
            {
                Point1 = points[i];
                Point2 = points[i + 1];
            }
            else
             {
                 Point1 = points[i + 1];
                 Point2 = points[i];
             }

             Area += Point1.Y * (Math.Abs(Point1.X - Point2.X));

            Area += ((Math.Abs(Point1.Y - Point2.Y)) * (Math.Abs(Point1.X - Point2.X)))/2;
        }

        return Area;
    }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}
{ 列表点1=新列表(); //点1.Add();指定系列点 列表点2=新列表(); //Points2.Add();指定系列点 系列系列1=新系列(点1); 系列2=新系列(点2); var betweenArea=Math.Abs(Series1.Area()-Series2.Area()); } 公开课系列 { 列表点{get;set;} 公共系列(列表点) { 点数=点数; } 公共双区() { 双面积=0; var points=points.OrderBy(P=>P.X.ToList(); 对于(int i=0;i
你可以给面积上色,但计算面积是一个数学问题

我会这样做:

  • 首先,对于每个系列中的每个点,在其正上方/正下方添加/插入点
  • 现在有了一系列具有平行垂直边的多边形
  • 每个区域可以分成三部分:中心矩形和顶部和底部三角形
  • 宽度和高度为KNOW,因此矩形区域为
    w*h
    ,三角形区域为
    w*h/2
  • 通过对相应序列中的上一个点和下一个点进行插值,可以找到相应的点
只是一些简单的步骤。更难的是跟踪起点和终点以及空箱和特殊情况

  • 正常情况下,下图为绿色/洋红色
  • 如果一侧为零,则没有问题
  • 如果系列1中的一个点高于或低于系列2中的下一个点,则需要再添加两个点,并在倾斜多边形上进行计算。请参见下面的橙色/青色线条

我不知道是否有一种内置的方法可以做到这一点,但计算两个系列的面积然后取其差值非常简单。如何计算单个系列的面积?每个线段都是梯形(或矩形+三角形)。把每个线段的面积加起来,就得到了这个系列的总面积。你可以给面积上色,但是计算它的面积是一个数学问题。啊,这样简单多了!我正在尝试这个代码。但是我在这一行“var points=points.OrderBy(P=>P.X).ToList();”中得到了一条错误消息“Value cannot be null”:公共部分类Form1:Form{public Form1(){InitializeComponent();}Series Series1=new Series();Series Series2=new Series();private void button1\u单击(object sender,EventArgs e){var betweenArea=Math.Abs(Series1.Area()-Series2.Area());}私有无效按钮2(object sender,EventArgs e){chart1.Series[“Series1”].ChartType=serieChartChartType.Line;chart1.Series1[“Series1”].MarkerStyle=MarkerStyle.Circle;chart1.Series[“Series1”]。Color=Color.Blue;chart1.Series2[“Series2”]。ChartType=SeriesChartType.Line;chart1.Series2[“Series2”]。MarkerStyle=MarkerStyle.Circle;chart1.Series2[“Series2”]。Color=Color.Red;chart1.Series1[“Series1”]。Points.AddXY(3,4);chart1.Series[“Series1”]Points.AddXY(5,4);chart1.Series[“Series2”]Points.AddXY(3,4);chart1.Series[“Series2”]Points.AddXY(3,2);chart1.Series[“Series2”]Points.AddXY(5,2);chart1.Series[“Series2”]Points.AddXY(5,4);}@rakib我是在控制台应用程序中写的,但主要是代码,你们可以复制粘贴到任何你们想要的地方