【问题标题】:How to check if coordinates are left or right of coordinates with given degrees in javascript?如何检查坐标是在javascript中给定度数坐标的左侧还是右侧?
【发布时间】:2014-07-29 11:30:51
【问题描述】:

问题标题可能有点混乱,想象一下:

在这张图中,我知道点 a 和 b 的位置(它们的 x 和 y 值)——虽然原点在左上角,所以 yb 例如在 137 和 ya 81 处。另外,我知道角度 <) a 的度数值,它定义了较亮的矩形旋转了多少(如果有用的话,我也知道另一个旋转了多少)。

所以,我想检查点 a 是在点 b 的假想线(轴,粉色线)的左侧还是右侧。你会怎么做?我知道这可能只是数学,但我迷路了。

var isleft = function(xb,yb, xa, ya, degree) {
    if the point at xa, ya is left from the line starting at point xb, yb using d degrees return true;

};

我想我必须使用一个简单的线性函数来执行此操作,但我不知道如何处理度数,计算给定 y 值在该线上的相应坐标,因此不胜感激。

【问题讨论】:

  • 我没有说任何向量,这就是我提供的所有值
  • 问题不清楚...你的图片上的degree在哪里?
  • 度数是指浅灰色矩形旋转的度数,我会更新图像
  • 图表已更新。角度 a 表示矩形 2 旋转了多少,我不知道这是否感兴趣。我也知道矩形 1 旋转的角度,但我认为知道这些点就足够了
  • 你需要找到原点(yb, xb)的两个向量之间的角度,一个在矩形的边上,另一个通过(ya, xa)。您现在提供的信息就足够了。毫无疑问,有很多解决方案,但有些会比其他的更有效。顺便说一句,为什么坐标是y, x?笛卡尔坐标通常是按x, y 排序的。

标签: javascript coordinate-systems


【解决方案1】:

您可以计算出从点 b 到点 a 的方位角,如果它小于角度 a(沿边的方位角)矩形),则该点为“左”,否则为“右”。以下函数返回从 ba 的方位,但使用坐标顺序 (x, y)。坐标方向是每个屏幕的,即向右 +x 和向下 +y(正常的笛卡尔系统将向上 +y):

// Long version
function calcAngle(a, b) {
  var PI = Math.PI;
  var points
  var dx = b[0] - a[0];
  var dy = a[1] - b[1];
  var beta = Math.atan(dx / dy);

  // 1st quadrant
  if (dx >= 0 && dy >=0) return beta;

  // 2nd quadrant
  if (dx >= 0 && dy < 0) return PI + beta;

  // 3rd quadrant
  if (dx < 0 && dy < 0)  return PI + beta;

  // 4th quadrant
  if (dx < 0 && dy >= 0) return 2*PI + beta
}

在上面,ab(x, y)顺序的坐标对,其中a是点b图中的 em> 和 b 是图中的点 a。一些测试:

// Convert radians to degrees
function rad2deg(rad) {return rad * 180 / Math.PI}

var pair, points = [
  // 1st quadrant
  [[10, 30], [12, 15]],  //   7.6 deg
  [[10, 30], [12, 30]],  //  90.0 deg
  // 2nd quadrant
  [[10, 30], [20, 31]],  //  95.7 deg
  [[10, 30], [10, 40]],  // 180.0 deg
  // 3rd quadrant
  [[10, 30], [ 1, 31]],  // 263.7 deg
  [[10, 30], [ 5, 30]],  // 270.0 deg
  // 4th quadrant
  [[10, 30], [ 5, 5]],   // 348.7 deg
  [[10, 30], [10, 5]]    //   0.0 deg
];

for (var i=0, iLen=points.length; i<iLen; i++) {
  pair = points[i];
  console.log(pair[0] + ',' + pair[1] + ' : ' + rad2deg(calcAngle(pair[0], pair[1])));
}

函数可以更简洁:

function calcAngle(a, b) {
  var PI = Math.PI;
  var dx = b[0] - a[0];
  var dy = a[1] - b[1];
  var beta = Math.atan(dx / dy);
  if (dy < 0) return PI + beta;
  if (dx < 0 && dy >= 0) return 2*PI + beta
  return beta;
}

要计算左方或右方,请使用 calcAngle 函数计算第二个方位并将其与第一个方位进行比较。如果它更少,它在左边。如果它更大,它在右边。这种感觉总是顺时针的,这可能不适合。

例如如果 a 是 5° 并且计算出的角度是 355°,那是向右 350° 还是向左 10°?您可以决定,如果差值超过 180°,则反转侧面(例如,向右 181° 被视为向左 179°)。

【讨论】:

  • 事实证明,这种方法不是很准确,或者我用错了。还是谢谢
  • 我想你的意思是使用一个角度和两个点是不准确的。数学与 ECMAScript 数学一样准确。
  • 我正在寻找类似jsfiddle.net/2VXXP/6 的东西 :) 你的代码不起作用,也许我做错了什么
  • @Alex——因为我的代码不是为了找到相交的边,而是在给定两个点和一个角度的情况下找到两个向量之间的角度。没问题,保留一些脑细胞使用一段时间。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2014-06-15
  • 2023-03-22
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多