取两个点(i和i+1)(http://i.imgur.com/PToj9ws.jpg)
找到垂直于(points [i + 1] .position-points [i] .position)的线(http://i.imgur.com/9imeDNU.jpg)
使用羽化填充由垂直线的起始点和结束点定义的矩形(http://i.imgur.com/QFfcR89.jpg)。
为了填充这些矩形,我使用变种的Bresenham线算法绘制多条线:
public void drawLine(Point fromPoint, Point toPoint, float fromValue, float toValue, ref float[,] grid)
{
int x0 = fromPoint.x, y0 = fromPoint.y, x1 = toPoint.x, y1 = toPoint.y;
int dx = Mathf.Abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = -Mathf.Abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = dx + dy, e2;
int x = x0, y = y0;
Vector2 target = new Vector2(x1 - x0, y1 - y0);
while(true)
{
Vector2 current = new Vector2(x - x0, y - y0);
float addValue = Mathf.Lerp(fromValue, toValue, current.magnitude / target.magnitude);
plot(x, y, addValue, 1f, ref grid);
if (sample) grid[x, y] = supersample(x, y, ref grid);
if (x == x1 && y == y1) break;
e2 = 2 * err;
if (e2 > dy)
{
err += dy;
x += sx;
} else if (e2 < dx)
{
err += dx;
y += sy;
}
}
}
到目前为止一切都很好!然而,问题出现在样条线上的某个点具有与其他点不同的大小时。由于该算法不绘制抗锯齿线条,所以绘制的形状开始显得锯齿状。这是因为我为较大点的垂直线的每个像素绘制一条线,并将它们的端点映射到较小点的垂直线上。因此,基本上是在线条周围开始重叠,围绕更窄的点。 我试图画一张图来可视化这个问题:
![http://i.imgur.com/Us5flFf.jpg](https://istack.dev59.com/vrQ4p.webp)
![2](https://i.imgur.com/EmC7Lx1.jpg)
我试图使用Xiaolin Wu的线算法来绘制线条,但这会导致像素之间出现间隙,填充变得不一致。 到目前为止,只有应用高斯模糊使事情看起来更好,但它不能完全解决问题,而且很重,所以我也放弃了这个选项。
我真的需要在不使用任何库的情况下实现这个,所以对于如何解决这些问题的任何建议都非常欢迎。谢谢!