【发布时间】:2020-08-13 23:41:28
【问题描述】:
我在画布上用六边形制作了一个六边形,当我在脚本中更改它的大小并刷新页面时,它可以完美运行。当然它需要随时更改大小,所以我输入了一个数字字段,但是当我尝试将 html 的大小提供给脚本时,接下来会发生:
代码如下:
function size()
{
return document.getElementById('myNumber').value;
}
function drawHex(ctx, x, y)
{
var side = 0;
var size = 10;
ctx.beginPath();
ctx.moveTo(x + size * Math.cos(0), y + size * Math.sin(0));
ctx.fillStyle = "#D1CBCA";
ctx.strokeStyle = "#CCCCCC";
ctx.lineWidth = 1;
for (side; side < 7; side++)
{
ctx.lineTo(x + size * Math.cos(side * 2 * Math.PI / 6), y + size * Math.sin(side * 2 * Math.PI / 6));
}
ctx.fill();
}
function drawSixHex(ctx, x, y)
{
drawHex(ctx, x, y);
drawHex(ctx, x-16, y+10);
drawHex(ctx, x-16, y-10);
drawHex(ctx, x+16, y+10);
drawHex(ctx, x+16, y-10);
drawHex(ctx, x, y+2*10);
drawHex(ctx, x, y-2*10);
}
function drawBoard(x, y, ctx, m)
{
ctx.clearRect(0,0,980,520);
var oldX = x;
var oldY = y;
var diffX = 16;
var diffY = 10;
for (var i = 1; i<=(2*m+1); i++)
{
for (var j = 0; j<m+1; j++)
{
if(i%2!=0)
{
drawHex(ctx, oldX+i*diffX, oldY-diffY+2*j*diffY);
}
else
{
drawHex(ctx, oldX+i*diffX, oldY+2*j*diffY);
}
}
}
for(var k = 1; k<m; k=k+2)
{
drawSixHex(ctx, oldX+(k+2)*diffX, oldY-k*diffY);
drawSixHex(ctx, oldX+(k+2)*diffX, (oldY+2*m*diffY)+(k-2)*diffY);
drawSixHex(ctx, oldX+(m-1)*diffX+(k+2)*diffX, oldY+(k-(m-1))*diffY);
drawSixHex(ctx, oldX+(m-1)*diffX+(k+2)*diffX, (oldY+2*m*diffY)-(k-(m-3))*diffY);
}
for(var g = -2*m; g<2*m-2; g=g+2)
{
drawSixHex(ctx, oldX + (m+1)*diffX, oldY+(g)*diffY+(m+1)*diffY);
}
}
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
drawBoard(250, 250, ctx, size());
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Canvas Hexagonal Map</title>
</head>
<body>
<canvas id="canvas" width="980" height="520" ></canvas>
<br>
<br>
<input type="number" id="myNumber" value="6" min="3" max="8">
<button onclick="size()">Try it</button>
<script src="script.js"></script>
</body>
</html>
【问题讨论】:
-
你只是通过 size 函数返回大小。而不是你应该用那个大小重新绘制画布。
标签: javascript html canvas parameter-passing