問題及代碼:
/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*文件名稱: 點、圓的關係 .cpp
*作 者:白雲飛
*完成日期:2015年5月23日
*版 本 號:v1.0
*
*問題描述:(1)先建立一個Point(點)類,包含數據成員x,y(座標點);
(2)以Point爲基類,派生出一個Circle(圓)類,增加數據成員(半徑),基類的成員表示圓心;
(3)編寫上述兩類中的構造、析構函數及必要運算符重載函數(本項目主要是輸入輸出);
(4)與圓心相連的直線:給定一點p,其與圓心相連成的直線,會和圓有兩個交點,如圖。在上面定義的Point(點)類和Circle(圓)類基礎上,設計一種方案,輸出這兩點的座標。
*程序輸入:座標
*程序輸出:圓與直線的交點座標
*/
#include <iostream>
#include<cmath>
using namespace std;
class Circle;
class Point
{
protected:
double x;
double y;
public:
Point(double a=0,double b=0):x(a),y(b) {}
friend ostream & operator<<(ostream &,const Point &);
friend void intersection_point(Point &p, Circle &c, Point &p1,Point &p2 );
};
ostream & operator<<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]";
return output;
}
class Circle:public Point
{
protected:
double radius;
public:
Circle(double a=0,double b=0,double r=0):Point(a,b),radius(r) {}
friend ostream &operator<<(ostream &,const Circle &);
friend void intersection_point(Point &p, Circle &c, Point &p1,Point &p2 );
};
ostream &operator<<(ostream &output,const Circle &c)
{
output<<"(圓心=["<<c.x<<", "<<c.y<<"], r="<<c.radius<<")";
return output;
}
void intersection_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 c(2,2,2);
Point p(0,0),p1,p2;
intersection_point(p,c, p1, p2);
cout<<"p點:"<<p<<endl;
cout<<"圓c:"<<c<<endl;
cout<<"p點與圓c圓心的連線交圓c於p1與p2兩點"<<endl;
cout<<"p1:"<<p1<<endl;
cout<<"p2:"<<p2<<endl;
return 0;
}
運行結果:
學習心得:
計算交點的方程已知,不過用起來還是和想的不一樣,總有問題,看到賀老的,又學到一招,簡便。