第十二週項目四(3):點、圓的關係

問題及代碼:

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


運行結果:


學習心得:

計算交點的方程已知,不過用起來還是和想的不一樣,總有問題,看到賀老的,又學到一招,簡便。


發佈了262 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章