【问题标题】:JS move point by an angle on circleJS在圆上移动一个角度
【发布时间】:2019-06-28 09:47:37
【问题描述】:

我有一个程序,我点击了三次,每次点击都会在画布上创建一个点。然后我计算这三个点之间的角度,如下所示:

function find_angle(A, B, C) {
    var AB = Math.sqrt(Math.pow(B.x - A.x, 2) + Math.pow(B.y - A.y, 2));
    var BC = Math.sqrt(Math.pow(B.x - C.x, 2) + Math.pow(B.y - C.y, 2));
    var AC = Math.sqrt(Math.pow(C.x - A.x, 2) + Math.pow(C.y - A.y, 2));
    return Math.acos((BC * BC + AB * AB - AC * AC) / (2 * BC * AB));
}

在上面的示例图片中,计算出的角度为 93°。我需要将point 3 移动-3°,以便点正好成90°。我有这个功能:

var angleToCorrect = alpha * (Math.PI / 180) - 90 * (Math.PI / 180);
correct_angle(point2, point3, angleToCorrect)

...

function correct_angle(p2, p3, angle) {

    var x = p2.x - p3.x;
    var y = p2.y - p3.y;
    var r = Math.sqrt(x * x + y * y); //circle radius. origin of the circle is point 2


    return {
        X: p2.x + (Math.cos(angle) * r),
        Y: p2.y + (Math.sin(angle) * r)

    };

}

现在,这个函数应该返回新的xypoint 3 校正角度为90°。然而坐标不符合我的预期。有人可以指出我做错了什么吗?

【问题讨论】:

  • 坐标与我的预期不一致 - 请向我们提供输入和预期输出。
  • 您计算的点是距离 x 轴 angle 度,而不是通过 p2 和 p3 的线。
  • 如果angleToCorrect 是计算出的角度来应用到点来纠正你的角度,我们应该知道alpha 是什么,它是如何计算的以及它的值是否正确,然后开始.
  • @Kaddath alpha 显示在图像中。
  • 但是,考虑到基于向量的方法可能更有用:您要解决的原始问题是什么?例如,限制第三点的位置会容易得多,因此角度始终为 90°。

标签: javascript math geometry


【解决方案1】:

要计算新位置,仅提供两个点是不够的,因为角度是在三个点之间测量的。

所以在这个函数中,你必须弄清楚点 1 和点 2 之间矢量的当前角度是多少。 Javascript 为这个 Math.atan2() 提供了一个漂亮的内置函数 现在我们知道了角度(以弧度为单位),我们需要向其添加新角度。这确保我们可以正确放置第 3 点。

function correct_angle(p1, p2, p3, angle)
{
    var currentAngle=Math.atan2(p1.y-p2.y, p1.x-p2.x);

    currentAngle+=angle;

    var x = p2.x - p3.x;
    var y = p2.y - p3.y;
    var r = Math.sqrt(x * x + y * y);

    return {
        X: p2.x + (Math.cos(currentAngle) * r),
        Y: p2.y + (Math.sin(currentAngle) * r)

    };
}

函数的角度参数应该是以弧度为单位的目标角度(在您的情况下为 90 或 1.5707963267949)

这是一个交互式示例:

Point = function(x, y) {
  this.x = x;
  this.y = y;
}

var pointA = new Point(162, 39);
var pointB = new Point(105, 161);
var pointC = new Point(211, 242);

var context = document.getElementById("canvas").getContext("2d");

function correct() {
  var newPoint = correct_angle(pointA, pointB, pointC, 1.5707963267949);
  pointC.x = newPoint.X;
  pointC.y = newPoint.Y;
  draw();
}

function correct_angle(p1, p2, p3, angle) {
  var currentAngle = Math.atan2(p1.y - p2.y, p1.x - p2.x);

  currentAngle += angle;

  var x = p2.x - p3.x;
  var y = p2.y - p3.y;
  var r = Math.sqrt(x * x + y * y);

  return {
    X: p2.x + (Math.cos(currentAngle) * r),
    Y: p2.y + (Math.sin(currentAngle) * r)

  };
}

function draw() {
  context.clearRect(0, 0, 400, 300);
  context.fillStyle = "red";
  context.beginPath();
  context.arc(pointA.x, pointA.y, 10, 0, 2 * Math.PI);
  context.fill();

  context.beginPath();
  context.arc(pointB.x, pointB.y, 10, 0, 2 * Math.PI);
  context.fill();

  context.beginPath();
  context.arc(pointC.x, pointC.y, 10, 0, 2 * Math.PI);
  context.fill();
}

draw();
<canvas id="canvas" width="400" height="300" style="background-color:#dddddd;"></canvas>
<button onclick="correct()" style="float:left">
correct me
</button>

【讨论】:

  • 只有当我从左上角逆时针方向绘制点时,您的 90 度示例才有效。例如,如果我想从左上角顺时针方向绘制,则目标角度为 180 度。是否有一些简单的方法可以判断目标角度是 0、90、180 还是 -90 度?或者我必须以某种方式记住我是按什么顺序画的?
  • 无论顶点是顺时针还是相反,正确的角度函数都应该起作用。我想说你的 find_angle 函数需要处理这个问题。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 2014-05-13
  • 2018-01-29
  • 2013-04-23
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多