第12周项目4—点、圆的关系

来源:互联网 发布:obs点歌软件 编辑:程序博客网 时间:2024/05/11 18:30
问题及代码:

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作    者:李盈盈 * 完成日期:2015年 05 月 24 日 * 版 本 号:v1.0 * * 问题描述:先建立一个Point(点)类,以Point为基类,派生出一个Circle(圆)类,定义友元函数int locate,判断点p与圆的位置关系。 * 输入描述:无 * 程序输出:按要求输出。 */#include <iostream>#include <cmath>using namespace std;class Circle;class Point{protected:    double x;    double y;public:    Point(double xx=0,double yy=0);    double distance(const Point &p2)const ;    friend ostream & operator<<(ostream &,const Point &);    friend void crossover_point(Point &p,Circle &c, Point &p1,Point &p2 ) ;};Point::Point(double xx,double yy){    x=xx;    y=yy;}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{protected:    double x;    double y;    double z;public:    Circle(double xx=0,double yy=0,double zz=0);    friend ostream &operator<<(ostream &,const Circle &);    friend int locate(const Point &p, const Circle &c);    double area()const;    bool operator>(const Circle &);    bool operator<(const Circle &);    bool operator>=(const Circle &);    bool operator<=(const Circle &);    bool operator==(const Circle &);    bool operator!=(const Circle &);    friend void crossover_point(Point &p,Circle &c, Point &p1,Point &p2 ) ;};Circle::Circle(double xx,double yy,double zz):Point(xx,yy){    z=zz;}ostream &operator<<(ostream &output,const Circle &c){    output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.z<<endl;    return output;}int locate(const Point &p, const Circle &c){    const Point cp(c.x,c.y); //圆心    double d =cp.distance(p);    if (abs(d - c.z) < 1e-7)        return 0;  //相等    else if (d < c.z)        return -1;  //圆内    else        return 1;  //圆外}bool Circle::operator>(const Circle &c){    return (this->z-c.z)>1e-7;}bool Circle::operator<(const Circle &c){    return (c.z-this->z)>1e-7;}bool Circle::operator>=(const Circle &c){    return !(*this<c);}bool Circle::operator<=(const Circle &c){    return !(*this>c);}bool Circle::operator==(const Circle &c){    return abs(this->z - c.z) < 1e-7;}bool Circle::operator!=(const Circle &c){    return abs(this->z - c.z) > 1e-7;}double Circle::area()const{    return 3.14*z*z;}void crossover_point(Point &p, Circle &c, Point &p1,Point &p2 ){    p1.x = (c.x + sqrt(c.z*c.z/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));    p2.x = (c.x - sqrt(c.z*c.z/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));    p1.y = (p.y + (p1.x -p.x)*(c.y-p.y)/(c.x-p.x));    p2.y = (p.y + (p2.x -p.x)*(c.y-p.y)/(c.x-p.x));}int main( ){    Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1    Point p1(1,1),p2(3,-2),p3(7,3),p4,p5;  //分别位于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;    cout<<"圆c1( "<<c1<<" )的面积是 "<<c1.area()<<endl;    cout<<"圆c2( "<<c2<<" )的面积是 "<<c2.area()<<endl;    cout<<"圆c1 ";    if(c1>c2) cout<<"大于, ";    if(c1<c2) cout<<"小于, ";    if(c1>=c2) cout<<"大于等于, ";    if(c1<=c2) cout<<"小于等于, ";    if(c1==c2) cout<<"等于, ";    if(c1!=c2) cout<<"不等于, ";    cout<<"圆c2"<<endl;    crossover_point(p1,c1, p4, p5);    cout<<"点p1: "<<p1<<endl;    cout<<"与圆c1: "<<c1<<endl;    cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;    cout<<"交点1: "<<p4<<endl;    cout<<"交点2: "<<p5<<endl;    return 0;}

运行结果:

 

0 0
原创粉丝点击