Чтобы получить цвет в определенной точке, необходимо понимать рассматриваемый градиент, и это не роль класса 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);
person
Jonny Piazzi
schedule
10.03.2012