Java | 三个点求夹角,点在线的左侧还是右侧

3个点p1,p2,p3,求夹角∠P1P2P3的度数、P3在P1,P2两点所在线的左侧还是右侧

 *^y
 *|
 *|         /| p2点
 *|        / |
 *|       /  |
 *|--- p1点--p3点---------->x

求夹角

/**
     * 求∠P1P2P3的度数
     * P2的度数
     *
     *^y
     *|
     *|         /| p2点
     *|        / |
     *|       /  |
     *|--- p1点--p3点---------->x
     *
     * @param p1x 第一点X
     * @param p1y 第一点Y
     * @param p2x 第二点X
     * @param p2y 第二点Y
     * @param p3x 第三点X
     * @param p3y 第三点Y
     * @return 返回第二点夹角
     */
    private  static int getIn_angle(int p1x, int p1y, int p2x, int p2y, int p3x, int p3y) {
        //向量的点乘
        int t =(p1x-p2x)*(p3x-p2x)+(p1y-p2y)*(p3y-p2y);

        //为了精确直接使用而不使用中间变量
        //包含了步骤:A=向量的点乘/向量的模相乘
        //          B=arccos(A),用反余弦求出弧度
        //          result=180*B/π 弧度转角度制
        int result =(int)(180*Math.acos(
                t/Math.sqrt
                        ((Math.abs((p1x-p2x)*(p1x-p2x))+Math.abs((p1y-p2y)*(p1y-p2y)))
                                *(Math.abs((p3x-p2x)*(p3x-p2x))+Math.abs((p3y-p2y)*(p3y-p2y)))
                        ))
                /Math.PI);
        //      pi   = 180
        //      x    =  ?
        //====> ?=180*x/pi

        return result;
    }


    /**
     * 求P3在 P1P的左侧还是右侧
     * @param p1x 第一点X
     * @param p1y 第一点Y
     * @param p2x 第二点X
     * @param p2y 第二点Y
     * @param p3x 第三点X
     * @param p3y 第三点Y
     * @return 返回第三点在左在右
     */
    public static boolean  LeftOfLine(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y)
    {
        double tmpx = (p1x - p2x) / (p1y - p2y) * (p3y - p2y) + p2x;
        //当tmpx>p3x的时候,说明点p3在线的左边,小于在右边,等于则在线上。
        if (tmpx > p3x){
            System.out.println("左");
            return true;
        }else if (tmpx == p3x){
            System.out.println("在直线上");
        }else if (tmpx <p3x){
            System.out.println("右");
        }
        return false;
    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针不南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值