На самом деле вы должны продолжать расщепление до тех пор, пока две линии, соединяющие точки на кривой (конечные узлы) и их самые дальние контрольные точки, не станут «достаточно плоскими»: - либо полностью выровнены, либо - их пересечение находится в положении, «квадратное расстояние» которого от обоихконечные узлы меньше половины "квадратного пикселя") - обратите внимание, что вам не нужно вычислять фактическое расстояние, так как это потребует вычисления квадратного корня, что очень медленно)
Когда вы достигнете этой ситуации,игнорируйте контрольные точки и соедините две конечные точки с прямым отрезком.
Это быстрее, потому что быстро вы получите прямые отрезки, которые можно нарисовать напрямую, как если бы они были прямыми, используя классический БрезенхемАлгоритм.
Примечание: вы должны учитывать дробные биты конечных точек, чтобы правильно установить начальное значение переменной ошибки, накапливающей различия и используемой инкрементным алгоритмом Брезенхэма, чтобы получить лучшие результаты (особенно когдапоследний сегмент для рисования оченьблизко от горизонтали или вертикали или от двух диагоналей);в противном случае вы получите видимые артефакты.
Классический алгоритм Брезенхема для рисования линий между точками, которые выровнены на целочисленной сетке, инициализирует эту переменную ошибки в ноль для позиции первого конечного узла.Но незначительная модификация алгоритма Брезенхема масштабирует две переменные расстояния и значение ошибки просто на постоянную степень два, прежде чем использовать приращения 0 / + 1 для переменной x или y, которые остаются немасштабированными.
Старшие биты переменной error также позволяют вычислять альфа-значение, которое можно использовать для рисования двух сложенных пикселей с правильной альфа-заливкой.В большинстве случаев ваши изображения будут использовать не более 8-битных цветовых плоскостей, поэтому вам не потребуется более 8 бит дополнительной точности для значения ошибки, а масштабирование может быть ограничено коэффициентом 256: вы можете использовать егорисовать «плавные» линии.
Но вы можете ограничиться коэффициентом масштабирования 16 (четыре бита): типичные растровые изображения, которые вы должны рисовать, не очень широки, а их разрешение намного ниже +/- 2миллиарды (предел 32-разрядного целого числа со знаком): когда вы увеличите координаты в 16 раз, для работы останется 28 битов, но вы уже должны были «обрезать» геометрию до области просмотра вашегорастровое изображение для рендеринга, и переменная ошибки алгоритма Брезенхэма во всех случаях останется ниже 56 битов и все равно поместится в 64-битное целое число.
Если ваша переменная ошибки 32-битная, вы должны ограничитьмасштабированные координаты ниже 2 ^ 15 (не более 15 бит) для наихудшего случая (в противном случае проверка знака допустимой ошибки, используемая Брезенхэмом, будетЯ не работаю из-за целочисленного переполнения в худшем случае), и с коэффициентом масштабирования 16 (4 бита) вы будете ограничены в рисовании изображений размером не более 11 бит в ширину или высоту, то есть 2048x2048 изображений.
Но если ваша область рисования эффективно меньше 2048x2048 пикселей, нет проблем с рисованием линий, сглаженных по 16 альфа-закрашенным значениям цвета рисования (чтобы нарисовать альфа-заштрихованные пиксели, вам нужно прочитать значение пиксела оригинала в изображении досмешивание альфа-затененного цвета, если только вычисленный оттенок не равен 0% для первого пикселя с разбивкой, который вам не нужно рисовать, и 100% для второго скомпонованного пикселя, который можно перезаписать непосредственно с помощью обычного цвета рисования)
Если ваше вычисленное изображение также включает в себя альфа-канал, у вашего цвета рисования также может быть свое собственное альфа-значение, которое вам нужно будет затенять и комбинировать с альфа-значением пикселей для рисования.Но вам не нужен промежуточный буфер только для рисования линии, потому что вы можете рисовать непосредственно в целевом буфере.
С переменной ошибки, используемой алгоритмом Брезенхэма, вообще нет проблем, вызванных ошибками округления, поскольку они учитываются этой переменной. Поэтому установите его начальное значение правильно (альтернатива, просто увеличив масштаб всех координат в 16 раз, прежде чем начать рекурсивное деление, сплайн в 16 раз медленнее в самом алгоритме Брезенхэма).