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;
}
经测试,在地面上还好,在模型上测量还是不准,也可能是模型问题。
大家可以测试一下,如果大家有好的解决方案也请大家不吝赐教。