Rectangle and Circle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2132 Accepted Submission(s): 509
Problem Description
Given a rectangle and a circle in the coordinate system(two edges of the rectangle are parallel with the X-axis, and the other two are parallel with the Y-axis), you have to tell if their borders intersect.
Note: we call them intersect even if they are just tangent. The circle is located by its centre and radius, and the rectangle is located by one of its diagonal.
Note: we call them intersect even if they are just tangent. The circle is located by its centre and radius, and the rectangle is located by one of its diagonal.
![](https://i-blog.csdnimg.cn/blog_migrate/38e25f6dcf3e19683d46c7433956188a.jpeg)
Input
The first line of input is a positive integer P which indicates the number of test cases. Then P test cases follow. Each test cases consists of seven real numbers, they are X,Y,R,X1,Y1,X2,Y2. That means the centre of a circle is (X,Y) and the radius of the circle is R, and one of the rectangle's diagonal is (X1,Y1)-(X2,Y2).
Output
For each test case, if the rectangle and the circle intersects, just output "YES" in a single line, or you should output "NO" in a single line.
Sample Input
2 1 1 1 1 2 4 3 1 1 1 1 3 4 4.5
Sample Output
YES NO
Author
weigang Lee
Source
Recommend
Ignatius.L
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
int n=input.nextInt();
while(n-->0){
double x,y;
x=input.nextDouble();
y=input.nextDouble();
Shape p=new Shape(x,y);//圆心坐标
double R=input.nextDouble();//半径
x=input.nextDouble();
y=input.nextDouble();
Shape p1=new Shape(x,y);
x=input.nextDouble();
y=input.nextDouble();
Shape p2=new Shape(x,y);
boolean flag=F(p,R,p1,p2);
if(flag==true)
System.out.println("YES");
else
System.out.println("NO");
}
}//main
private static boolean F(Shape p, double r, Shape p1, Shape p2) {
// TODO Auto-generated method stub
double min_x=Math.min(p1.x, p2.x);
double max_x=Math.max(p1.x, p2.x);
double min_y=Math.min(p1.y, p2.y);
double max_y=Math.max(p1.y, p2.y);
Shape q1=new Shape(min_x,min_y);
Shape q2=new Shape(min_x,max_y);
Shape q3=new Shape(max_x,max_y);
Shape q4=new Shape(max_x,min_y);
//圆在矩形的里面,矩形包含圆
if(p.x-r>min_x && p.x+r<max_x && p.y+r<max_y && p.y-r>min_y)
return false;
//圆在矩形的外面,四周
if(p.x+r<min_x || p.x-r>max_x || p.y-r>max_y || p.y+r<min_y)
return false;
//圆包含矩形,特别是圆是矩形的外接圆
boolean i=Double.compare(distance(p, q1),r)<0;
boolean j=Double.compare(distance(p, q2),r)<0;
boolean k=Double.compare(distance(p, q3),r)<0;
boolean t=Double.compare(distance(p, q4),r)<0;
if(i&&j&&k&&t)
return false;
return true;
}
private static double distance(Shape p, Shape q1) {
// TODO Auto-generated method stub
return Math.hypot(p.x-q1.x, p.y-q1.y);
}
}
class Shape{
double x=0;
double y=0;
Shape(double x,double y){
this.x=x;
this.y=y;
}
}