1. 程式人生 > >java 面向物件_圓類

java 面向物件_圓類

計算兩個圓的位置關係

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
外切