давайте предположим, что у вас есть (веская) причина не использовать OpenGL, Directx или даже GDI +.
Я не уверен, правильно ли я понимаю графический примитив, который вы пытаетесь растеризовать.Я предполагаю, что это многоугольник с n точек.Интерполяция цвета внутри такой формы не совсем тривиальна, поскольку у вас есть разные подходы для этого.Итак, вопрос в том, что вы хотите?
Подумайте о различиях в выпуклых и вогнутых (или даже самопересекающихся) полигонах.Не совсем понятно, как должен выглядеть результат.Вот почему графическое оборудование перестает беспокоиться ни о чем, кроме треугольников.Я предлагаю вам сделать (почти) то же самое.
Интерполяция цветов внутри треугольника довольно проста и однозначна.Модное слово для Google: барицентрические координаты .
Итак, остающийся вопрос - как триангулировать ваш многоугольник.просто один раз интерполируйте цвет для средней точки, используя интерполяцию, аналогичную той, которую я предполагаю, что вы в настоящее время используете для всех точек.Затем проложите треугольники от этой средней точки до точек вашей фигуры и интерполируйте их внутри.Вам нужна середина для получения правильных цветов.Подумайте о четырехугольнике: верхний правый и нижний левый угол окрашены в красный цвет, а два других угла - в синий.Теперь у вас есть две возможности для разделения четырехугольника на два треугольника, и в зависимости от того, какой из них вы используете, будет диагональная линия постоянного цвета (красного или синего).Но если вы вставите среднюю точку с интерполированным цветом (что-то вроде темно-пурпурного цвета), все будет хорошо (как вы использовали билинейную интерполяцию).хуже, чем кто-либо хотел бы это.Сначала вручную определите пересечения, разбейте многоугольник на несамопересекающиеся многоугольники, а затем обработайте каждый многоугольник для себя (вычислите смешанный цвет для новых точек, введенных самопересечениями, как вы делаете сейчас).*
Для вогнутых многоугольников необходимо разбить многоугольник на выпуклые части, а затем обработать их, как описано выше. Но это изменит результат интерполяции цвета!Поэтому вам нужно убедиться, что цвет внутри многоугольника (по краям вырезанных кусков) правильный.Поэтому необходимо ввести новые точки внутри многоугольника, в котором содержатся интерполированные цвета, аналогично идее средней точки для выпуклых многоугольников.Лучший способ сделать это - вычислить клеток вороной точек, образующих многоугольники.Угловые точки этих ячеек должны быть хорошими точками интерполяции.
Надеюсь, я смог прояснить, как бы я справился с вашей проблемой.Можно делать все эти вещи, но стоит ли оно того?Как сказал «Коди Грей»: зачем изобретать что-то такое сложное?