12.4派生类 点圆

来源:互联网 发布:聚宝盆营销软件 编辑:程序博客网 时间:2024/05/21 19:35
#include <iostream>#include<Cmath>using namespace std;class Point{public:      double x;    double y;    Point(double x1=0,double y1=0):x(x1),y(y1){}    friend ostream &operator<<(ostream &output,Point &p);};class Circle :public Point{private:    double r;public:    Circle(double x1=0,double y1=0,double r1=0):Point(x1,y1),r(r1){}    friend ostream & operator<<(ostream &output,Circle &c);    friend int locate(Point &p,Circle &c);    friend void Foundpoint(Point &p,Circle &c);};ostream &operator<<(ostream &output,Point &p){    output<<"("<<p.x<<","<<p.y<<")";    return output;}ostream &operator<<(ostream &output,Circle &c){    output<<"x*x+y*y="<<c.r*c.r<<endl;    return output;}int locate(Point &p,Circle &c){    if(p.x*p.x+p.y*p.y>c.r*c.r)        return 1;    else if(p.x*p.x+p.y*p.y==c.r*c.r)        return 0;    else        return -1;}void Foundpoint(Point &p,Circle &c){    Point p1,p2;    p1.x=c.x+sqrt((c.r*c.r)/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x))));    p1.y=((c.y-p.y)/(c.x-p.x))*(p1.x-p.x)+p.y;     p2.x=c.x-sqrt((c.r*c.r)/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x))));    p2.y=((c.y-p.y)/(c.x-p.x))*(p1.x-p.x)+p.y;    cout<<"这两点的坐标是:"<<p1<<"  "<<p2<<endl;}int main(){    Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1Point 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;    Point point_p(3,7);    Circle circle_c(4,11,5);    Foundpoint(point_p,circle_c);    return 0;}

0 0
原创粉丝点击