繁体   English   中英

使用画布平滑随机线

[英]Smooth random line using Canvas

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.canvas.width  = window.innerWidth;
context.canvas.height  = window.innerHeight;
var x1 = Math.random()*context.canvas.width;
var y1 = Math.random()*context.canvas.height;
var xdir = 0; var ydir = 0;
context.beginPath();

setInterval(function(){
    for (var i = 0; i < 10; i++) {
        randx = Math.random(); randy = Math.random();

        if (randx > 0.95) {
            if (xdir < 0) xdir = (xdir+((Math.random()*1.5) - 1))/2;
            else if (xdir > 0) xdir = (xdir+((Math.random()*1.5) - 0.5))/2;
            else xdir = (Math.random()*1.5) - 0.75;
        }

        if (randy > 0.95) {
            if (ydir < 0) ydir = (ydir+((Math.random()*1.5) - 1))/2;
            else if (ydir > 0) ydir = (ydir+((Math.random()*1.5) - 0.5))/2;
            else ydir = (Math.random()*1.5) - 0.75;
        }

        context.lineTo(x1+xdir, y1+ydir);
        context.stroke();

        x1 = x1+xdir;
        y1 = y1+ydir;
    }
},50);

这是我的随机行脚本,但是我的行确实很丑陋: http : //i.stack.imgur.com/YZT2o.png

有什么更好的方法可以使用画布实现线条流畅吗?

HTML5 Canvas 上的行在所有浏览器/ OS(AFAIK)上很好地抗锯齿。 但是,在具有每个循环10冲程的更新回调中,您既没有清除画布也没有清除路径 ,因此您每秒在其自身上绘制同一路径200次 这导致所有抗锯齿被破坏,因为即使最微弱的不透明像素也会堆积起来,直到它们成为实线。

使代码看起来更漂亮的最简单解决方法是添加以下行:

context.clearRect(0,0,context.canvas.width,context.canvas.height);

您的for循环中,例如,在context.stroke();之前context.stroke();

此单行更改使它看起来不错,但对性能不利,对于每次视觉更新,清理和重绘画布十次。

这是一个更好的选择:

context.beginPath();
context.moveTo(x1,y1);
context.lineTo(x1+xdir, y1+ydir);
context.stroke();

x1 += xdir; y1 += ydir;

这样,您将永远不会清除画布,而只会在每帧中绘制更改的线条。

另一种替代方法(如果需要始终提供完整路径)是在一个高速setInterval循环中累积对上下文路径的更改,而在另一种较慢的循环中,偶尔清除画布并重新绘制整个路径。 这类似于我为Langton(非常快)的Ant仿真所做的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM