gpt4 book ai didi

javascript - 调整 Canvas 大小而不保持比例

转载 作者:行者123 更新时间:2023-12-02 13:53:41 26 4
gpt4 key购买 nike

在这个程序中,我有一些代码可以根据 slider 的变化来更改 Canvas 的宽度。但是,我注意到 Canvas 会调整大小以保持其纵横比。

有什么方法可以防止这种情况发生,以便 Canvas 从侧面被压扁/膨胀?或者,我可以使球不随 Canvas 改变大小并保持其原始大小吗?

代码:

<!DOCTYPE html>
<html>
<head>
</head>
<style>
</style>
<body>
<canvas id="my_canvas" width="600px" height="300px"></canvas>
<script>
var canvas = document.getElementById("my_canvas");
var c = canvas.getContext("2d");

//create ball container
var container = {
x: 0,
y: 0,
width: 600,
height: 300
};

//make balls array
var balls = [{
x: 50,
y: 100,
r: 20,
vx: 10,
vy:10,
color: 125
}, {
x: 150,
y: 80,
r: 20,
vx: 10,
vy: 10,
color: 105
}, {
x: 90,
y: 150,
r: 20,
vx: 10,
vy: 10,
color: 20
}, {
x: 100,
y: 50,
r: 20,
vx: 10,
vy: 10,
color: 80
}];

function animate() {
//draw container
c.fillStyle = "#000000";
c.fillRect(container.x, container.y, container.width, container.height);

//loop balls array
for (var i = 0; i < balls.length; i++) {
//draw balls
c.fillStyle = 'hsl(' + balls[i].color++ + ', 100%, 50%)';
c.beginPath();
c.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2, true);
c.fill();

//animate balls
if (balls[i].x - balls[i].r + balls[i].vx < container.x || balls[i].x + balls[i].r + balls[i].vx > container.x + container.width) {
balls[i].vx = -balls[i].vx;
}

if (balls[i].y + balls[i].r + balls[i].vy > container.y + container.height || balls[i].y - balls[i].r + balls[i].vy < container.y) {
balls[i].vy = -balls[i].vy;
}

balls[i].x += balls[i].vx;
balls[i].y += balls[i].vy;
}
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

function myFunction () {
document.getElementById("my_canvas").style.width = document.getElementById("VolumeInputId").value + "px";
}
</script>
<form name = "volume">
<label for="volume">Volume</label>
<input type="range" name="VolumeInputName" id="VolumeInputId" value=600 min="300" max="600" onchange="myFunction()">
<output name="VolumeOutputName" id="VolumeOutputId"></output>
</form>
</body>
</html>

最佳答案

除非您想看到像素化图片,否则不应使用样式调整 Canvas 大小。

var canvas = document.getElementById("my_canvas");
var c = canvas.getContext("2d");

c.beginPath();
c.moveTo(0,0);
c.lineTo(30,30);
c.stroke();

document.getElementById("my_canvas").style.width = "280px";
canvas {
border: 1px solid black;
}
<canvas id="my_canvas" width="60px" height="30px"></canvas>

正如您所看到的,当通过样式缩放到 280px 时,60 x 30 Canvas 会显示一条像素化直线。

但是,如果您使用 canvas.widthcanvas.height,您可以独立更改每一个,而无需插值像素。

var canvas = document.getElementById("my_canvas");
var c = canvas.getContext("2d");

canvas.width = 280;
canvas.height = 200;

c.beginPath();
c.moveTo(0,0);
c.lineTo(30,30);
c.stroke();
canvas {
border: 1px solid black;
}
<canvas id="my_canvas" width="60px" height="30px"></canvas>

在这种情况下, Canvas 宽度和高度独立更改,直线尺寸仍然相同。

heightwidth 是 Canvas 对象(而不是上下文)的属性。

Here是对原始内容的详细修改,按样式调整大小并按属性调整大小。

关于javascript - 调整 Canvas 大小而不保持比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40836272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com