js 已知A,B,C三个点的坐标,求B的角度?

7542
  • 233

问题1:已知ABC三个点的坐标 求B的角度 ?
问题2: 如果ABC三个点可以拖拽,如果拖到 【相反角度(由图A拖拽到图B)】 如何判断和计算?
希望带上思路
图A
image.png
图B
image.png

已知 ABC三个点的坐标 求B的角度

let A = {X:0,Y:0}
let B = {X:4,Y:0}
let C = {X:4,Y:4}
getAngle(A,B,C, 'B')

求:

function getAngle(A,B,C,angle) {
    // coding
}
回复
阅读 1.9k
3 个回答
✓ 已被采纳

我作为一个数学盲,看了一楼 @Yujiaao 老师的回答,特意去学了下什么是“余弦定理”:
https://zhuanlan.zhihu.com/p/...

大概了解到,用边长可以算出余弦,于是又去学习了下如何算边长:
https://zhidao.baidu.com/ques...

最后拿到余弦怎么算角度呢,于是又去学习了下:
https://jingyan.baidu.com/art...

最后,请叫我雷锋:

function getAngle(A,B,C,angle) {
    // 通过坐标算边长
    let a = Math.sqrt(Math.pow(C.x-B.x,2) + Math.pow(C.y-B.y,2));
    let b = Math.sqrt(Math.pow(A.x-C.x,2) + Math.pow(A.y-C.y,2));
    let c = Math.sqrt(Math.pow(B.x-A.x,2) + Math.pow(B.y-A.y,2));
    // 通过边长算余弦
    let cosA = Math.acos((b*b+c*c-a*a)/(b*c*2));
    let cosB = Math.acos((a*a+c*c-b*b)/(a*c*2));
    let cosC = Math.acos((a*a+b*b-c*c)/(a*b*2));
    // 通过余弦算角度
    return ({
        A : cosA * 180 / Math.PI,
        B : cosB * 180 / Math.PI,
        C : cosC * 180 / Math.PI,
    })[angle];
}

可以用矢量点乘,也就是余弦定理来计算

对于角B:

 a * c= |a| * |c| * cos<a,c>=a.x * c.x + a.y* c.y

所以

角B = acos((a * c)/ ( |a| * |c|) );

利用Threejs

function calculateAngle(lonlat1, lonlat2) {
    var lon1=THREE.MathUtils.degToRad(lonlat1[1])
    var lat1=THREE.MathUtils.degToRad(lonlat1[0])
    var lon2=THREE.MathUtils.degToRad(lonlat2[1])
    var lat2=THREE.MathUtils.degToRad(lonlat2[0])

    if(lon1==lon2){
        if (lat2 >= lat1){
           return 0
        }else{
           return 180 
        }
    }
    if (lat1 == lat2){
        if(lon2 > lon1 ){
            return 90
        }else if(lon2 < lon1){
            return 270
        }
    }
    
    var a = THREE.Math.radToDeg(Math.atan((lon2 - lon1) * Math.cos(lat2) / (lat2 - lat1)))
    if(lat2 > lat1){
        if(lon2 > lon1){
            return a
        }else{
            return a + 360
        }
    }else{
        return a + 180
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