1 回答
TA贡献1785条经验 获得超4个赞
问题是您在每个针迹之间绘制斜线。
让事情变得更加戏剧化,这就是你正在做的事情。
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
ctx.imageSmoothingEnabled = false;
ctx.beginPath();
ctx.strokeStyle = "#00000000";
ctx.moveTo(50, 0);
for (let i = 1; i < 200; i+= 10) {
ctx.lineTo(50 + getRandomInt(-5, 10), i);
}
ctx.lineTo(500, 200);
ctx.lineTo(500, 0);
ctx.lineTo(50, 0);
ctx.stroke();
ctx.clip();
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'orange';
ctx.fillRect(0, 0, 100, 100);
<canvas id="canvas" width="300" height="300">
当渲染这些斜线时,浏览器将使用抗锯齿来平滑线条,因为这通常是人们想要的。
但在您的情况下,您想要像素完美,因此解决方案是以阶梯形状围绕像素边界行走。这可以通过从最后一个 y 坐标到下一个 y 坐标绘制一条垂直线,然后绘制水平线来实现。
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// for high-res monitors
{
const dPR = window.devicePixelRatio;
canvas.width = canvas.height *= dPR
ctx.scale( dPR, dPR );
}
ctx.beginPath();
ctx.strokeStyle = "#00000000";
ctx.moveTo(50, 0);
for (let i = 1; i < 200; i++) {
let rand = getRandomInt( -1, 2 );
ctx.lineTo( 50 + rand, i - 1 ); // from last y move horizontally
ctx.lineTo( 50 + rand, i ); // move vertically
}
ctx.lineTo(500, 200);
ctx.lineTo(500, 0);
ctx.lineTo(50, 0);
ctx.clip();
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'orange';
ctx.fillRect(0, 0, 100, 100);
canvas { width: 300px; height: 300px }
<canvas id="canvas" width="300" height="300">
再次以更戏剧化的方式:
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min);
}
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
ctx.imageSmoothingEnabled = false;
ctx.beginPath();
ctx.strokeStyle = "#00000000";
ctx.moveTo(50, 0);
for (let i = 1; i < 200; i+= 10) {
const rand = getRandomInt(-5, 10);
ctx.lineTo(50 + rand, i-10);
ctx.lineTo(50 + rand, i);
}
ctx.lineTo(500, 200);
ctx.lineTo(500, 0);
ctx.lineTo(50, 0);
ctx.stroke();
ctx.clip();
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'orange';
ctx.fillRect(0, 0, 100, 100);
<canvas id="canvas" width="300" height="300">
添加回答
举报