C++实验---又是形状!

又是形状!

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;
}

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/115359207