用三角函数做动画HTML5canvas,但是这个方块怎么定位呢?
Using trigonometry to animate HTML5 canvas, but how to position this square?
有时候你希望能回到过去告诉年轻的自己,数学确实很重要!但我怀疑我当时会不会听。我最近一直在玩三角函数,在这个特定示例中使用 HTML5 canvas 来制作动画。
这是一个超级简单的动画:它围绕 canvas 的中心以圆形方式放置一个圆弧。 X 和 Y 位置是根据基本三角函数 sinus 和 cosinus 计算的。 "SohCahToa"。我想我开始明白了。但不知何故,我不知道如何在其中一个三角形边的中间画一个正方形。
let radius = 200;
let angle = 0;
x = centerX + Math.cos(angle) * radius;
ctx.beginPath();
ctx.fillRect(x/2, centerY, 20, 20);
https://codepen.io/melvinidema/pen/wvKPepa?editors=1010
所以圆弧是通过将 canvas 的中心与
返工公式:(co)sinus - 对于 X = Cos,对于 Y = Sin) 的角度乘以圆的半径。
如果我们只取X位置(红线),想画圆弧位置的正方形一半。 (所以在 红线的中间 )我们应该能够将新计算的 X 位置除以二,对吗?但如果我这样做,正方形就会神奇地完全绘制在圆圈之外。
发生了什么事?为什么它会这样?在整个动画中,我应该使用什么计算来让方块位于红线的中间?
提前致谢!
您的 x
定义为:
x = centerX + Math.cos(angle) * radius;
但要除以2时,只需要除Math.cos(angle) * radius
即可,而centerX
是零点,原样保留。
所以矩形应该放在:
centerX + Math.cos(angle)/2
另外,我觉得如果你减少一半的矩形宽度会更好,得到:
centerX + Math.cos(angle)/2 - 10
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let radius = 200;
function frame(angle) {
const cx = canvas.width / 2,
cy = canvas.height / 2,
x = Math.cos(angle) * radius,
y = Math.sin(angle) * radius;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(cx+x, cy+y);
ctx.lineTo(cx+x, cy);
ctx.lineTo(cx, cy);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.arc(cx+x, cy+y, 10, 0, Math.PI*2);
ctx.fill();
ctx.fillRect(cx + x/2 - 10, cy - 10, 20, 20);
ctx.closePath();
requestAnimationFrame(()=>frame(angle+.03));
}
frame(0)
canvas {
display: block;
max-height: 100vh;
margin: auto;
}
<canvas width="500" height="500"></canvas>
有时候你希望能回到过去告诉年轻的自己,数学确实很重要!但我怀疑我当时会不会听。我最近一直在玩三角函数,在这个特定示例中使用 HTML5 canvas 来制作动画。
这是一个超级简单的动画:它围绕 canvas 的中心以圆形方式放置一个圆弧。 X 和 Y 位置是根据基本三角函数 sinus 和 cosinus 计算的。 "SohCahToa"。我想我开始明白了。但不知何故,我不知道如何在其中一个三角形边的中间画一个正方形。
let radius = 200;
let angle = 0;
x = centerX + Math.cos(angle) * radius;
ctx.beginPath();
ctx.fillRect(x/2, centerY, 20, 20);
https://codepen.io/melvinidema/pen/wvKPepa?editors=1010
所以圆弧是通过将 canvas 的中心与 返工公式:(co)sinus - 对于 X = Cos,对于 Y = Sin) 的角度乘以圆的半径。
如果我们只取X位置(红线),想画圆弧位置的正方形一半。 (所以在 红线的中间 )我们应该能够将新计算的 X 位置除以二,对吗?但如果我这样做,正方形就会神奇地完全绘制在圆圈之外。
发生了什么事?为什么它会这样?在整个动画中,我应该使用什么计算来让方块位于红线的中间?
提前致谢!
您的 x
定义为:
x = centerX + Math.cos(angle) * radius;
但要除以2时,只需要除Math.cos(angle) * radius
即可,而centerX
是零点,原样保留。
所以矩形应该放在:
centerX + Math.cos(angle)/2
另外,我觉得如果你减少一半的矩形宽度会更好,得到:
centerX + Math.cos(angle)/2 - 10
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let radius = 200;
function frame(angle) {
const cx = canvas.width / 2,
cy = canvas.height / 2,
x = Math.cos(angle) * radius,
y = Math.sin(angle) * radius;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(cx+x, cy+y);
ctx.lineTo(cx+x, cy);
ctx.lineTo(cx, cy);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.arc(cx+x, cy+y, 10, 0, Math.PI*2);
ctx.fill();
ctx.fillRect(cx + x/2 - 10, cy - 10, 20, 20);
ctx.closePath();
requestAnimationFrame(()=>frame(angle+.03));
}
frame(0)
canvas {
display: block;
max-height: 100vh;
margin: auto;
}
<canvas width="500" height="500"></canvas>