OxyPlot中的ContourSeries是否可以使轮廓线更平滑?

时间:2019-07-23 19:33:41

标签: c# wpf oxyplot

我使用OxyPlot绘制轮廓,但是在某些地方它们看起来有些粗糙,因此我需要对其进行平滑处理。因此,我想知道是否可以使用OxyPlot平滑轮廓,或者是否需要其他东西?

我知道您可以平滑LineSeries,因此通过查看LineSeries的代码,我尝试将代码进行平滑处理以放入ContourSeries中,但是我无法完全弄清一切如何工作。我试图在互联网上找到平滑算法,但找不到很多,而我尝试的根本不起作用。

此外,我试图寻找另一个用于绘制轮廓的库,但是OxyPlot似乎是WPF的最佳免费版本,但是如果您有其他建议可以给我带来更好的结果,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过更多搜索后,我发现一种算法做得很好,但是有些需要关闭的行却没有,但是与我尝试过的其他算法相比,性能确实很好。

这是算法

private void SmoothContour(List<DataPoint> points, int severity = 1)
    {
        for (int i = 1; i < points.Count; i++)
        {
            var start = (i - severity > 0 ? i - severity + 1 : 0);
            var end = (i + severity < points.Count ? i + severity + 1 : points.Count);

            double sumX = 0, sumY = 0;

            for (int j = start; j < end; j++)
            {
                sumX += points[j].X;
                sumY += points[j].Y;
            }

            DataPoint sum = new DataPoint(sumX, sumY);

            DataPoint avg = new DataPoint(sum.X / (end - start), sum.Y / (end - start));

            points[i] = avg;

        }
    }

它基于以下方法:https://stackoverflow.com/a/18830268/11788646

之后,我将此方法放在ContourSeries类中,如下所示:

List<Contour> smoothedContours = new List<Contour>();

for (int i = 0; i < contours.Count; i++)
{
    List<DataPoint> smoothedPoints = new List<DataPoint>(contours[i].Points);

    for (int j = 0; j < SmoothLevel; j++)
    {
        SmoothContour(smoothedPoints);
    }

    Contour contour = new Contour(smoothedPoints, contours[i].ContourLevel);
    smoothedContours.Add(contour);
}

contours = smoothedContours;

它位于CalculateContours()方法调用之后的JoinContourSegments()方法中。我还添加了一个SmoothLevel属性,以增加线条的平滑度。越高,线条越平滑,但是将其设置得太高时,效果就不太好。所以我保持在10,这很好。