计算丢失的坐标

时间:2018-08-12 15:33:02

标签: javascript html math canvas geometry

我将要开发一个带有画布的特殊动画。我想将等腰三角形绕圆旋转。

img

注意:我不想旋转画布本身。我想每帧计算三角形的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
  • 通常从A到距中心M一定长度(例如20像素)的地方进行计算

尽管如此,我在实施它时遇到了困难,希望有人能帮助我。预先感谢。

1 个答案:

答案 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))