• 求圆心到点的直线与圆的相交点


    求圆心到点的直线与圆的相交点

     点B为圆上一动点,已知圆心O(x2,y2), 圆外点A(x1,y1),圆半径r值,求B(x,y)坐标。

    由图可知,产生下面两个公式。

    m/n = y1-y2/x1-x2

          m^2+n^2=r^2

    由上面的公式可以得出

         n的长度计算公式为n^2= r^2 / [ (y1-y2 / x1-x2)^2 + 1]

     

     点B的坐标为(x2-n,  y2+m)

    PolygonUtils.java代码如下:

    public class PolygonUtils {

    /**
       * 求交点坐标
       * @param p1 圆外任意一点坐标
       * @param o1 圆心坐标
       * @param radius 圆半径
       * @return
       */

        public PointDto getLine4CircularV1(PointDto p1, PointDto o1, double radius){
            //m,n分别为为交点跟圆心在y轴,和x轴的间距;
            double m=0,n=0;
            double y = p1.y-o1.y, x = p1.x-o1.x;
            //计算m和n
            //n^2= r^2 / [ (y1-y2 / x1-x2)^2 + 1]
            n = pow(radius, 2) / (pow(y / x, 2) + 1) ;
            //m^2 + n^2 = r^2
            m = sqrt( pow(radius, 2) - n);
            n = sqrt(n);
            PointDto dto = new PointDto();
            if(x > 0){
                if(y > 0){
                   //在第四象限
                }else{
                    //在第一象限
                    m *= -1;
                }
            }else{
                n *= -1;
                if(y > 0){
                    //在第三象限
                }else{
                    //在第二象限
                    m *=-1;
                }
            }
            dto.setY(o1.y+ m);
            dto.setX(o1.x+ n);
            return dto;
        }

    /**
     * 计算两点之间的角度
     * @param p1
     * @param p2
     * @return
     */
    public static float getAnglex(PointDto p1, PointDto p2){
        //Java中的Math.atan2(double x, double y)方法功能如下:
        //将指定的直角坐标(x, y)转换为极坐标(r, θ),并返回弧度θ。
        double anglex = Math.atan2((p2.getX() - p1.getX()), (p1.getY() - p2.getY()));
        if(Double.isNaN(anglex)) {
            return 0F;
        }else{
            return (float) (anglex * (180 / Math.PI));
        }
    }
    public static Double getDistance(Double x1, Double y1, Double x2, Double y2){
        return Math.sqrt( Math.pow(x1 - x2, 2) + Math.pow(y1-y2,2));
    }
    
    public static Double getDistance(PointDto p1, PointDto p2){
        return getDistance(p1.getX(), p1.getY(), p2.getX(), p2.getY());
    }

    }

    PointDto.java

    public class PointDto {
        public double x;
        public double y;

        public PointDto() {
            super();
        }
        public PointDto(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double getX() {
            return x;
        }

        public void setX(double x) {
            this.x = x;
        }

        public double getY() {
            return y;
        }

        public void setY(double y) {
            this.y = y;
        }
    }

  • 相关阅读:
    区块链(1):区块链简介
    (10)学习笔记:动手深度学习(模型选择 + 过拟合和欠拟合)
    从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能
    【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台
    青龙面板-闲趣赚修复版
    【无标题】
    APP商品详情源数据接口(淘宝/京东/拼多多/苏宁/抖音等平台详情数据分析接口)代码对接教程
    正点原子FreeRTOS(中)
    机器学习基本概念
    nodejs项目实例医生预约平台宠物医院预约挂号网
  • 原文地址:https://blog.csdn.net/gong0585/article/details/128019314