又是形状!
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增加
构造函数,
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的中心相连,与矩形交于两点,分别是:
交点: [-2.8,-2]
交点: [6.8,6]
题目给定代码
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;
}
code:
#include<iostream>
#include<cmath>
using namespace std;
class Point{
protected:
double x;
double y;
public:
Point(double xx,double yy){
x=xx;
y=yy;
}
Point(){
x=0;
y=0;
}
double getX(){
return x;
}
double getY(){
return y;
}
void setX(double X){
x=X;
}
void setY(double Y){
y=Y;
}
friend ostream& operator <<(ostream &os,const Point &p){
os<<"["<<p.x<<","<<p.y<<"]"<<endl;
}
};
class Circle:public Point{
double R;
public:
Circle(double x,double y,double r):Point(x,y){
R=r;
}
setRadius(double RR){
R=RR;
}
double getRadius(){
return R;
}
int locate(Point t){
if(R*R==(t.getX()-x)*(t.getX()-x)+(t.getY()-y)*(t.getY()-y)){
return 0;
}else if(R*R>(t.getX()-x)*(t.getX()-x)+(t.getY()-y)*(t.getY()-y)){
return 1;
}else{
return -1;
}
}
void crossPoints(Point src,Point &cp1,Point &cp2){
double len=sqrt((src.getX()-x)*(src.getX()-x)+(src.getY()-y)*(src.getY()-y));
double x_add=R*abs(src.getX()-x)/len;
double y_add=R*abs(src.getY()-y)/len;
cp1.setX(x-x_add);
cp1.setY(y-y_add);
cp2.setX(x+x_add);
cp2.setY(y+y_add);
}
};
class Rectangle:public Point{
double width;
double height;
public:
Rectangle(double x,double y,double w,double h):Point(x,y){
width=w;
height=h;
}
int locate(Point t){
if((t.getX()>x+width)||(t.getX()<x-width)||(t.getY()>y+height)||(t.getY()<y-height)){
return -1;
}else if((t.getX()<x+width)&&(t.getX()>x-width)&&(t.getY()<y+height)&&(t.getY()>y-height)){
return 1;
}else{
return 0;
}
}
void crossPoints(Point src, Point& cp1, Point& cp2){
double len=sqrt((src.getX()-x)*(src.getX()-x)+(src.getY()-y)*(src.getY()-y));
double cos_=abs(src.getX()-x)/len;
double sin_=abs(src.getY()-y)/len;
double tan_=height/width;
if(abs(sin_/cos_)>tan_){
double x_add=height*abs(src.getX()-x)/abs(src.getY()-y);
cp1.setX(x-x_add);
cp2.setX(x+x_add);
if(sin_/cos_>0){
cp1.setY(y-height);
cp2.setY(y+height);
}else{
cp1.setY(y+height);
cp2.setY(y-height);
}
}else{
double y_add=width*abs(src.getY()-y)/abs(src.getX()-x);
cp1.setX(x-width);
cp2.setX(x+width);
if(sin_/cos_>0){
cp1.setY(y-y_add);
cp2.setY(y+y_add);
}else{
cp1.setY(y+y_add);
cp2.setY(y-y_add);
}
}
}
};
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;
}