我使用 wu 技术编写了一个画线算法。它有效,但有问题。见下文。
我想知道是否有人解决了绘制抗锯齿线的问题?令人惊讶的是,谷歌搜索结果没有令人满意的算法。很多讨论,但没有一个完整的、健壮的算法,独立于图形库的任何依赖关系。
如果有人想要以下函数的示例代码,请告诉我。我希望用更强大的功能来代替它,但我还没有找到。我确信我的算法可以改进,但它有效。
结构体
{
整数 x;
输入 y;
uint8_t a;
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,Weighting ^ 255);
*out++ = xya(x0+XDir,y0,Weighting);
}
*out++ = xya(x1,y1,255);
}
别的
{
无符号短ErrorAcc = 0;
unsigned short ErrorAdj = ((unsigned long) DeltaY > 强度;
*out++ = xya(x0,y0,Weighting ^ 255);
*out++ = xya(x0,y0+1,Weighting);
}
*out++ = xya(x1,y1,255);
}
}
最佳答案
快速有效地绘制抗锯齿线的典型示例是 Xiaolin Wu's algorithm 。你可能想看看它的可靠方法。这里也是 some sample code 。应用吴氏算法的结果如右图:
alt text http://www.suchit-tiwari.org/writings/antialias/antialias.png
关于c++ - 画线算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2025451/