javascript - 计算缺失坐标
问题描述
我即将用画布开发一个特殊的动画。我想围绕一个圆圈旋转一个等腰三角形。
注意:我不想旋转画布本身。我想每帧计算三角形的 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>
因为我知道三角形的对边长度相等,所以我只需要计算最后一点。我知道理论路径:
- 计算距离 xy1/xy2 的梯度 A
- 计算距离xy1/xy2的中心M
- 通常从距中心 M 一定长度(例如 20px)的 A 计算
尽管如此,我在实施它时遇到了问题,希望有人能帮助我。提前致谢。
解决方案
计算三角形第三点的坐标,应使用点 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))
推荐阅读
- machine-learning - 如何将边界框(x1、y1、x2、y2)转换为 YOLO 样式(X、Y、W、H)
- gitlab - 我在虚拟机上安装了 gitlab,磁盘为 300GB,但它显示只有 50GB?
- azure-template - 如何在 azure 中同时为所有 webapps 创建新警报
- android - 有没有办法在自定义视图中提取 AppBarLayout 和 CollapsingToolbar?
- php - 在ajax中没有得到响应
- jhipster - GKE - 如何在 Jhipster 6 微服务 UAA 项目中的网关上使用 HTTPS
- php - 如果用户查看我的页面,则显示在线,如果他关闭,则显示离线
- angular - 在 Angular 6 上构建 ng build --prod 时出错
- debugging - 如何为 hhvm 致命错误获取更相关的堆栈跟踪(文件名和行号)?
- r - Shiny:在模块内引用 renderUI 的 id 时出错