Как я вычисляю четыре цветовых градиента?

От этого сайта:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# действительно позволяет использование [Дополнительного] атрибута (от VB, хотя не функциональный в C#). Таким образом, у Вас может быть метод как это:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

В нашей обертке API, мы обнаруживаем дополнительные параметры (ParameterInfo p. IsOptional) и набор значение по умолчанию. Цель состоит в том, чтобы отметить параметры как дополнительные, не обращаясь к клуджам как наличие "дополнительного" на название параметра.

14
задан Roland Rabien 9 July 2009 в 23:28
поделиться

2 ответа

Лучшее решение, когда требуется градиент между двумя цветами, - использовать представление HSV (значение насыщенности оттенка).

Если у вас есть значения HSV для ваши два цвета, вы просто выполняете линейную интерполяцию для H, S и V, и вы получаете хорошие цвета (интерполяция в пространстве RGB всегда приводит к «плохим» результатам).

Вы также можете найти здесь формулы для перехода от RGB к HSV и от HSV к RGB, соответственно.

Теперь для вашей проблемы с четырьмя углами вы можете сделать линейную комбинацию четырех значений H / S / V, взвешенных по расстоянию от E до что четыре точки A, B, C и D.

EDIT: тот же метод, что и tekBlues, но в пространстве HSV (его довольно легко проверить в пространствах RGB и в пространствах HSV. И вы увидите различия. В HSV, вы просто поворачиваете хроматический цилиндр,и поэтому это дает хороший результат)

EDIT2: если вы предпочитаете «скорость и простоту», вы можете использовать L1-норму вместо L2-нормы (евклидова норма)

Итак, если a - это размер вашего квадрата, а координаты ваших точек - A ( 0 , 0 ), B ( 0 , a ), C ( a , 0 ), D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Hue (A) - оттенок точки A, Hue (B) оттенок B и т. Д.

Вы применяете те же формулы для насыщенности и значения.

После того, как у вас есть оттенок / насыщенность / значение для точки E, вы можете преобразовать его в пространство RGB .

если вы предпочитаете «скорость и простоту», вы можете использовать L1-норму вместо L2-нормы (евклидова норма)

Итак, если a - это размер вашего квадрата и координата ваши очки: A ( 0 , 0 ), B ( 0 , a ), C ( a , 0 ), D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Оттенок (A) - это оттенок точки A, оттенок (B) оттенок B и т. Д. ...

Вы применяете те же формулы для насыщенности и значения.

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

если вы предпочитаете «скорость и простоту», вы можете использовать L1-норму вместо L2-нормы (евклидова норма)

Итак, если a - это размер вашего квадрата и координата ваши баллы: A ( 0 , 0 ), B ( 0 , a ), C ( a , 0 ), D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Оттенок (A) - это оттенок точки A, оттенок (B) оттенок B и т. Д. ...

Вы применяете те же формулы для насыщенности и значения.

Когда у вас есть оттенок / насыщенность / значение для точки E, вы можете преобразовать их в пространство RGB.

если a - это размер вашего квадрата, а координаты ваших точек - A ( 0 , 0 ), B ( 0 , a ), C ( a , 0 ), D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Hue (A) - оттенок точки A, Оттенок (B) Оттенок B и т. Д.

Вы применяете те же формулы для Насыщенности и Значения.

После того, как у вас есть Оттенок / Насыщенность / Значение для вашей точки E, вы можете преобразовать это в пространстве RGB.

если a - это размер вашего квадрата, а координаты ваших точек - A ( 0 , 0 ), B ( 0 , a ), C ( a , 0 ), D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Hue (A) - оттенок точки A, Оттенок (B) Оттенок B и т.д ...

Вы применяете те же формулы для Насыщенности и Значения.

После того, как у вас есть Оттенок / Насыщенность / Значение для вашей точки E, вы можете преобразовать это в пространстве RGB.

D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Цветовой тон (A) - это оттенок точки A, оттенок (B) оттенок B и т.д ...

Вы применяете те же формулы для насыщенности и Значение.

Если у вас есть оттенок / насыщенность / значение для точки E, вы можете преобразовать его в пространство RGB.

D ( a , a ), затем оттенок точки E ( x , y ) можно вычислить с помощью:

Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)

где Цветовой тон (A) - это оттенок точки A, оттенок (B) оттенок B и т.д ...

Вы применяете те же формулы для насыщенности и Значение.

Когда у вас есть оттенок / насыщенность / значение для точки E, вы можете преобразовать его в пространство RGB.

23
ответ дан 1 December 2019 в 10:19
поделиться
  1. Определите расстояние от точки E до каждой точки A, B, C, D
  2. Цвет точки E будет сочетанием красного / зеленого / синего цветов. Рассчитайте каждую цветовую ось как среднее значение той же цветовой оси для A, B, C, D, взвешивая по расстоянию.

    distance_a = sqrt ((xa-xe) ^ 2 + (ya-ye) ^ 2)

    distance_b = ....

    sum_distances = distance_a + distance_b ...

    red = (red_a distance_a + red_b distance_b ...) / sum_distances

    color_E = ColorFromARgb (красный, зеленый, синий)

1
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: