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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值