内容要求:
按照面向对象方法,使用Java编写应用程序,实现如下功能:
提示用户输入2个圆的圆心坐标和各自的半径值,判断并输出这两个圆之前的位置关系。
两个圆之间的位置关系有如下三种:
两个圆包含时输出:圆 (x1, y1) - r1 包含 圆 (x2, y2) - r2
两个圆相交时输出:圆 (x1, y1) - r1 与 圆 (x2, y2) - r2 相交
两个圆无关时输出:圆 (x1, y1) - r1 与 圆 (x2, y2) - r2 无关
分析:判断两个圆位置的方法是:半径和小于两圆心距离时,两圆相离;半径差大于两圆心距离时,大圆包含小圆;其他情况相交。
相交包含三种情况(题目不作要求):半径和等于两圆心距离时,两圆外切;半径差等于两圆心距离时,两圆内切;其他情况有两个交点。
代码片段如下:
import java.util.Scanner;
public class Circle {//定义一个圆类
double x;
double y;
double r;
public void init(){//初始化一个圆的方法
Scanner sc=new Scanner(System.in);
double x=sc.nextDouble();
double y=sc.nextDouble();
double r=sc.nextDouble();
this.x=x;
this.y=y;
this.r=r;
}
public void containOrNot(double x1,double y1,double r1,double x2,double y2,double r2){//比较两个圆位置距离的方法
double dir_xy=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
if(dir_xy>(r1+r2)*(r1+r2)){
System.out.printf("(%.2f,%.2f)-%.2f与(%.2f,%.2f)-%.2f无关",x1,y1,r1,x2,y2,r2);
}//无关
else if(dir_xy<(r1-r2)*(r1-r2)){
if(r1>r2)System.out.printf("(%.2f,%.2f)-%.2f包含(%.2f,%.2f)-%.2f",x1,y1,r1,x2,y2,r2);
else System.out.printf("(%.2f,%.2f)-%.2f包含(%.2f,%.2f)-%.2f",x2,y2,r2,x1,y1,r1);
}//包含
else{
System.out.printf("(%.2f,%.2f)-%.2f与(%.2f,%.2f)-%.2f相交",x1,y1,r1,x2,y2,r2);
}//相交
}
}
public class CircleTest {
public static void main(String[] args) {
Circle c1=new Circle();//定义第一个圆并初始化
System.out.print("输入第一个圆 ");
c1.init();
Circle c2=new Circle();//定义第二个圆并初始化
System.out.print("输入第二个圆 ");
c2.init();
c1.containOrNot(c1.x,c1.y,c1.r,c2.x,c2.y,c2.r);//调用比较圆位置的方法
}
}