求圆心到点的直线与圆的相交点
点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;
}
}