Как градиентно менять цвета точек в зависимости от их высоты?

С помощью helix-toolkit.SharpDX.Core я отображаю облака точек. Их цвет необходимо менять в зависимости от координаты Y, то есть высоты этой точки.

Geometry = new PointGeometry3D()
                {
                    Positions = new Vector3Collection(positions.ToVector3Collection()),
                    Colors = new Color4Collection(positions.ToColor4Collection())
                },
                EnableColorBlending = true,
                BlendingFactor = 1.0f,
                Color = Color.FromArgb(255, 255, 255, 255)

У меня есть простой алгоритм изменения цвета точки от красного к синему, но хотелось бы, чтобы синий постепенно переходил в красный цвет. Сейчас цвет меняется резко и имеются какие-то вкрапления цветов друг в друга. Текущий результат

Алгоритм получения цвета:

private Color4 GetColor(double maxHeight)
        {
            // Нормализация высоты от 0 до 1
            double normalizedHeight = Y / maxHeight;

            Color4 redColor = new Color4(1.0f, 0.0f, 0.0f, 1f);
            Color4 blueColor = new Color4(0.0f, 0.0f, 1.0f, 1f);

            // Определение границ градиента для красного и синего
            double redGradientBoundary = 0.85;
            double blueGradientBoundary = 0.15;

            // Линейная интерполяция цвета в зависимости от высоты
            if (normalizedHeight >= redGradientBoundary)
            {
                return InterpolateColor(blueColor, redColor, (normalizedHeight - redGradientBoundary) / (1 - redGradientBoundary));
            }
            else
            {
                return InterpolateColor(Color4.Black, blueColor, normalizedHeight / blueGradientBoundary);
            }
        }

        private Color4 InterpolateColor(Color4 color1, Color4 color2, double t)
        {
            float r = (float)(color1.Red * (1 - t) + color2.Red * t);
            float g = (float)(color1.Green * (1 - t) + color2.Green * t);
            float b = (float)(color1.Blue * (1 - t) + color2.Blue * t);
            float a = (float)(color1.Alpha * (1 - t) + color2.Alpha * t);

            return new Color4(r, g, b, a);
        }

Вот тут происходит заполнения точек в массив positions:

foreach (var contour in contours)
            {
                var maxHeight = contour.Points.Max(x => x.Y);
                Debug.WriteLine(maxHeight);
                foreach (var point in contour.Points)
                {
                    result.Add(new SharedTool.Contour.Point3D
                    (
                        point.X,
                        point.Y,
                        dZ,
                        point.Intensity,
                        maxHeight
                    ));
                }

Хотелось бы получить результат похожий на этот: target

Как я могу прийти к плавному переходу цветов от синего к красному? В чем может быть проблема неправильного расположения цветов? Например, дорога красного цвета быть не должна. Так как красный цвет должен быть сверху, а синий снизу.

Возможно, необходимо использовать Indices в PointGeometry3D. Но я не совсем понял суть этого поля.


Ответы (0 шт):