我只是尝试 HTML5画布而我正在尝试正确绘制等距多维数据集
这是我当前绘制等距立方体的代码:
function drawCube(x, y, wx, wy, h, color) {
// left face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x - wx, y - wx * 0.5);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#838357"
ctx.strokeStyle = "#7a7a51";
ctx.stroke();
ctx.fill();
// right face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + wy, y - wy * 0.5);
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#6f6f49";
ctx.strokeStyle = "#676744";
ctx.stroke();
ctx.fill();
// center face
ctx.beginPath();
ctx.moveTo(x, y - h);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x - wx + wy, y - h - (wx * 0.5 + wy * 0.5));
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.closePath();
ctx.fillStyle = "#989865";
ctx.strokeStyle = "#8e8e5e";
ctx.stroke();
ctx.fill();
}
我有两个问题:
在缩放画布时,您可以看到一些像素问题/面重叠:
var canvas = document.createElement("canvas");
var ctx = canvas.getContext('2d');
canvas.width = 800;
canvas.height = 800;
document.body.appendChild(canvas);
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
var sizeX = 32;
var sizeY = 32;
var sizeZ = 8;
ctx.scale(5, 5);
drawCube(50, 50, sizeX, sizeY, sizeZ);
}
requestAnimationFrame(draw);
function drawCube(x, y, wx, wy, h, color) {
// left face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x - wx, y - wx * 0.5);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#838357"
ctx.strokeStyle = "#7a7a51";
ctx.stroke();
ctx.fill();
// right face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + wy, y - wy * 0.5);
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#6f6f49";
ctx.strokeStyle = "#676744";
ctx.stroke();
ctx.fill();
// center face
ctx.beginPath();
ctx.moveTo(x, y - h);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x - wx + wy, y - h - (wx * 0.5 + wy * 0.5));
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.closePath();
ctx.fillStyle = "#989865";
ctx.strokeStyle = "#8e8e5e";
ctx.stroke();
ctx.fill();
}
如何确定绘制整个多维数据集所需的画布宽度/高度,然后将多维数据集设置为画布的开头? (x& y = 0)
第一期我做错了什么?那第二个怎么样?我可以获得修复这些问题的示例/代码段吗?
答案 0 :(得分:1)
它与线连接的斜接模式和斜接限制有关。
您可以在调用fill()
/ stroke()
之前解决这两种方式:
减少斜接限制(注意斜接限制不能为0):
ctx.miterLimit = 1;
或使用不同的换行模式:
ctx.lineJoin = "round";
var canvas = document.createElement("canvas");
var ctx = canvas.getContext('2d');
canvas.width = 800;
canvas.height = 800;
document.body.appendChild(canvas);
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
var sizeX = 32;
var sizeY = 32;
var sizeZ = 8;
ctx.scale(5, 5);
drawCube(50, 50, sizeX, sizeY, sizeZ);
}
requestAnimationFrame(draw);
function drawCube(x, y, wx, wy, h, color) {
// LINE MODE
ctx.lineJoin = "round";
// left face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x - wx, y - wx * 0.5);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#838357"
ctx.strokeStyle = "#7a7a51";
ctx.stroke();
ctx.fill();
// right face
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + wy, y - wy * 0.5);
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.lineTo(x, y - h * 1);
ctx.closePath();
ctx.fillStyle = "#6f6f49";
ctx.strokeStyle = "#676744";
ctx.stroke();
ctx.fill();
// center face
ctx.beginPath();
ctx.moveTo(x, y - h);
ctx.lineTo(x - wx, y - h - wx * 0.5);
ctx.lineTo(x - wx + wy, y - h - (wx * 0.5 + wy * 0.5));
ctx.lineTo(x + wy, y - h - wy * 0.5);
ctx.closePath();
ctx.fillStyle = "#989865";
ctx.strokeStyle = "#8e8e5e";
ctx.stroke();
ctx.fill();
}
对于第二个问题,您可以预先计算多维数据集的所有值,并将它们存储在数组或对象等中。
然后对每个轴的所有值运行min-max。最大值(减去最小值)将是画布的宽度/高度。将画布放在-minX,-minY(或使用相同的翻译)。