JAVA 根据三维中三个点的坐标获取角度

JAVA 根据三维中三个点的坐标获取角度

一、环境

JDK1.8

二、问题

公司移动端BIM+GIS功能需求,选择三点,获取角度值。公司使用的是超图服务,但是由于超图暂时没有开放获取角度的接口,所以需要自行开发接口临时使用。

三、解决

使用超图测量距离的接口,获取到三个点的XYZ坐标,也就是经纬度以及高度。

以下是根据三点坐标获取角度的方法,返回两位小数值。

/*** 根据三维空间三点获取角度信息* @param pointA * @param crossPoint 交点* @param pointB* @return*/private double getAngleFromPoints(double[] pointA, double[] crossPoint, double[] pointB){double angle = 0;// 获取方向向量double[] vectorA = new double[]{pointA[0]-crossPoint[0], pointA[1]-crossPoint[1], pointA[2]-crossPoint[2]};double[] vectorB = new double[]{pointB[0]-crossPoint[0], pointB[1]-crossPoint[1], pointB[2]-crossPoint[2]};// 计算单位向量double moduloA = Math.sqrt(Math.pow(vectorA[0],2) + Math.pow(vectorA[1],2) + Math.pow(vectorA[2],2));double moduloB = Math.sqrt(Math.pow(vectorB[0],2) + Math.pow(vectorB[1],2) + Math.pow(vectorB[2],2));double[] unitVectorA = new double[]{vectorA[0]/moduloA, vectorA[1]/moduloA, vectorA[2]/moduloA};double[] unitVectorB = new double[]{vectorB[0]/moduloB, vectorB[1]/moduloB, vectorB[2]/moduloB};// 根据单位向量中心点到原点的距离获取二分之一夹角的余弦值double[] middleAB = new double[]{(unitVectorA[0] + unitVectorB[0])/2, (unitVectorA[1] + unitVectorB[1])/2, (unitVectorA[2] + unitVectorB[2])/2};double cosVal = Math.sqrt(Math.pow(middleAB[0],2) + Math.pow(middleAB[1],2) + Math.pow(middleAB[2],2));// 根据余弦值获取角度angle = Math.acos(cosVal) * 180 / Math.PI * 2;// 返回BigDecimal b = new BigDecimal(angle);angle = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); // 取两位小数return angle;}

经测试,在地面上还好,在模型上测量还是不准,也可能是模型问题。

大家可以测试一下,如果大家有好的解决方案也请大家不吝赐教。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部