天天看點

個人項目作業

個人項目作業

教學班級: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對象。