Исходный код для линейного алгоритма Сяолин Ву в C? - PullRequest
11 голосов
/ 14 декабря 2009

Я ищу хорошую и эффективную реализацию сглаженного алгоритма рисования линий Сяолиня В в C, есть ли у кого-нибудь этот код, которым он мог бы поделиться со мной?

Спасибо

Ответы [ 2 ]

13 голосов
/ 14 декабря 2009

В Википедии есть псевдокод .

У Google есть много примеров, таких как этот или этот . И ваш вопрос напомнил мне эту прекрасную статью о сглаживании .

РЕДАКТИРОВАТЬ: Пришло время открыть веб-сайт Хьюго Хелиаса , если вы еще этого не знаете.

0 голосов
/ 27 февраля 2019

Интересно, если реализация здесь верна, потому что в

ErrorAdj = ((unsigned long) DeltaX << 16) / (unsigned long) DeltaY;
      /* Draw all pixels other than the first and last */
while (--DeltaY) {
         ErrorAccTemp = ErrorAcc;   /* remember current accumulated error */
         ErrorAcc += ErrorAdj;      /* calculate error for next pixel */
         if (ErrorAcc <= ErrorAccTemp) {
            /* The error accumulator turned over, so advance the X coord */
            X0 += XDir;
         }
         Y0++; /* Y-major, so always advance Y */
         /* The IntensityBits most significant bits of ErrorAcc give us the
            intensity weighting for this pixel, and the complement of the
            weighting for the paired pixel */
         Weighting = ErrorAcc >> IntensityShift;
         DrawPixel(pDC,X0, Y0, BaseColor + Weighting);
         DrawPixel(pDC,X0 + XDir, Y0,
               BaseColor + (Weighting ^ WeightingComplementMask));
      }

условие if (ErrorAcc <= ErrorAccTemp) всегда ложно.

...