山科OJ:Problem B: 又是形状!

Problem B: 又是形状!

Time Limit: 1 Sec  Memory Limit: 2 MB
Submit: 450  Solved: 159
[Submit][Status]

Description

从点类分别继承出圆类Circle和矩形类Rectangle,圆可认为是点的基础上增加半径radius,矩形可认为是点的基础上增加长length和宽width(只需考虑横平竖直的矩形)

要求为Circle增加

1)构造函数,

2)成员函数setRadius(double)double getRadius()

3)成员函数 int loate(Point t) 判断参数t是在圆内(1)圆外(-1)还是圆上(0),

4void crossPointsPoint src, Point& cp1, Point& cp2)输出参数t与圆心相连的直线与圆的两个交点(cp1cp2)。不需考虑该点和中心重叠的情况

Rectangle增加

1) 构造函数,

2)成员函数setHeight(double),setWidth(double)double getHeight, double getWidth()

3)成员函数 int locate(Point t) 判断参数t是在矩形内(1)矩形外(-1)还是矩形上(0),

4)成员函数 void crossPointsPoint src, Point& cp1, Point& cp2)输出参数t与矩形中心相连的直线与矩形的两个交点(cp1cp2)。不需考虑该点和中心重叠的情况

交点输出按照x1<=x2 或者 x1==x2 y1<=y2的顺序

Input

append.cc

Output

Sample Input

2 2 2

2 0

1 2

0 0

2 0

2 2 6 4

8 6

3 4

2 7

8 7

Sample Output

p1在圆c1之上

p2在圆c1之内

p3在圆c1之外

 

p1与圆c1的圆心相连,与圆交于两点,分别是:

交点: [2,0]

交点: [2,4]

 

p1在矩形r1之上

p2在矩形r1之内

p3在矩形r1之外

 

p1与矩形r1的中心相连,与矩形交于两点,分别是:

交点: [3,2]

交点: [7,6]

#include<bits/stdc++.h>
using namespace std;
class Point
{
    protected:
  
    public:     
        double x;
        double y;
        Point(double xx=0,double yy=0):x(xx),y(yy)
        {
              
        }
        double getx()
        {
            return x;
        }
        double gety()
        {
            return y;
        }
        void setX(double xx)
        {
            x=xx;
        }
        void setY(double yy)
        {
            y=yy;
        }
        friend ostream& operator<<(ostream& stream,Point c);
};
  
