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

4

我在C#的图表中有两个系列。我想要获取这两个系列之间的区域。这些系列彼此连接。

我已经附上了图表图片。

enter image description here

这里有两个数据系列,例如Series1和Series2。如果Series2越过Series1,则该区域将不被考虑。只有当Series2在Series1下方时,才需要计算该区域。

我不知道是否有内置的方法来做到这一点,但计算两个序列的面积然后取它们的差异相当简单。 - Axis
如何计算单个系列的面积? - rakib
每条线段都是一个梯形(或矩形+三角形)。将每个线段的面积加起来,就得到了该系列的总面积。 - Axis
你可以为区域着色,在这里查看,但计算其面积涉及数学问题。 - TaW
2个回答

3
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; }
}

啊,这样简单多了! - TaW
chart1.Series["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
1
@rakib 我是在控制台应用程序中编写的,但主要是代码,你可以将其复制粘贴到任何地方。 - Kahbazi
当我尝试添加点“Points1.Add(3,4);”时,它显示错误“将对象添加到List<T>的末尾”。 - rakib
@rak:请不要在评论中添加大段的代码!相反,请编辑您的问题! - TaW
显示剩余4条评论

2
您可以对该区域进行着色,请参见此处,但计算其面积是一个数学问题。
以下是我会做的:
  • 首先,对于每个系列中的每个点,添加/插入其直接上方/下方的点。
  • 现在,您有一系列具有平行垂直边缘的多边形。
  • 每个多边形的面积可以分为三个部分:中心矩形和顶部和底部三角形。
  • 宽度和高度已知,因此矩形的面积为w*h,三角形的面积为w*h/2
  • 相应的点是通过插值相应系列中的前一个和后一个点找到的。
这只是一些简单的步骤。更难的部分是跟踪起始点和结束点以及空白和特殊情况。
  • 正常情况如下图所示:
  • 如果一侧为零,则没有问题
  • 如果系列1中的一个点高于或低于系列2中的下一个点,则需要添加两个以上的点,并在倾斜的多边形上重新计算。请参见下图中的橙色/青色线条!
enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接