Окрашивание треугольника «естественно» с использованием SVG-градиентов - PullRequest
7 голосов
/ 06 июля 2010

У меня есть 3 точки, окрашенные H1, H2 и H3, где каждый Hi имеет 100% насыщенность и значение, и меняется только оттенок.Другими словами, это цвета "радуги".

Я хочу использовать функцию градиента SVG, чтобы раскрасить треугольник «естественно».Другими словами, точки, близкие к H1, должны иметь оттенок H1, окраска должна быть непрерывной и т. Д.

Хорошо ли определена эта проблема?Есть ли действительно такая (уникальная?) Окраска?

Незначительный: я не считаю, что оттенки «обертывают вокруг».Другими словами, цвет между оттенками 0,995 и 0,003 составляет 0,499, а не 0,999.

Если у этой проблемы есть решение, можно ли ее расширить, чтобы «естественным образом» раскрасить выпуклую оболочку любого набора цветных точек на плоскости, используя триангуляцию Делоне?

Ответы [ 5 ]

7 голосов
/ 24 октября 2012

Эта нить давно умерла, я понимаю. Но я публикую этот ответ в надежде, что в будущем он кому-нибудь пригодится. Если вы можете расширить уравнения в правильную разметку SVG, то мы сделали это. Я разработал это конкретное решение для какао, но математика полностью актуальна.

Подход включает в себя небольшую математическую математику, чтобы найти вектор градиента треугольника, который дает направление (x, y) самого крутого подъема по отношению к z - это направление цветового градиента. Начальная / конечная точки цветового градиента определяются пересечением наклона вектора градиента (ограниченного началом координат x, y) с изо-линиями на плоскости треугольника, описывающими zmin и zmax.

Для начала плоскость, пересекающую три точки {p1, p2, p3} треугольника, можно описать уравнением:

A1(x) + A2(y) + A3(z) - A = 0

, где A - определитель:

    |p1x  p1y  p1z|
A = |p2x  p2y  p2z|
    |p3x  p3y  p3z|

и Ai - это один и тот же определитель, но замените столбец i вектором столбца:

            1                     |p1x  1  p1z|
column(i) = 1          e.g., A2 = |p2x  1  p2z|
            1                     |p3x  1  p3z|

Вектор градиента grad(z) описывает направление наискорейшего подъема, которое также является траекторией градиента цвета:

grad(z) = [-A1/A3 (i), -A2/A3 (j)]

поэтому в плоскости x, y этот вектор градиента лежит вдоль линии:

y = x * A2/A1 + b, 

где b может быть чем угодно, но давайте установим b = 0. это ограничивает траекторию цветового градиента линией, пересекающей начало координат:

y = x * A2/A1                 [eqn 1]

Эта строка описывает направление цветового градиента. Начальная и конечная точки будут определяться пересечением этой линии с изо-линиями zmax и zmin.

Теперь для любых определенных значений zmax и zmin мы можем описать параллельные линии на плоскости, определенной нашим треугольником, таким образом:

A1(x) + A2(y) + A3(zmax) - A = 0                 [eqn 2]
and
A1(x) + A2(y) + A3(zmin) - A = 0                 [eqn 3]

Используя уравнения 1-3, приведенные выше, мы можем определить для G1 и G2 начальную и конечную точки цветового градиента соответственно.

G1 = (xmin,ymin)
G2 = (xmax,ymax)

, где

xmin = (A - A3*zmin) / (A1 + A2^2 / A1)
ymin = xmin * A2/A1

xmax = (A - A3*zmax) / (A1 + A2^2 / A1)
ymax = xmax * A2/A1

Обратите внимание на особый случай, когда A1 = 0 соответствует идеально вертикальному пути цветового градиента. В этом случае:

for A1 == 0:

G1 = (0,ymin)
G2 = (0,ymax),
where
ymin = (A - A3*zmin) / A2
ymax = (A - A3*zmax) / A2

Единственный другой особый случай - это когда p1z = p2z = p3z. Это попыталось бы растянуть градиентный путь до бесконечно длинной. В этом особом случае треугольник должен быть просто окрашен сплошным цветом, а не проходить всю математику.

Осталось только установить треугольник в качестве области отсечения и нарисовать градиент от G1 до G2. Я включил диаграмму предметной области с соответствующими линейными уравнениями. Также обратите внимание, что цветовой градиент изменяется линейно по краю каждого треугольника, поэтому вопрос ОП о триангуляции Делоне прямо на цели. Я разработал этот подход именно по этой причине - раскрасить грани триангулированной сетки. На изображении ниже показан случай, когда zmax == p3z > p1z > p2z > zmin.

three-point gradient vector solution

5 голосов
/ 06 июля 2010

Вам нужно более одного градиента, чтобы достичь того, что вы хотите в треугольнике, поскольку градиент - это интерполяция между двумя точками в цветовом пространстве, но у вас есть три различных неколлинеарных точки.Используя барицентрическую интерполяцию, вы должны применять один градиент для каждой вершины, чтобы направление градиента было направлено от вершины в направлении, перпендикулярном противоположному краю.Градиент проходит от полного насыщения в вершине до нулевого насыщения, когда он достигает края.

Существуют различные аналоги барицентрической интерполяции на выпуклых многоугольниках , но я не читал эту статью вподробно, чтобы узнать, может ли это быть достигнуто как суперпозиция линейных градиентов.

В конце ваша проблема сводится к интерполяции внутри многоугольника, и каждая схема интерполяции даст различную (возможно, уникальную) раскраску.

1 голос
/ 07 июля 2010

Если оттенки не появляются, это довольно просто, но решение не уникально.

Предположим, что три оттенка разные, скажем, H<sub>1</sub><H<sub>2</sub><H<sub>3</sub>.

Вы найдете точку x 4 в сегменте, соединяющем x 1 и x 3 (здесь у вас есть выбор), и пусть вся линия соединяется x 2 и x 4 одного цвета H 2 . Затем определите градиент перпендикулярно этой линии, имея необходимые расстояния, чтобы дать трем точкам правильный оттенок.

Один из возможных вариантов точки x 4 таков, что оттенок линейно изменяется между x 1 и x 3 . Другой будет подножие перпендикуляра. Любое фиксированное решение не объединится с другим треугольником с двумя общими вершинами, поэтому для общей раскраски это не поможет.

1 голос
/ 06 июля 2010

Можно использовать svg-градиенты в сочетании с svg-фильтрами для создания определенных эффектов, аналогичных тому, что, я думаю, вы запрашиваете.

Некоторые примеры можно увидеть здесь: http://www.chaos.org.uk/~eddy/when/2006/ColourCube.xhtml (я бы порекомендовал посмотреть результаты в Opera , другие браузеры, похоже, неправильно отображали слитые градиенты). См. здесь для примера трехстороннего градиента, примененного к треугольнику.

1 голос
/ 06 июля 2010

Может быть, вам стоит проверить Gouraud Shading , это кажется подходящим для того, что вы ищете. Он интерполирует заданные три цвета по вершинам треугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...