個人項目作業
教學班級:006
項目位址:https://github.com/mjjm3/Intersect.git
PSP 表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | · 估計這個任務需要多少時間 | 440 | 500 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 30 | |
· Design Spec | · 生成設計文檔 | 60 | |
· Design Review | · 設計複審 (和同僚稽核設計文檔) | ||
· Coding Standard | · 代碼規範 (為目前的開發制定合适的規範) | 20 | |
· Design | · 具體設計 | ||
· Coding | · 具體編碼 | 180 | 200 |
· Code Review | · 代碼複審 | ||
· Test | · 測試(自我測試,修改代碼,送出修改) | 40 | |
Reporting | 報告 | ||
· Test Report | · 測試報告 | ||
· Size Measurement | · 計算工作量 | 10 | |
· Postmortem & Process Improvement Plan | · 事後總結, 并提出過程改進計劃 | ||
合計 |
解題思路
題目的基本要求是給定N條直線,輸出這些直線之間的交點的個數。首先的想法就是把這些直線兩兩組合,計算交點,計算交點的方法是把直線表示為ax+by+c = 0的形式,聯立方程求解,如果有交點就把這個交點放入集合裡面,最後輸出集合的大小。這種做法的複雜度為O(N^2), 目前沒有想到更好的做法。
附加要求是添加了圓形,輸出所有交點的個數,想法依然是兩兩組合求交點,隻需要添加計算圓與圓、圓與直線的交點的函數。圓表示為(x + c)^2 + (y + d)^2 = r^2。
設計實作過程
設計
我一共設計了Point,Line,Circle三個類,Line的構造函數傳入兩個Point對象,Circle的構造函數傳入一個Point對象和double類型的半徑r。Line内部有計算Line和Line之間,Line和Circle之間交點的static函數,Circle内部有計算Circle和Circle之間交點的static函數,傳回值均為Point對象。
單元測試
單元測試主要測試三個static函數。測試用例考慮了兩條平行直線,平行于y軸的直線,直線與圓相切,圓與圓相切等情況。

程式性能改進
程式中消耗最大的函數為計算兩條直線的交點的函數。目前沒有想到比較好的改進方法。
代碼說明
程式的整體結構。
程式中用來統計交點個數的資料結構,unordered_set。
重載操作符,用于unordered_set判斷兩個point是否相同。
Point的hash函數,也是用于unordered_set。
用于計算兩直線交點的函數,直線被表示為ax+by+c=0 的形式,傳回值為Point對象。