计算两个圆的位置关系
Circle:类
package _02_第二章类与对象.C202_02_03_圆类;
public class Circle {
/**
* 相离
*/
public static final byte DISJOINT = 0;
/**
* 外切
*/
public static final byte EXTERNAL_CUTTING = 1;
/**
* 相交
*/
public static final byte INTERSECT = 2;
/**
* 内切
*/
public static final byte INTERNAL_CUTTING = 3;
/**
* 内含
*/
public static final byte CONTAIN = 4;
private Point p;//圆心
private float r;//半径
public void init(Point p,float r){
this.p = p;
this.r = r;
}
public void init(float x,float y,float r){ //函数重载
this.p = new Point(); //避免空指针 没有指向任何东西 所以先 声明一个引用
p.init(x,y);
this.r = r;
}
public float area(){ //不需要给参数
return (float) (Math.PI*r*r);
}
public float C(){
return (float) (2*Math.PI*r);
}
/**
* 判断两个圆的位置关系
* @param c 另一个圆
* @return 位置关系 : 0-相离 / 1-外切 / 2-相交 / 3-内切 / 4-内含
*/
public byte poistion(Circle c){
float d = this.p.distance(c.p);
float d1 = this.r+c.r;
float d2 = Math.abs(this.r-c.r);
if (Math.abs(d-d1) < 1e-6){
return EXTERNAL_CUTTING;
}
if (Math.abs(d-d2) < 1e-6){
return INTERNAL_CUTTING;
}
if (d > d1){
return DISJOINT;
}
if (d > d2){ //能够到这来 就已经排出了 大于d1的情况 让代码更加简洁
return INTERSECT;
}
return CONTAIN;
}
}
Point类:
package _02_第二章类与对象.C202_02_03_圆类;
public class Point {
private float x;//x是属性
private float y;
public void init (float x,float y){ //x是形参 函数内部有效
this.x = x; //如果写成 x = x就错了 ,需要加this 不然起不到改float x的作用
this.y = y;
}
/**
* 计算两点之间的距离
* @param p 输入的坐标值
* @return 带回p点和 x,y点 之间的值
*/
public float distance(Point p){
return (float) Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y));
}
}
主函数 Text:
package _02_第二章类与对象.C202_02_03_圆类;
public class Test {
public static void main(String[] args) {
Circle c1 = new Circle();
Circle c2 = new Circle();
Point p = new Point();
p.init(0,0);
c1.init(p,3);
c2.init(3,4,2);
System.out.println(c1.C());
System.out.println(c1.area());
switch (c1.poistion(c2)){
case Circle.DISJOINT:
System.out.println("相离");break;
case Circle.EXTERNAL_CUTTING:
System.out.println("外切");break;
case Circle.INTERSECT:
System.out.println("相交");break;
case Circle.INTERNAL_CUTTING:
System.out.println("内切");break;
case Circle.CONTAIN:
System.out.println("内含");break;
}
}
}
结果:
18.849556
28.274334
外切