第十三週專案一點、圓的關係
阿新 • • 發佈:2019-01-11
/* * 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; }