是否可以使用 OxyPlot 中的 ContourSeries 获得更平滑的轮廓线?
Is it possible to have smoother contour lines with the ContourSeries in OxyPlot?
我用OxyPlot绘制等高线,但有些地方看起来有点粗糙,所以我需要平滑它们。所以,我想知道是否可以使用 OxyPlot 平滑轮廓,或者我是否需要其他东西?
我知道您可以对 LineSeries 进行平滑处理,因此通过查看 LineSeries 的代码,我试图将用于平滑处理的代码放入 ContourSeries 中,但我不太清楚一切是如何工作的。我试图在 Internet 上找到平滑算法,但找不到很多,而且我尝试过的算法根本不起作用。
此外,我曾尝试寻找另一个用于绘制轮廓的库,但 OxyPlot 似乎是最好的免费 WPF 库,但如果您有其他建议可以给我更好的结果,我将不胜感激。
经过更多的搜索,我发现一个算法做得很好,但有些需要关闭的行却没有,但是与我尝试过的其他算法相比,性能确实很好。
这是算法
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;
}
}
基于此方法:
之后,我将此方法放入 ContourSeries class 中,如下所示:
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,这很好。
我用OxyPlot绘制等高线,但有些地方看起来有点粗糙,所以我需要平滑它们。所以,我想知道是否可以使用 OxyPlot 平滑轮廓,或者我是否需要其他东西?
我知道您可以对 LineSeries 进行平滑处理,因此通过查看 LineSeries 的代码,我试图将用于平滑处理的代码放入 ContourSeries 中,但我不太清楚一切是如何工作的。我试图在 Internet 上找到平滑算法,但找不到很多,而且我尝试过的算法根本不起作用。
此外,我曾尝试寻找另一个用于绘制轮廓的库,但 OxyPlot 似乎是最好的免费 WPF 库,但如果您有其他建议可以给我更好的结果,我将不胜感激。
经过更多的搜索,我发现一个算法做得很好,但有些需要关闭的行却没有,但是与我尝试过的其他算法相比,性能确实很好。
这是算法
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;
}
}
基于此方法:
之后,我将此方法放入 ContourSeries class 中,如下所示:
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,这很好。