javascript - 计算缺失坐标

标签 javascript html math canvas geometry

我即将用 Canvas 开发一个特殊的动画。我想围绕一个圆旋转一个等腰三 Angular 形。

img

注意:我不想旋转 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/

相关文章:

javascript - 如何为每个对象独立启动动画(KineticJS)

html - 如何在不使用伪元素的情况下将 OL 的编号与其内容分开着色?

php - 使用 Javascript 和 PHP 使用 TTF 生成图像

html - 我应该选择 <button> 元素还是 css 按钮?

javascript - Firefox 侧边栏扩展链接加载到新的浏览器选项卡中。如何?

matlab - Matlab 中使用随机梯度下降进行矩阵分解

java - 数学、坐标

c# - 直线和球体的交点?

javascript - 如何连接数据 URL?

javascript - 如何使用 angularjs 将多个表单数据一次性发送到服务器?