項目 | 内容 |
---|---|
這個作業屬于哪個課程/ | 2020年春季計算機學院軟體工程(羅傑 任健) |
這個作業的要求在哪裡? | 個人項目作業 |
教學班級 | 006 |
項目GitHub位址 | Line |
PSP表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | · 估計這個任務需要多少時間 | 20 | |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 30 | |
· Design Spec | · 生成設計文檔 | ||
· Design Review | · 設計複審 (和同僚稽核設計文檔) | 10 | 5 |
· Coding Standard | · 代碼規範 (為目前的開發制定合适的規範) | ||
· Design | · 具體設計 | 60 | |
· Coding | · 具體編碼 | 120 | |
· Code Review | · 代碼複審 | ||
· Test | · 測試(自我測試,修改代碼,送出修改) | 360 | |
Reporting | 報告 | ||
· Test Report | · 測試報告 | ||
· Size Measurement | · 計算工作量 | ||
· Postmortem & Process Improvement Plan | · 事後總結, 并提出過程改進計劃 | ||
合計 | 490 | 725 |
解題思路
基礎部分
直線可表示為 y = kx + b, 當直線垂直于x軸時(k不存在),要進行差別讨論。其中的k,b都可以通過分數的形式表示,經過換件多項式可以得出,兩直線的交點可以使用分數表示,這樣完全不會丢失精度。
通過多項式計算可以用分數表示各個交點,這樣不用算除法也不會丢失精度。
可以使用pair<int, int>表示一個分數的分子分母。利用輾轉相除法化為最簡分數後,可直接進行比較。
其中,當k不存在時,pair的first(分母)為0,這時候就要分情況讨論,不能直接帶入公式。
互相平行的線沒有交點,不存在互相重疊的直線(根據題意可得)。
附加題
涉及到二次方程求解,無法繼續使用分數,于是将分數轉化為float精度的小數進行計算。
直線與直線相交,同基礎題。
圓與圓相交,求出兩圓的公共弦,轉化為線與圓相交。需注意圓與圓之間的位置關系(相離相切相交)
直線與圓相交,沒有捷徑可以走。老老實實帶入方程求解。需要注意的是判斷直線與圓有沒有交點、有幾個交點。
設計過程
設計了兩個類Line和Circle
Line中的K和B表示y = kx + b 中的參數。用pair<int, int>分數表示。
Circle中三個參數分别為圓心坐标和圓的半徑。
基本思想為:将Line和Circle存進兩個vector容器中,循環比較求出交點。再查找容器PointList,若此交點不在其中,則加入。
設計了三個函數來求交點:
Line_intersection() ;求線與線之間的交點
Circle_intersection();求圓與圓之間的交點
CirLine _intersection();求直線與圓之間的交點
詳細代碼說明在下面。
再基礎作業部分使用分數來進行計算,附加題部分涉及到開根,沒辦法進行分數表示。但為了不丢失基礎部分的精度,故在進行圓的計算時将直線部分的分數轉化為了浮點小數以便于計算。
由于時間問題,沒有過多考慮小數帶了的精度丢失。
代碼說明
直線與直線相交
其中特判了k分母為0的情況
圓與圓相交
轉換為直線與圓相交之前要判斷兩圓之間的位置關系
直線與圓相交
如下,帶入公式求解。
Code Quality Analysis
單元測試
代碼覆寫率測試
我使用了opencppcover插件來進行覆寫率測試,調試了好幾天也沒能解決無法運作了問題。期間還下載下傳了vs企業版,但仍不能成功運作代碼覆寫率測試。這樣導緻我沒法進行性能測試,這是個教訓。