我将要开发一个带有画布的特殊动画。我想将等腰三角形绕圆旋转。
注意:我不想旋转画布本身。我想每帧计算三角形的3个点。 (!)
。
let canvas = document.getElementById("canvas")
let ctx = canvas.getContext("2d")
let trianglePositionAngle = 0;
let triangleSizeAngle = 15;
function draw(trianglePositionAngle) {
ctx.fillStyle = "blue"
ctx.fillRect(0, 0, canvas.width, canvas.height)
let radius = 70
ctx.fillStyle = "black"
ctx.beginPath();
ctx.arc(canvas.width / 2, canvas.height / 2, radius, 0, 2 * Math.PI);
ctx.fill();
let triangle = {
x1: canvas.width / 2 + radius * Math.cos((trianglePositionAngle * Math.PI / 180)),
y1: canvas.height / 2 + radius * Math.sin((trianglePositionAngle * Math.PI / 180)),
x2: canvas.width / 2 + radius * Math.cos(((trianglePositionAngle + triangleSizeAngle) * Math.PI / 180)),
y2: canvas.height / 2 + radius * Math.sin(((trianglePositionAngle + triangleSizeAngle) * Math.PI / 180))
}
ctx.fillStyle = "red"
ctx.beginPath()
ctx.moveTo(triangle.x1, triangle.y1);
ctx.lineTo(triangle.x2, triangle.y2);
ctx.lineTo(canvas.width/2, canvas.height/2); // looking for the coordinates of this point
ctx.fill();
}
setInterval(function() {
draw(trianglePositionAngle++)
},100)
<canvas id="canvas" width="200" height="200"></canvas>
由于我知道三角形的相对侧边的长度相等,因此我只需要计算最后一点。我知道理论路径:
尽管如此,我在实施它时遇到了困难,希望有人能帮助我。预先感谢。
答案 0 :(得分:1)
要计算三角形第三个点的坐标,应使用点1和2之间的中间角度。半径应按三角形的高度扩大。我给了最后一个参数一个简单的近似值:
x3: canvas.width / 2 +
radius * (1 + 0.866 * triangleSizeAngle * Math.PI / 180) *
Math.cos(((trianglePositionAngle + triangleSizeAngle / 2) * Math.PI / 180))
y3: canvas.height / 2 +
radius * (1 + 0.866 * triangleSizeAngle * Math.PI / 180) *
Math.sin(((trianglePositionAngle + triangleSizeAngle / 2) * Math.PI / 180))
0.866=Sqrt(3)/2
是等腰三角形高度与边缘之比。
近似值使用圆弧长度作为边缘(它们略有不同,但是对于绘制目的可以忽略不计)。
更精确的值
instead of
(1 + 0.866 * triangleSizeAngle * Math.PI / 180)
you can use
(cos(0.5* triangleSizeAngle * Math.PI / 180) +
Sqrt(3)* sin(0.5* triangleSizeAngle * Math.PI / 180))