Java 开发之 根据坐标计算长度、角度、位置等数据

本文介绍如何利用Java进行坐标计算,包括两点间距离、角度获取及根据角度和边长确定位置的方法,并提供了具体实现代码。

Java 开发之 根据坐标计算长度、角度、位置等数据

  • 坐标计算 其实也相当于再做三角运算, 每一个坐标在坐标图中都可视作三角形的一个顶角
  • 在这里插入图片描述
  • 有了这张图, 大家就能清晰的想象出一个三角形,然后根据三角函数进行相关的计算
  • 如果有不了解三角函数算法的可以看看本人汇总的几个三角算法文章《Java开发 三角形算法汇总》,本文的算法中也使用了该文章的算法

两点之间的长度

    /**
     * 两点之间的长度
     * @param point0 坐标
     * @param point1 坐标
     * @return
     */
    public static double getLengthOfSide(Point point0, Point point1){
        return Math.sqrt(Math.pow((point0.x-point1.x),2)+Math.pow((point0.y-point1.y),2));
    }

根据坐标 获取角度

    /**
     * 根据坐标 获取角度
     * @param point0  坐标
     * @param degreePoint  坐标  获取该点的角度
     * @param point2  坐标
     * @return
     */
    public static int getDegree(Point point0, Point degreePoint, Point point2) {
        //向量的点乘
        int vector = (point0.x - degreePoint.x) * (point2.x - degreePoint.x) + (point0.y - degreePoint.y) * (point2.y - degreePoint.y);
        //向量的模乘
        double sqrt = Math.sqrt(
                (Math.abs((point0.x - degreePoint.x) * (point0.x - degreePoint.x)) + Math.abs((point0.y - degreePoint.y) * (point0.y - degreePoint.y)))
                        * (Math.abs((point2.x - degreePoint.x) * (point2.x - degreePoint.x)) + Math.abs((point2.y - degreePoint.y) * (point2.y - degreePoint.y)))
        );
        //反余弦计算弧度
        double radian = Math.acos(vector / sqrt);
        //弧度转角度制
        return (int) (180 * radian / Math.PI);
    }
    
    /**
     * 根据坐标 获取角度
     * @param pA  坐标
     * @param degreePoint  坐标  获取该点的角度
     * @param pC  坐标
     * @return
     */
    public static  double getDegree2(Point pA, Point degreePoint, Point pC) {
        double a = getLengthOfSide(pA,degreePoint),b = getLengthOfSide(pC,degreePoint),c = getLengthOfSide(pA,pC);
        return getDegree(a,b,c);
    }

    /**
     * 已知边长  求AC 角度
     * @param a
     * @param b
     * @param c
     * @return
     */
    public static double getDegree(double a,double b,double c){
        // 计算弧度表示的角
        double degrees = Math.acos((a*a +  b*b -c*c)/(2.0*a*b));
        // 用角度表示的角
        return  Math.toDegrees(degrees);
    }

根据角度和边长获取位置

    /**
     * 根据角度和边长获取位置
     * @param p         起点位置
     * @param degree   角度
     * @param width     边长
     * @return  位置
     */
    public static double[] getPoint(Point p,double degree,double width){
        int v = (int) (degree / 90);
        double d =  (degree % 90);
        double side = getRightSideFromDegree(d, width);//与中心的直角边长
        double top = getRightSideFromLength(side, width);//另一直角边
        double x = 0 , y = 0 ;
        switch (v){
            case 0:
                x = (p.x+top);
                y = (p.y-side);
                break;
            case 1:
                x = (p.x+side);
                y = (p.y+top);
                break;
            case 2:
                x = (p.x-top);
                y = (p.y+side);
                break;
            case 3:
                x = (p.x-side);
                y = (p.y-top);
                break;
        }
        return new double[]{x,y};
    }

最后推荐一个我自己写的MVVM开源项目《Open MVVM》

有问题请私信,留言,或者发送邮件到我扣扣邮箱 qingingrunt2010

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值