4

我正在尝试在黑色背景上绘制白线网格。

在我重新绘制它们之前,底部的 3 条水平线似乎已经褪色,我无法弄清楚为什么会发生这种情况。有没有人见过这个和/或知道我做错了什么?

4

3 回答 3

11

这是因为线是在它们所覆盖的所有像素上绘制的(在画布上定位是浮动的)。当你想在画布上用 JavaScript 绘制精确的垂直或水平线时,你最好将它们放在半个整数中。

见插图:第一条水平线是用y位置1绘制的。这条线模糊而宽。第二条水平线以 4.5 的 y 位置绘制。它薄而精确。

在此处输入图像描述

例如,在您的代码中,通过将您的水平线循环更改为:

                // Horizontal lines
                for (var i = 1; i < objCanvas.height / intGridWidth; i++)
                {
                    objContext.strokeStyle = "white";
                    var y = Math.floor(i*intGridWidth)+0.5
                    objContext.moveTo(0, y);
                    objContext.lineTo(objCanvas.width, y);
                    objContext.stroke();
                }

这是一个用非常细而干净的线条展示它的小提琴:

http://jsfiddle.net/dystroy/7NJ6w/

一条线在所有像素上绘制的事实意味着绘制一条宽度正好为一个像素的水平线的唯一方法是瞄准中间。我通常在基于画布的应用程序中使用这种实用程序功能:

function drawThinHorizontalLine(c, x1, x2, y) {
    c.lineWidth = 1;
    var adaptedY = Math.floor(y)+0.5;
    c.beginPath();
    c.moveTo(x1, adaptedY);
    c.lineTo(x2, adaptedY);
    c.stroke();
}

当然你最好也为垂直线做一个好看的页面。

于 2012-04-30T07:29:00.623 回答
0

对我来说它看起来并没有褪色。也许这与您的操作系统或 PC 有关,无法正确渲染绘图。我在 Win 7 上使用 Chrome 20。测试一下。

于 2012-04-29T16:23:15.167 回答
0

你必须这样定义objContext.lineWidth

objContext.lineWidth = 2;

我不确定为什么最后一行会褪色。见http://jsfiddle.net/jSCCY/

于 2012-04-29T16:37:34.180 回答