Javascript 使用画布平滑随机线 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(函数(){ 对于(变量i=0;i0.95){ 如果(xdir0)xdir=(xdir+((Math.random()*1.5)-0.5))/2; else-xdir=(Math.random()*1.5)-0.75; } 如果(兰迪>0.95){ 如果(ydir0)ydir=(ydir+((Math.random()*1.5)-0.5))/2; else ydir=(Math.random()*1.5)-0.75; } lineTo(x1+xdir,y1+ydir); stroke(); x1=x1+xdir; y1=y1+ydir; } },50);
这是我的随机行脚本,但我的行非常难看:Javascript 使用画布平滑随机线 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(函数(){ 对于(变量i=0;i0.95){ 如果(xdir0)xdir=(xdir+((Math.random()*1.5)-0.5))/2; else-xdir=(Math.random()*1.5)-0.75; } 如果(兰迪>0.95){ 如果(ydir0)ydir=(ydir+((Math.random()*1.5)-0.5))/2; else ydir=(Math.random()*1.5)-0.75; } lineTo(x1+xdir,y1+ydir); stroke(); x1=x1+xdir; y1=y1+ydir; } },50);,javascript,html,canvas,Javascript,Html,Canvas,这是我的随机行脚本,但我的行非常难看: 有没有更好的方法来使用画布实现平滑线条?看看这个问题: 看看这个问题: HTML5画布上的行在所有浏览器/操作系统(AFAIK)上都能很好地消除锯齿。但是,在更新回调中,每个循环有10个笔划,您既不是也不是,因此每秒在其上绘制200次相同的路径。这会导致所有抗锯齿都被破坏,因为即使是最微弱的不透明度像素也会累积到实线 要使代码看起来漂亮,最简单的修复方法是添加以下行: var canvas = document.getElementById("canvas
有没有更好的方法来使用画布实现平滑线条?看看这个问题:
看看这个问题: HTML5画布上的行在所有浏览器/操作系统(AFAIK)上都能很好地消除锯齿。但是,在更新回调中,每个循环有10个笔划,您既不是也不是,因此每秒在其上绘制200次相同的路径。这会导致所有抗锯齿都被破坏,因为即使是最微弱的不透明度像素也会累积到实线 要使代码看起来漂亮,最简单的修复方法是添加以下行:
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);
在for
循环中,例如就在context.stroke()之前代码>
这一行的更改使它看起来不错,但对性能不好,每次视觉更新都会清除和重画画布10次
这里有一个更好的选择:
context.clearRect(0,0,context.canvas.width,context.canvas.height);
这样,您永远不会清除画布,而是在每一帧中只绘制更改的线
另一种选择(如果您需要始终可用的完整路径)是在一个高速setInterval
循环中累积对上下文路径的更改,在另一个较慢的循环中,偶尔清除画布并重新绘制整个路径。这与我在模拟中所做的类似。HTML5画布上的行在所有浏览器/操作系统(AFAIK)上都进行了很好的抗锯齿处理。但是,在更新回调中,每个循环有10个笔划,您既不是也不是,因此每秒在其上绘制200次相同的路径。这会导致所有抗锯齿都被破坏,因为即使是最微弱的不透明度像素也会累积到实线
要使代码看起来漂亮,最简单的修复方法是添加以下行:
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);
在for
循环中,例如就在context.stroke()之前代码>
这一行的更改使它看起来不错,但对性能不好,每次视觉更新都会清除和重画画布10次
这里有一个更好的选择:
context.clearRect(0,0,context.canvas.width,context.canvas.height);
这样,您永远不会清除画布,而是在每一帧中只绘制更改的线
另一种选择(如果您需要始终可用的完整路径)是在一个高速setInterval
循环中累积对上下文路径的更改,在另一个较慢的循环中,偶尔清除画布并重新绘制整个路径。这与我在模拟中所做的类似