【问题标题】:Calculate missing coordinate计算缺失坐标
【发布时间】:2019-01-19 11:20:36
【问题描述】:

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

注意:我不想旋转画布本身。我想每帧计算三角形的 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 以一定的长度(例如 20px)从中心 M 计算

尽管如此,我在实现它时遇到了问题,希望有人能帮助我。提前致谢。

【问题讨论】:

    标签: javascript html math canvas geometry


    【解决方案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))
    

    【讨论】:

    • 对不起,我不太明白你的回答。 0.866 来自哪里,y3 又在哪里?为什么结尾有逗号?如果我能够计算出确切的值,为什么我需要approximation?嗯? :)
    • 我已经添加了一些解释。我希望显然 y 坐标使用相同的参数,但 sin 而不是 cos
    • 还增加了半径扩大的精确值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多