Как градиентно менять цвета точек в зависимости от их высоты?
С помощью 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
));
}
Хотелось бы получить результат похожий на этот:

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