Можно ли получить более плавные контурные линии с помощью ContourSeries в OxyPlot?

Я использовал OxyPlot для рисования контуров, но в некоторых местах они кажутся немного грубыми, поэтому мне нужно их сгладить. Итак, мне было интересно, можно ли сгладить контур с помощью OxyPlot или мне нужно что-то еще?

Я знаю, что вы можете сгладить LineSeries, поэтому, заглянув внутрь кода LineSeries, я попытался поместить код для сглаживания в ContourSeries, но я не совсем могу понять, как все работает. Я пытался найти алгоритм сглаживания в Интернете, но мне удалось найти не так много, а те, что я пробовал, вообще не работали.

Кроме того, я попытался найти другую библиотеку для рисования контуров, но OxyPlot кажется лучшей бесплатной для WPF, но если у вас есть другие предложения, которые могут дать мне лучшие результаты, я был бы признателен.


person Sacacaka    schedule 23.07.2019    source источник


Ответы (1)


После еще нескольких поисков я нашел алгоритм, который довольно хорошо справлялся со своей задачей, но некоторые строки, которые нужно было закрыть, не закрывались, но производительность была действительно хорошей по сравнению с другими алгоритмами, которые я пробовал.

Вот алгоритм

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, и это хорошо.

person Sacacaka    schedule 25.07.2019