Ручное смешивание цветов - PullRequest
0 голосов
/ 05 февраля 2011

У меня проблема, которую я пытаюсь оптимизировать. Я воспроизводю функции OpenGL, и моя текущая проблема - растеризация n-точечных фигур и смешивание цветов на основе точек.

Растр хранится в массиве байтов длиной 1 дм. Screen.Width * Screen.Height * 3

Моя реализация довольно медленная, и я хочу немного ее оптимизировать (ну, очень). Я посещаю каждый пиксель в форме и беру расстояние от каждой точки (используя Sqrt (x ^ 2 + y ^ 2), где вещи кажутся медленными) и использую расстояние и цвет вертика, чтобы определить цвет для этого конкретный пиксель.

Я знаю, что есть более быстрый способ сделать это. Любая помощь будет отличной! О, я работаю в C # кстати.

1 Ответ

3 голосов
/ 05 февраля 2011

давайте предположим, что у вас есть (веская) причина не использовать OpenGL, Directx или даже GDI +.

Я не уверен, правильно ли я понимаю графический примитив, который вы пытаетесь растеризовать.Я предполагаю, что это многоугольник с n точек.Интерполяция цвета внутри такой формы не совсем тривиальна, поскольку у вас есть разные подходы для этого.Итак, вопрос в том, что вы хотите?

Подумайте о различиях в выпуклых и вогнутых (или даже самопересекающихся) полигонах.Не совсем понятно, как должен выглядеть результат.Вот почему графическое оборудование перестает беспокоиться ни о чем, кроме треугольников.Я предлагаю вам сделать (почти) то же самое.

Интерполяция цветов внутри треугольника довольно проста и однозначна.Модное слово для Google: барицентрические координаты .

Итак, остающийся вопрос - как триангулировать ваш многоугольник.просто один раз интерполируйте цвет для средней точки, используя интерполяцию, аналогичную той, которую я предполагаю, что вы в настоящее время используете для всех точек.Затем проложите треугольники от этой средней точки до точек вашей фигуры и интерполируйте их внутри.Вам нужна середина для получения правильных цветов.Подумайте о четырехугольнике: верхний правый и нижний левый угол окрашены в красный цвет, а два других угла - в синий.Теперь у вас есть две возможности для разделения четырехугольника на два треугольника, и в зависимости от того, какой из них вы используете, будет диагональная линия постоянного цвета (красного или синего).Но если вы вставите среднюю точку с интерполированным цветом (что-то вроде темно-пурпурного цвета), все будет хорошо (как вы использовали билинейную интерполяцию).хуже, чем кто-либо хотел бы это.Сначала вручную определите пересечения, разбейте многоугольник на несамопересекающиеся многоугольники, а затем обработайте каждый многоугольник для себя (вычислите смешанный цвет для новых точек, введенных самопересечениями, как вы делаете сейчас).*

Для вогнутых многоугольников необходимо разбить многоугольник на выпуклые части, а затем обработать их, как описано выше. Но это изменит результат интерполяции цвета!Поэтому вам нужно убедиться, что цвет внутри многоугольника (по краям вырезанных кусков) правильный.Поэтому необходимо ввести новые точки внутри многоугольника, в котором содержатся интерполированные цвета, аналогично идее средней точки для выпуклых многоугольников.Лучший способ сделать это - вычислить клеток вороной точек, образующих многоугольники.Угловые точки этих ячеек должны быть хорошими точками интерполяции.

Надеюсь, я смог прояснить, как бы я справился с вашей проблемой.Можно делать все эти вещи, но стоит ли оно того?Как сказал «Коди Грей»: зачем изобретать что-то такое сложное?

...