BUAA2020軟工作業(三)——個人項目


項目 內容
這個作業屬於哪個課程 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有去重的功能,這里統一按兩個不同點的情況來計算。

圓和圓的交點

在計算出交點連線的方程后直接調用直線和圓的交點方法即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM