#include<iostream>
#include<Cmath>
#include<iomanip>
using namespace std;
class Point
{
public:
Point(){x = 0; y = 0;}
Point(double x0,double y0) {x = x0; y = y0;}
~Point(){}
double getx(){return x;}
double gety(){return y;}
friend ostream & operator << (ostream &, Point &);
double x, y;
};
class Circle: public Point
{
public:
Circle(){radii = 0;}
Circle(double x0, double y0, double r);
~Circle(){};
friend int locate(Point p1, Circle c1);
double Length(Point p1, Point p2);
friend ostream & operator << (ostream &, Circle &);
friend bool operator > (Circle & c1, Circle & c2);
friend bool operator < (Circle & c1, Circle & c2);
friend bool operator >= (Circle & c1, Circle & c2);
friend bool operator <= (Circle & c1, Circle & c2);
friend bool operator == (Circle & c1, Circle & c2);
friend bool operator != (Circle & c1, Circle & c2);
friend void crossover_point1(Point & p1, Circle & c1, Point & p4, Point & p5);
protected:
double radii;
};
Circle::Circle(double x0, double y0, double r):Point(x0, y0),radii(r){}
void crossover_point1(Point & p1, Circle & c1, Point & p4, Point & p5)
{
double x0 = (c1.x - p1.x) * c1.radii / sqrt((c1.x - p1.x) * (c1.x - p1.x) + (c1.y - p1.y) * (c1.y - p1.y));
double y0 = (c1.y - p1.y) * c1.radii / sqrt((c1.x - p1.x) * (c1.x - p1.x) + (c1.y - p1.y) * (c1.y - p1.y));
p4.x = c1.x + x0;
p4.y = c1.y + y0;
p5.x = c1.x - x0;
p5.y = c1.y - y0;
}
int locate(Point p1, Circle c1)
{
double length = sqrt((p1.x - c1.x) * (p1.x - c1.x) + (p1.y - c1.y) * (p1.y - c1.y));
if(length < c1.radii)
{
return 1;
}
else if(length == c1.radii)
{
return 0;
}
else
{
return -1;
}
}
ostream & operator << (ostream & out, Point & p)
{
out << "(" << p.x << "," << p.y << ")" << endl;
return out;
}
ostream & operator << (ostream & out, Circle & c)
{
out << "以" << "(" << c.x << "," << c.y << ")为圆心," << "半径为 " << c.radii << "的圆 " << endl;
return out;
}
bool operator > (Circle & c1, Circle & c2)
{
if(c1.radii > c2.radii)
{
return true;
}
else
{
return false;
}
}
bool operator < (Circle & c1, Circle & c2)
{
if(c1.radii < c2.radii)
{
return true;
}
else
{
return false;
}
}
bool operator >= (Circle & c1, Circle & c2)
{
if(c1.radii >= c2.radii)
{
return true;
}
else
{
return false;
}
}
bool operator <= (Circle & c1, Circle & c2)
{
if(c1.radii <= c2.radii)
{
return true;
}
else
{
return false;
}
}
bool operator == (Circle & c1, Circle & c2)
{
if(c1.radii == c2.radii)
{
return true;
}
else
{
return false;
}
}
bool operator != (Circle & c1, Circle & c2)
{
if(c1.radii != c2.radii)
{
return true;
}
else
{
return false;
}
}
int main( )
{
Circle c1(3, 2, 4), c2(4, 5, 5); //c2应该大于c1
Point p1(1, 1), p2(3, -2), p3(7, 3); //分别位于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 << endl;
cout << "圆c1: " << c1;
if(c1 > c2)
{
cout << "大于" << endl;
}
if(c1 < c2)
{
cout << "小于" << endl;
}
if(c1 >= c2)
{
cout << "大于等于" << endl;
}
if(c1 <= c2)
{
cout << "小于等于" << endl;
}
if(c1 == c2)
{
cout << "等于" << endl;
}
if(c1 != c2)
{
cout << "不等于" << endl;
}
cout << "圆c2: " << c2;
cout << endl;
Point p4, p5;
crossover_point1(p1, c1, p4, p5);
cout << "点p1: " << p1;
cout << "与圆c1: " << c1;
cout << "的圆心相连,与圆交于两点,分别是:" << endl;
cout << "交点: " << p4;
cout << "交点: " << p5;
cout << endl;
system("pause");
return 0;
}
圆c1: 以(3,2)为圆心,半径为 4的圆
点p1: (1,1)
点p1在圆c1之外
点p2: (3,-2)
点p2在圆c1之上
点p3: (7,3)
点p3在圆c1之内
圆c1: 以(3,2)为圆心,半径为 4的圆
小于
小于等于
不等于
圆c2: 以(4,5)为圆心,半径为 5的圆
点p1: (1,1)
与圆c1: 以(3,2)为圆心,半径为 4的圆
的圆心相连,与圆交于两点,分别是:
交点: (6.57771,3.78885)
交点: (-0.577709,0.211146)
请按任意键继续. . .