Rectangle and Circle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2131 Accepted Submission(s): 508
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
import java.util.Scanner;
public class Main{
private static Point R,f[];
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
while(N-->0){
float a=input.nextFloat();
float b=input.nextFloat();
float r=input.nextFloat();
R=new Point(a,b,r);
a=input.nextFloat();
b=input.nextFloat();
float a1=input.nextFloat();
float b1=input.nextFloat();
f=new Point[4];
f[0]=new Point(Math.min(a, a1),Math.min(b, b1));
f[1]=new Point(Math.min(a, a1),Math.max(b, b1));
f[2]=new Point(Math.max(a, a1),Math.max(b, b1));
f[3]=new Point(Math.max(a, a1),Math.min(b, b1));
if(pd()){
System.out.println("YES");
}
else
System.out.println("NO");
}
}
private static boolean pd() {
//长方形完全在园内
if(F(1)<R.r&&F(2)<R.r&&F(3)<R.r&&F(0)<R.r){
return false;
}
//圆在长方形左边、下边、右边、上边
if(f[0].x-R.x>R.r||f[0].y-R.y>R.r||R.x-f[3].x>R.r||R.y-f[2].y>R.y)
return false;
//圆完全在长方形的内部
if(R.x-f[0].x>R.r&&R.y-f[0].y>R.r&&f[3].x-R.x>R.r&&f[1].y-R.y>R.r){
return false;
}
return true;
}
private static double F(int i) {
return Math.sqrt(Math.pow(f[i].x-R.x, 2)+Math.pow(f[i].y-R.y, 2));
}
}
class Point{
float x,y,r;
Point(float x,float y){
this.x=x;
this.y=y;
}
Point(float x,float y ,float r){
this.x=x;
this.y=y;
this.r=r;
}
}
/*
* 8931037 2013-08-13 18:15:21 Accepted 1221 140MS 3616K 1842 B Java zhangyi hdu
*/
import java.util.Scanner;
public class Main {//郭思慧,检查错误
public static void main(String[] args) {
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) {
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)//p.y-r<max_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) {
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;
}
}