1. 程式人生 > >第十三週專案一點、圓的關係

第十三週專案一點、圓的關係

/*
 * Copyright (c) 2014, 煙臺大學計算機學院
 * All rights reserved.
 * 作    者:紀麗娜
 * 完成日期:2014年05月22日
 * 版 本 號:v1.0
 * 問題描述:
 *(1)先建立一個Point(點)類,包含資料成員x,y(座標點);
 *(2)以Point為基類,派生出一個Circle(圓)類,
 *    增加資料成員(半徑),基類的成員表示圓心;
 *(3)編寫上述兩類中的構造、
 *     解構函式及必要運算子過載函式(本專案主要是輸入輸出);
 *(4)定義友元函式int locate,
  *判斷點p與圓的位置關係(返回值<0圓內,==0圓上,>0 圓外);
*/
#include <iostream>
#include <Cmath>
using namespace std;

class Point
{
public:
    Point(double a,double b):x(a),y(b) {}		//建構函式
    double distance(const Point &p) const;	//求距離
    friend ostream & operator<<(ostream &,const Point &);//過載運算子“<<”
    ~Point(){}
protected:										 //受保護成員
    double x,y;
};

double Point::distance(const Point &p) const	//求距離
{
    double dx=x-p.x;
    double dy=y-p.y;
    return sqrt(dx*dx+dy*dy);
}

ostream & operator<<(ostream &output,const Point &p)
{
    output<<"["<<p.x<<","<<p.y<<"]"<<endl;
    return output;
}

class Circle:public Point //circle是Point類的公用派生類
{
public:
    Circle(double a,double b,double r):Point(a,b),radius(r) { } //建構函式
    friend ostream &operator<<(ostream &,const Circle &);//過載運算子“<<”
    friend int locate(const Point &p, const Circle &c); //判斷點p在圓上、圓內或圓外,返回值:<0圓內,==0圓上,>0 圓外
    //過載關係運算符(種)運算子,使之能夠按圓的面積比較兩個圓的大小;
     ~Circle(){}
protected:
    double radius;
};

int locate(const Point &p, const Circle &c)
{
    double ds;
    Point  p2(c.x,c.y);
    ds=p2.distance(p)-c.radius;
    if(ds==0)
    {
        return 0;
    }
    else if(ds<0)
    {
        return -1;
    }
    else
    {
        return 1;
    }

}

//過載運算子“<<”,使之按規定的形式輸出圓的資訊
ostream &operator<<(ostream &output,const Circle &c)
{
    output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius<<endl;
    return output;
}

int main( )
{
    Circle c1(3,2,4);      //c2應該大於c1
    Point p1(1,1),p2(3,-2),p3(7,3);  //分別位於c1內、上、外


    cout<<"圓c1: "<<c1;

    cout<<"點p1: "<<p1;
    cout<<"點p1在圓c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"內":"上"))<<endl;

    cout<<"點p2: "<<p2;
    cout<<"點p2在圓c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"內":"上"))<<endl;

    cout<<"點p3: "<<p3;
    cout<<"點p3在圓c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"內":"上"))<<endl;
    return 0;
}