ostream& operator<<(ostream &stream, Point c)
{
    stream<<"["<<c.x<<","<<c.y<<"]"<<endl;
    return stream;
}
class Circle:public Point
{
    protected:
        double r;
    public:
        Circle(double x,double y,double rr):Point(x,y),r(rr)
        {
              
        }
        void setRadius(double rr)
        {
            r=rr;
        }
        double getRadius()
        {
            return r;
        }
        int locate(Point t)
        {
            double l;
            l=pow( t.getx()-x , 2 )+pow( t.gety()-y , 2 );
            if(l>r*r)
            {
                return -1;
            }
            else if(l<r*r)
            {
                return 1;
            }
            else
                return 0;
        }
        void crossPoints(Point src, Point& cp1, Point& cp2)//Jerry
        {
            double l=pow(src.x-x,2)+pow(src.y-y,2);
            l=sqrt(l);
            double tepx1,tepy1;
            double tepx2,tepy2;
            double k=(y-src.y)/(x-src.x);
            if(src.x!=x)
            {
//              tepy=y+r*cos...
                tepy1=y+r*( fabs( fabs(src.y)-fabs(y)   ) )/l;//shang
                tepy2=y-(fabs(fabs(tepy1)-fabs(y)));//xia
                    if(k>0)
                    {
                        tepx1=x+r*( fabs( fabs(src.x)-fabs(x)   ) )/l;//shang 
                        tepx2=x-r*( fabs( fabs(src.x)-fabs(x)   ) )/l;//xia
                        cp1.x=tepx2;
                        cp1.y=tepy2;
                        cp2.x=tepx1;
                        cp2.y=tepy1;
                    }
                    if(k==0)
                    {
                        tepx1=x-r;
                        tepx2=x+r;
                        cp1.x=tepx1;
                        cp1.y=y;
                        cp2.x=tepx2;
                        cp2.y=y;
                    }
                    if(k<0)
                    {
                        tepx1=x-r*( fabs( fabs(src.x)-fabs(x)   ) )/l;//shang 
                        tepx2=x+r*( fabs( fabs(src.x)-fabs(x)   ) )/l;//xia 
                        cp1.x=tepx1;
                        cp1.y=tepy1;
                        cp2.x=tepx2;
                        cp2.y=tepy2;                        
                    }
                  
            }
            else
            {
                cp1.x=x;
                cp1.y=y-r;
                cp2.x=x;
                cp2.y=y+r;
            }
              
  
        }
};
class Rectangle:public Point
{
    protected:
        double chang,kuan;
    public:
        Rectangle(double x,double y,double ch,double ku):Point(x,y),chang(ch),kuan(ku)
        {
              
        }
        void setHeight(double h)
        {
            chang=h;
        }
        void setWidth(double wid)
        {
            kuan=wid;
        }
        double getHeight()
        {
            return chang;
        }
        double getWidth()
        {
            return kuan;
        }
        int locate(Point t)
        {
            if(t.getx() < x+chang && t.getx()>x && t.gety() > y && t.gety() < y+kuan)
            {
                return 1;
            }
            else if(t.getx() < x || t.getx() > x+chang ||t.gety() < y || t.gety() > y+kuan)
            {
                return -1;
            }
            else
                return 0;
        }
        void crossPoints(Point src, Point& cp1, Point& cp2)
        {
            double xc,yc;//中心
            double y1,y2,x1,x2;
            double tx1,tx2,ty1,ty2;
            int flag=1;
            xc=(getx()+chang+x)/2;
            yc=(gety()+kuan+y)/2;
            if(xc!=src.x)
            {
                double k= (yc-src.y)/(xc-src.x);            //斜率 
                y1=k*(x-xc)+yc;
                x1=(y-yc)/k+xc;
                if(locate(Point(getx(),y1))==0)
                {
                    tx1=getx();
                    ty1=y1;
                    tx2=x+chang;
                    if(yc>=ty1)
                    ty2=ty1-2*(ty1-yc);
                    else
                    ty2=ty1+2*(yc-ty1);
                }
                else if(locate(Point(x1,gety()))==0)
                {
                    tx1=x1;
                    ty1=gety();
                    ty2=y+kuan;
                    if(xc>=tx1)
                    tx2=tx1+2*(xc-tx1);
                    else
                    tx2=tx1-2*(tx1-xc);
                }
                cp1.x=tx1;
                cp1.y=ty1;
                cp2.x=tx2;
                cp2.y=ty2;
            }
            else
            {
                cp1.x=xc;
                cp1.y=yc-kuan/2;
                cp2.x=xc;
                cp2.y=yc+kuan/2;
            }
        }
};
int main( )
{
    double x,y,r,w,h;
    cin>>x>>y>>r;
    Circle c1(x,y,r);
 
    cin>>x>>y;
    Point p1(x,y);
    cout<<"点p1在圆c1之"<<((c1.locate(p1)>0)?"内":((c1.locate(p1)<0)?"外":"上"))<<endl;
    cin>>x>>y;
    Point p2(x,y);
    cout<<"点p2在圆c1之"<<((c1.locate(p2)>0)?"内":((c1.locate(p2)<0)?"外":"上"))<<endl;
    cin>>x>>y;
    Point p3(x,y);
    cout<<"点p3在圆c1之"<<((c1.locate(p3)>0)?"内":((c1.locate(p3)<0)?"外":"上"))<<endl;
    cout<<endl;
 
    Point p4,p5;
    cin>>x>>y;
    p1.setX(x);
    p1.setY(y);
    c1.crossPoints(p1, p4, p5);
    cout<<"点p1与圆c1的圆心相连,与圆交于两点,分别是:"<<endl;
    cout<<"交点: "<<p4;
    cout<<"交点: "<<p5;
    cout<<endl;
 
 
    cin>>x>>y>>w>>h;
    Rectangle r1(x,y,w,h);
 
    cin>>x>>y;
    p1.setX(x);
    p1.setY(y);
    cout<<"点p1在矩形r1之"<<((r1.locate(p1)>0)?"内":((r1.locate(p1)<0)?"外":"上"))<<endl;
    cin>>x>>y;
    p2.setX(x);
    p2.setY(y);
    cout<<"点p2在矩形r1之"<<((r1.locate(p2)>0)?"内":((r1.locate(p2)<0)?"外":"上"))<<endl;
    cin>>x>>y;
    p3.setX(x);
    p3.setY(y);
    cout<<"点p3在矩形r1之"<<((r1.locate(p3)>0)?"内":((r1.locate(p3)<0)?"外":"上"))<<endl;
    cout<<endl;
 
    cin>>x>>y;
    p1.setX(x);
    p1.setY(y);
    r1.crossPoints(p1, p4, p5);
    cout<<"点p1与矩形r1的中心相连,与矩形交于两点,分别是:"<<endl;
    cout<<"交点: "<<p4;
    cout<<"交点: "<<p5;
 
    return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jpgxep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值