Линейный цветовой градиент
От: Reunion  
Дата: 07.02.06 05:58
Оценка:
Всем привет!

Многие, наверное, знают, что такое линейный цветовой градиент. Линейный здесь — его форма, а не способ интерполяции цветов, это в данном вопросе не важно. Градиент, точнее прямая, вдоль которой он рисуется, может быть ориентирована под любым углом (как в photoshop). Вопрос: каким способом будет быстрее всего рассчитать цвет в данной точке. Первое, что приходит в голову — спроецировать точку на прямую и найти таким образом цвет. Нет ли способа побыстрее?

Заранее спасибо.
Re: Линейный цветовой градиент
От: alex_ez Россия alex.jife.ru
Дата: 07.02.06 06:02
Оценка:
Здравствуйте, Reunion, Вы писали:

R>Многие, наверное, знают, что такое линейный цветовой градиент. Линейный здесь — его форма, а не способ интерполяции цветов, это в данном вопросе не важно. Градиент, точнее прямая, вдоль которой он рисуется, может быть ориентирована под любым углом (как в photoshop). Вопрос: каким способом будет быстрее всего рассчитать цвет в данной точке. Первое, что приходит в голову — спроецировать точку на прямую и найти таким образом цвет. Нет ли способа побыстрее?


помоему это самый быстрый способ. всего одна операция для нахождения точки, и одна для цвета. разве нет?..
silence in quite
Re[2]: Линейный цветовой градиент
От: Reunion  
Дата: 07.02.06 06:21
Оценка:
Здравствуйте, alex_ez, Вы писали:

_>Здравствуйте, Reunion, Вы писали:


R>>Многие, наверное, знают, что такое линейный цветовой градиент. Линейный здесь — его форма, а не способ интерполяции цветов, это в данном вопросе не важно. Градиент, точнее прямая, вдоль которой он рисуется, может быть ориентирована под любым углом (как в photoshop). Вопрос: каким способом будет быстрее всего рассчитать цвет в данной точке. Первое, что приходит в голову — спроецировать точку на прямую и найти таким образом цвет. Нет ли способа побыстрее?


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


Ну цель моего вопроса и заключается в том, чтобы выяснить это
Re[3]: Линейный цветовой градиент
От: alex_ez Россия alex.jife.ru
Дата: 07.02.06 06:31
Оценка:
Здравствуйте, Reunion, Вы писали:

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


R>Ну цель моего вопроса и заключается в том, чтобы выяснить это


Если рассуждать логически, то:

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

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

пробуй оба варианта, если не знаешь как искать местоположение — скажи, разберемся. все сводится в итоге к аналитической геометрии на плоскости.
silence in quite
Re: Линейный цветовой градиент
От: McSeem2 США http://www.antigrain.com
Дата: 07.02.06 14:27
Оценка: 6 (1)
Здравствуйте, Reunion, Вы писали:

R>Многие, наверное, знают, что такое линейный цветовой градиент. Линейный здесь — его форма, а не способ интерполяции цветов, это в данном вопросе не важно. Градиент, точнее прямая, вдоль которой он рисуется, может быть ориентирована под любым углом (как в photoshop). Вопрос: каким способом будет быстрее всего рассчитать цвет в данной точке. Первое, что приходит в голову — спроецировать точку на прямую и найти таким образом цвет. Нет ли способа побыстрее?


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

Мы как бы считаем, что градиент у нас всегда вдоль оси X, начинается в точке 0, заканчивается, скажем, в 100. Это система координат градиента. Эти 0...100 можно развернуть, смасштабировать и подвинуть произвольным образом при помощи аффинных преобразований на плоскости. Составляем для этого матрицу. Эта матрица берет точку из 0...100 по X и помещает ее вдоль требуемой прямой. Нам же надо наоборот — взять точку и определить ее X в системе координат градиента. Для этого мы инвертируем матрицу и получаем обратные преобразования. Вот, собственно и все. В непосредственном виде это требует 4 умножений и 4 сложений на точку (FP). Но есть трюк — если мы красим построчно, то можем посчитать только две точки градиента на каждую строку — левую и правую. А между ними — линейно интерполировать, хоть тем же Брезенхемом. Интерполятор должен быть целочисленным и обеспечивать субпиксельную точность по Y (1/16 пирсела вполне достаточно).
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.