/*
* Copyright (c) 2014, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:呼亚萍
* 完成日期:2015年5月27日
* 版 本 号:v1.0
*
* 问题描述: 与圆心相连的直线:给定一点p,其与圆心相连成的直线,会和圆有两个交点,如图。在上面定义的Point(点)类和Circle(圆)类基础上,设计一种方案,输出这两点的坐标。
* 程序输入:相应的程序
* 程序输出:对应得结果
*/
#include<iostream>
#include<cmath>
using namespace std;
class Circle;//在Point类中引用,所以提前注明
class Point
{
public:
Point()
{
x=0;
y=0;
}
Point(double a,double b):x(a),y(b) {}
friend ostream& operator<<(ostream&,Point&);
friend void crossover_point(Point&p,Circle&c,Point&p1,Point&p2);
protected:
double x;
double y;
};
ostream& operator<<(ostream&output,Point&p)
{
output<<"("<<p.x<<","<<p.y<<")";
return output;
}
class Circle:public Point
{
public:
Circle(double a=0,double b=0,double r=0):Point(a,b),radius(r) {}
friend ostream& operator<<(ostream&,Circle&);
friend void crossover_point(Point&p,Circle&c,Point&p1,Point&p2);//求交点的友员函数
private:
double radius;
};
ostream& operator<<(ostream&output,Circle&c)
{
output<<"("<<c.x<<","<<c.y<<")";
cout<<"r="<<c.radius;
return output;
}
void crossover_point(Point&p,Circle&c,Point&p1,Point&p2)
{
p1.x = (c.x + sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));
p2.x = (c.x - sqrt(c.radius*c.radius/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));
p1.y = (p.y + (p1.x -p.x)*(c.y-p.y)/(c.x-p.x));
p2.y = (p.y + (p2.x -p.x)*(c.y-p.y)/(c.x-p.x));
}
int main( )
{
Circle c1(3,2,4);
Point p1(1,1),p2,p3;
crossover_point(p1,c1, p2, p3);
cout<<"点p1: "<<p1<<endl;
cout<<"与圆c1: "<<c1<<endl;
cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;
cout<<"交点1: "<<p2<<endl;
cout<<"交点2: "<<p3<<endl;
return 0;
}
运算结果:
知识点总结:
与数学结合,类的派生,求点与圆心连线与圆的两个交点!
学习心得:
将其他学科与c++联系起来学习!