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;
    }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值