public class Solution {
/**
* @param position: the position of circle A,B and point P.
* @return: if two circle intersect return 1, otherwise -1.
*/
int rs=-1;//返回的判断结果
public int IfIntersect(double[] position) {
// write your code here
//将每一个按圆的x,y,r分好,方便计算
double x1,y1,r1,x2,y2,r2,x3,y3;
x1=position[0];
y1=position[1];
r1=position[2];
x2=position[3];
y2=position[4];
r2=position[5];
x3=position[6];
y3=position[7];
//圆的面积公式判断在未移动的情况下,a和b是否有相交
if (Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))>=Math.abs(r1-r2) && Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))<=(r1+r2))
{
rs = 1;
return rs;
}
//圆的面积公式判断a移动到p点后,a和b是否有相交
if (Math.sqrt(Math.pow(x3-x2,2)+Math.pow(y3-y2,2))>=Math.abs(r1-r2) && Math.sqrt(Math.pow(x3-x2,2)+Math.pow(y3-y2,2))<=(r1+r2))
{
rs = 1;
return rs;
}
//圆的移动过程
AMoveIntoP(position);
return rs;
}
public void AMoveIntoP(double[] position){
//将每一个按圆的x,y,r分好,方便计算
double x1,y1,r1,x2,y2,r2,x3,y3;
x1=position[0];
y1=position[1];
r1=position[2];
x2=position[3];
y2=position[4];
r2=position[5];
x3=position[6];
y3=position[7];
//因为p点可能离a点有点远,所以使用二分查找法来快速判断是否有重合
double x = (x1+x3)/2;
double y = (y1+y3)/2;
//就算在该点的时候,a和b是否相交
if (Math.sqrt(Math.pow(x-x2,2)+Math.pow(y-y2,2))>=Math.abs(r1-r2)&&Math.sqrt(Math.pow(x-x2,2)+Math.pow(y-y2,2))<=(r1+r2)){
rs = 1;
return;
}
//递归的出口,因为是double类型,很难找到那个精确的值,而且题目需求是有没有相交,所以如果在一个极小的误差时候,我就认为相交了
if (Math.sqrt(Math.pow(x-x1,2)+(Math.pow(y-y1,2)))<=0.001){
rs = -1;
return;
}
//如果不在这个点时候,在这个点之前相交了
if(rs==-1) {
position[6]=x;
position[7]=y;
AMoveIntoP(position);
position[6]=x3;
position[7]=y3;
}
//如果不在这个点时候,在这个点之后相交了
if(rs==-1) {
position[0]=x;
position[1]=y;
AMoveIntoP(position);
position[0]=x1;
position[1]=y1;
}
}
}
阿里云-天池-移动的圆
最新推荐文章于 2024-07-29 21:41:58 发布