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),
4)void crossPoints(Point src, Point& cp1, Point& cp2)输出参数t与圆心相连的直线与圆的两个交点(cp1,cp2)。不需考虑该点和中心重叠的情况
为Rectangle增加
1) 构造函数,
2)成员函数setHeight(double),setWidth(double)和double getHeight, double getWidth(),
3)成员函数 int locate(Point t) 判断参数t是在矩形内(1)矩形外(-1)还是矩形上(0),
4)成员函数 void crossPoints(Point src, Point& cp1, Point& cp2)输出参数t与矩形中心相连的直线与矩形的两个交点(cp1,cp2)。不需考虑该点和中心重叠的情况
交点输出按照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;
}