Ответ 1
Чтобы получить цвет в определенной точке, необходимо понять рассматриваемый градиент, и это не роль класса GradientStopCollection. Концепция этого класса заключается не в понимании градиента, а в простом наборе поддержки градиента.
Важно понимать концепцию каждого класса.
Чтобы получить цвет, вам нужно создать экземпляр класса, представляющего градиент, используя градиент для рисования и, наконец, получить свой цвет от картины.
но я дам вам более быстрое решение. Вы можете использовать алгоритм градиента для создания единственной точки. Это реализация того, как это сделать, используя алгоритм линейного градиента:
public static class GradientStopCollectionExtensions
{
public static Color GetRelativeColor(this GradientStopCollection gsc, double offset)
{
var point = gsc.SingleOrDefault(f => f.Offset == offset);
if (point != null) return point.Color;
GradientStop before = gsc.Where(w => w.Offset == gsc.Min(m => m.Offset)).First();
GradientStop after = gsc.Where(w => w.Offset == gsc.Max(m => m.Offset)).First();
foreach (var gs in gsc)
{
if (gs.Offset < offset && gs.Offset > before.Offset)
{
before = gs;
}
if (gs.Offset > offset && gs.Offset < after.Offset)
{
after = gs;
}
}
var color = new Color();
color.ScA = (float)((offset - before.Offset) * (after.Color.ScA - before.Color.ScA) / (after.Offset - before.Offset) + before.Color.ScA);
color.ScR = (float)((offset - before.Offset) * (after.Color.ScR - before.Color.ScR) / (after.Offset - before.Offset) + before.Color.ScR);
color.ScG = (float)((offset - before.Offset) * (after.Color.ScG - before.Color.ScG) / (after.Offset - before.Offset) + before.Color.ScG);
color.ScB = (float)((offset - before.Offset) * (after.Color.ScB - before.Color.ScB) / (after.Offset - before.Offset) + before.Color.ScB);
return color;
}
}
PS: Этот алгоритм предполагает, что нет остановок с одинаковым смещением. Если есть несколько остановок с одинаковым смещением, будет
InvalidOperationException
.
Добавьте этот класс в ваш текущий контекст (контекст пространства имен)
Чтобы получить свой цвет в любом месте, вы вставляете что-то вроде этого:
var color = grsc.GetRelativeColor(.75);