我即将用 Canvas 开发一个特殊的动画。我想围绕一个圆旋转一个等腰三 Angular 形。
注意:我不想旋转 Canvas 本身。我想计算每一帧三 Angular 形的 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>
因为我知道三 Angular 形的对边长度相等,所以我只需计算最后一个点。我知道理论路径:
- 计算距离xy1/xy2的梯度A
- 计算距离xy1/xy2的中心M
- 一般从A距中心M一定长度(如20px)开始计算
尽管如此,我在实现它时遇到了问题,希望有人能帮助我。提前致谢。
最佳答案
要计算三 Angular 形第三点的坐标,应使用点 1 和点 2 之间的中 Angular 。半径应放大三 Angular 形的高度。我对最后一个参数给出了简单的近似值:
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
是等腰三 Angular 形高与边的比率。
近似使用弧长作为边缘(它们略有不同,但对于绘图目的可以忽略不计)。
更精确的值
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))
关于javascript - 计算缺失坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810280/