項目 | 內容 |
---|---|
這個作業屬於哪個課程 | 2020春季計算機學院軟件工程(羅傑 任健) |
這個作業的要求在哪里 | 個人項目作業 |
我在這個課程的目標是 | 進一步提高自己的編碼能力,工程能力 |
這個作業在哪個具體方面幫助我實現目標 | 學習c++,掌握測試方法,掌握軟件工程開發規范和相關工具的使用 |
其他參考文獻 | 博客1 |
教學班級 | 006 |
項目地址 | https://github.com/Michael-Steven/BUAA-software-engineering-personal-project.git |
一、寫在前面
本次作業內容比較簡單,比較適合軟件工程入門,由於之前沒有用c++寫過程序,所以這次寫起來不算是特別順利,出過很多玄學bug,不過借助搜索引擎的幫助,我的問題都解決了。通過這次作業我也正好入門了c++的面向對象機制,為以后的作業打下基礎。
下述 PSP 表格記錄了我在程序的各個模塊的開發上耗費的時間:
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | ||
· Estimate | · 估計這個任務需要多少時間 | 20 | 20 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 60 | 60 |
· Design Spec | · 生成設計文檔 | 30 | 50 |
· Design Review | · 設計復審 (和同事審核設計文檔) | 20 | 20 |
· Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 20 | 10 |
· Design | · 具體設計 | 30 | 30 |
· Coding | · 具體編碼 | 240 | 300 |
· Code Review | · 代碼復審 | 30 | 20 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180 | 240 |
Reporting | 報告 | ||
· Test Report | · 測試報告 | 50 | 30 |
· Size Measurement | · 計算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 10 | 10 |
合計 | 700 | 800 |
二、解題思路
拿到這個題之后,首先明白這是一道求交點的題,根據數學知識即可得出求交點的公式:
- 兩直線的交點:直接聯立兩個直線的方程即可得解;
- 直線與圓的交點:參考博客1,采用輔助線的方法進行求解,比直接聯立方程組求解簡單得多;
- 兩個圓的交點:將兩個圓的標准方程相減得到兩個圓交點所在直線的方程,然后根據直線與圓的交點算法進行求解。
三、實現過程
算法選擇
采用O(n^2)的算法,每新增一條直線或者一個圓,就和之前輸入的所有直線和圓進行交點計算,並存儲到相應容器中,最后統計存儲的交點數量。
類和方法的設計
本代碼共有4個類:
- Point:存儲交點坐標;
- Line:存儲直線方程的參數;
- get_line_line_intersect():求直線和直線交點
- get_line_circle_intersect():求直線和圓的交點
- Circle:存儲圓方程的參數;
- get_circle_line_intersect():求圓和直線的交點
- get_circle_circle_intersect():求圓和圓的交點
- Intersect:存儲所有直線、圓和交點。
- add_line():新增直線
- add_circle():新增圓
容器的選擇
采用STL中的Set存儲,Set中的Insert方法可以在插入新元素的同時自動去除重復的元素,由於本次作業的交點是浮點數,所以在代碼中重載了Set中的<運算符,在進行浮點數比較時忽略極小的數值差異,達到去重的目的。
單元測試
對於以下每種情況分別手動編寫測試數據:
- 多個直線相交於一個點;
- 直線和圓相切;
- 圓和圓內切/外切;
- 多個圓相交於一個點;
- 一條直線和多個圓相交於一點;
- 多條直線和一個圓相交於一點;
- 其他普通情況。
四、性能改進
本次作業我在算法上沒有什么改進的地方,主要是一些細節的改善,比如減少重復的函數調用等等。
性能分析
Code Quality Analysis工具分析
五、關鍵代碼
直線和直線的交點
這里是直接套公式計算交點坐標並存儲在intersect中。
直線和圓的交點
直接翻譯上面提到的算法就可以,這里要注意的是,答案可能是兩個相同的點也可能是兩個不同的點,由於Set有去重的功能,這里統一按兩個不同點的情況來計算。
圓和圓的交點
在計算出交點連線的方程后直接調用直線和圓的交點方法即可。