求两个二维向量之间的夹角?

以v1为起始边,按照逆时针到v2,求这个θ的角度和弧度

image.png

// 只是按照余弦定理只能得出(0~π)
function get2VectorRadian(v1, v2) {
  const {x: x1, y: y1} = v1
  const {x: x2, y: y2} = v2
  // 与v1起始向量方向相反
  const _v1 = {x: -x1, y: -y1}
  // 余弦定理
  //            C(0,0)
  //           /θ\
  //         b/   \a
  //         /     \
  // (x1,y1)A_______B(x2,y2)
  //            c
  // c^2 = a^2 + b^2 - 2*a*b*cosθ
  
  let cosRadian =
    (Math.pow(x1, 2) +
      Math.pow(y1, 2) +
      Math.pow(x2, 2) +
      Math.pow(y2, 2) -
      (Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))) /
    (2 *
      Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) *
      Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2)))

  return Math.acos(cosRadian)
}
阅读 3k
2 个回答

分别求两个点在坐标系中的角度,接下来可能会好算很多,当然还要考虑在不同象限的不同情况

const p1={x:-1,y:1}

const p2={x:0,y:-1}

const p3={x:-Math.sqrt(3),y:1} //测试用



function getDeGrees(p){

  if (radians < 0) {
    radians += 2*Math.PI;
  }
  let degress=radians*180 / Math.PI
  return degress
 
}
//获取角度
function getangle(a,b){
  let angle=a-b
  if(angle<0){
    angle=360+angle
  }
  return angle
}
let d1=getDeGrees(p1) //135度
let d2=getDeGrees(p2) //270度
console.log(getangle(d1,d2)) //225
function getAngleBy3Point(pointa, point0, pointb) {
  let xa = point0[0] - pointa[0]
  let xb = pointb[0] - point0[0]
  let ya = point0[1] - pointa[1]
  let yb = pointb[1] - point0[1]

  let angle = 0

  let _a = Math.sqrt(xa * xa + ya * ya)
  let _b = Math.sqrt(xb * xb + yb * yb)
  if(_a && _b){
    let p = xa * xb + ya * yb

    angle = Math.acos(p / (_a * _b))
    angle = angle / Math.PI * 180
    //direction 大于0 逆时针, 小于0 顺时针, 等于0 平行
    let direction = xa * yb - ya * xb
    direction = direction > 0 ? 1 : -1
    angle = 180 + direction * angle
  }
  
  return angle
}

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题