我使用wu技术编写了一个线条绘制算法。它有效,但有问题。见下文。
我想知道的是,是否有人解决了绘制抗锯齿线的问题?令人惊讶的是,谷歌搜索没有令人满意的算法。大量的讨论,但不是一个完整的,健壮的算法,独立于图形库的任何依赖。
如果有人想要以下功能的示例代码,请告诉我。我希望用更强大的功能取代它,但我还没有找到它。我确信我的算法可以改进,但它可以工作。
struct xya { int x; int y; uint8_t a; xya(int x=0, int y=0, uint8_t a=0) : x(x), y(y), a(a) {} }; inline void wuline(xya*& out, int x0, int y0, int x1, int y1) { short DeltaX, DeltaY, XDir; static const int intensity = 8; if (y0 > y1) { short Temp = y0; y0 = y1; y1 = Temp; Temp = x0; x0 = x1; x1 = Temp; } *out++ = xya(x0,y0,255); if ((DeltaX = x1 - x0) >= 0) { XDir = 1; } else { XDir = -1; DeltaX = -DeltaX; } if ((DeltaY = y1 - y0) == 0) { while (DeltaX-- != 0) { x0 += XDir; *out++ = xya(x0,y0,255); } return; } if (DeltaX == 0) { do { y0++; *out++ = xya(x0,y0,255); } while (--DeltaY != 0); return; } if (DeltaX == DeltaY) { do { x0 += XDir; y0++; *out++ = xya(x0,y0,255); } while (--DeltaY != 0); return; } if (DeltaY > DeltaX) { unsigned short ErrorAcc = 0; unsigned short ErrorAdj = ((unsigned long) DeltaX > intensity; *out++ = xya(x0,y0,Weighting ^ 255); *out++ = xya(x0+XDir,y0,Weighting); } *out++ = xya(x1,y1,255); } else { unsigned short ErrorAcc = 0; unsigned short ErrorAdj = ((unsigned long) DeltaY > intensity; *out++ = xya(x0,y0,Weighting ^ 255); *out++ = xya(x0,y0+1,Weighting); } *out++ = xya(x1,y1,255); } }
答案 0 :(得分:3)
快速有效地绘制抗锯齿线的典型示例是 Xiaolin Wu's algorithm 。您可能希望看一下这种方法。这里也是some sample code。应用Wu算法的结果在右边:
alt text http://www.suchit-tiwari.org/writings/antialias/antialias.png
答案 1 :(得分:1)
好奇为什么你不使用图书馆为你做这个?例如在Windows上,GDI +支持抗锯齿,我确信可能有一个QT&的实现。 WX。除了这些选项,OpenGL也可以做到这一点。
关于抗锯齿的GDI +文档 http://msdn.microsoft.com/en-us/library/ms535723%28VS.85%29.aspx
如果你是为了它或学术上的那样做,那就别理我了..
答案 2 :(得分:0)
我曾经被赋予绘制各种需要消除锯齿的复杂和重叠形状的任务。我的解决方案是以比需要显示的图像更高的分辨率(2x?3x?)将所有内容绘制到内存中。然后作为最后一步,通过对高分辨率版本中将被缩减为显示图像中的单个像素的多个像素中的每个像素分别平均R,G和B,将高分辨率图像转换为低分辨率。
它可能不是最有效的做事方式,但它很容易编码,视觉效果非常好。