【问题标题】:Line Drawing Algorithm画线算法
【发布时间】:2011-01-02 18:50:08
【问题描述】:

我使用 wu 技术编写了一个画线算法。它有效,但有问题。见下文。

我想知道是否有人解决了绘制抗锯齿线的问题?令人惊讶的是,谷歌搜索结果没有令人满意的算法。许多讨论,但没有一个完整、强大的算法,独立于对图形库的任何依赖。

如果有人想要以下函数的示例代码,请告诉我。我希望用更强大的功能替换它,但我还没有找到。我确信我的算法可以改进,但它确实有效。

结构 xya { 诠释 x; 整数y; uint8_t一个; xya(int x=0, int y=0, uint8_t a=0) : x(x), y(y), a(a) {} }; 内联 void wuline(xya*& out, int x0, int y0, int x1, int y1) { 短 DeltaX、DeltaY、XDir; 静态常量 int 强度 = 8; 如果 (y0 > y1) { 短温度 = y0; y0 = y1; y1 = 温度; 温度 = x0; x0 = x1; x1 = 温度; } *out++ = xya(x0,y0,255); 如果 ((DeltaX = x1 - x0) >= 0) { XDir = 1; } 别的 { XDir = -1; DeltaX = -DeltaX; } 如果 ((DeltaY = y1 - y0) == 0) { 而(DeltaX--!= 0) { x0 += XDir; *out++ = xya(x0,y0,255); } 返回; } 如果(DeltaX == 0) { 做 { y0++; *out++ = xya(x0,y0,255); } 而(--DeltaY!= 0); 返回; } 如果(DeltaX == DeltaY) { 做 { x0 += XDir; y0++; *out++ = xya(x0,y0,255); } 而(--DeltaY!= 0); 返回; } 如果(DeltaY > DeltaX) { 无符号短 ErrorAcc = 0; unsigned short ErrorAdj = ((unsigned long) DeltaX > 强度; *out++ = xya(x0,y0,加权 ^ 255); *out++ = xya(x0+XDir,y0,加权); } *out++ = xya(x1,y1,255); } 别的 { 无符号短 ErrorAcc = 0; unsigned short ErrorAdj = ((unsigned long) DeltaY > 强度; *out++ = xya(x0,y0,加权 ^ 255); *out++ = xya(x0,y0+1,加权); } *out++ = xya(x1,y1,255); } }

【问题讨论】:

  • 您的满意标准是什么?

标签: c++ c graphics


【解决方案1】:

快速有效地绘制抗锯齿线的典型示例是 Xiaolin Wu's algorithm。你可能想看看一个可靠的方法。这里也是some sample code。右图是应用吴算法的结果:

alt text http://www.suchit-tiwari.org/writings/antialias/antialias.png

【讨论】:

  • 链接已失效,链接万岁。
【解决方案2】:

只是好奇你为什么不使用库来为你做这件事?例如,在 Windows GDI+ 上支持抗锯齿,我确信可能有 QT 和 WX 的实现。除了这些选项之外,OpenGL 也可以解决问题。

关于抗锯齿的 GDI+ 文档 http://msdn.microsoft.com/en-us/library/ms535723%28VS.85%29.aspx

如果你是为了学术或学术,那就无视我吧..

【讨论】:

    【解决方案3】:

    我曾经被赋予绘制各种需要抗锯齿的复杂和重叠形状的任务。我的解决方案是以比需要显示的图像更高的分辨率(2x?3x?)将所有内容绘制到内存中。然后作为最后一步,通过分别为高分辨率版本中的多个像素中的每一个平均 R、G 和 B 来将高分辨率图像转换为低分辨率图像,这将在显示图像中缩小为单个像素。

    这可能不是最有效的做事方式,但它非常容易编码并且视觉效果非常好。

    【讨论】:

    • 这基本上是 2xFSAA 的幼稚实现,尽管有更好的选择,但它是有效的。请注意,Wu 的算法比这具有更好的精度。
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2014-09-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多