От этого сайта:
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) и набор значение по умолчанию. Цель состоит в том, чтобы отметить параметры как дополнительные, не обращаясь к клуджам как наличие "дополнительного" на название параметра.
Лучшее решение, когда требуется градиент между двумя цветами, - использовать представление 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.
Цвет точки 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 (красный, зеленый, синий)