專案
內容
所屬課設:北航2023年春軟體工程
班級部落格
作業要求:實現乙個能求解簡單幾何形狀之間交點的控制台程式。
作業要求
個人課程目標
學習乙個具備一定規模的軟體在生命週期中需要哪些工作,鍛鍊自己的團隊協作能力,並使自己具有開發乙個「好軟體」的能力
教學班級
006這個作業在哪個具體方面幫助我實現目標
提公升個人的軟體工程能力
專案位址
在開始實現程式之前,在下述 psp **記錄下你估計將在程式的各個模組的開發上耗費的時間。(0.5')psp2.1在你實現完程式之後,在下述 psp **記錄下你在程式的各個模組上實際花費的時間。(0.5')
personal software process stages
預估耗時(分鐘)
實際耗時(分鐘)
planning
計畫20
10estimate
估計這個任務需要多少時間
2010
development
開發630
510analysis
需求分析 (包括學習新技術)
6030
design spec
生成設計文件
4030
design review
設計複審 (和同事審核設計文件)00
coding standard
**規範 (為目前的開發制定合適的規範)
2020
design
具體設計
6080
coding
具體編碼
120150
code review
**複審
3020
test
測試(自我測試,修改**,提交修改)
6080
reporting
報告60
50test report
測試報告
2020
size measurement
計算工作量
1010
postmortem & process improvement plan
事後總結, 並提出過程改進計畫
3020
合計650
520在任務完成後回顧這個**,我發現我做得還算不錯,總體時間小於預估,但是debug的時間較長,這也是測試花費大量時間的原因。
因此,我先是在紙上進行了演算,直線和直線的交點很好推理,圓和圓的可以轉換圓和直線的交點,那麼我們求解的關鍵就是圓和直線的交點,因此我查閱了求解這個問題的相關資料,找到了解決辦法。
這部分完成的比較輕鬆,因為有物件導向的基本知識,所以在這到題中,我自然的設計了兩個類,圓和直線。
上圖是直線類的定義,我們可以看出,其中包含了確定直線的兩個點的座標,以及乙個用來求解直線和直線交點的函式。
上圖是圓類的定義,其中包含圓的中心點和半徑,此外,還有計算垂足,計算直線到圓的距離以及求解圓和直線交點以及圓和圓交點的函式,單元測試中我主要測試了各種型別的直線之間交點的例子。
這個過程經歷了兩個階段:
使用set存放pair作為資料結構,利用set的不重複性來求解。
使用vector存放pair作為資料結構,最後對vector進行去重。
上面兩張圖是我們階段1分別用隨機生成的1000條直線(約50w交點)和3000條直線(約450w交點)測試cpu的截圖,從中我們可以看出,隨著交點個數以近$n^2$的比例增長,時間也大幅度的增長。
上圖是3000條指令是對應的時間消耗佔比,我們可看出,對set的操作花費了大量的時間。以下是其中消耗時間最長的函式:
第二個階段我們改用vector之後,用相同3000條資料測試的效果圖見上圖,從中可以看出,我們的cpu時間不僅獲得了僅10s的縮減,瓶頸部分也發生了轉變。
bool line::intersect(line line2, vector>& intersections)
這個函式就是我們上一小節中改進後的瓶頸函式,但也是我們程式中最核心的部分。我先是在紙上對兩個點確立的直線方程進行了推導,其實就是將兩個形如$y = kx + b$的方程聯立,直接得到上述**中的結果。
int circle::intersectline(line line1, vector>& intersections)
pairfoot = getfoot(line1);
if (distance == r)
double length = sqrt(r*r - distance*distance);
if (line1.x1 == line1.x2)
else
return 2;
}
可以看出,我們先是進行了直線和圓心距離的計算,然後根據計算的結果決定兩者之間的關係。其中對一種較為特殊的情況進行了討論,即直線與y軸平行,這種情況下直線的斜率不存在,無法根據斜率進行計算。
int circle::intersectcircle(circle circle2, vector>& intersections)
else if(circle2.c2 == c2)
else
}
這個函式中我們先對圓之間的關係進行了判斷,相離和內含的情況去掉後,只保留有交點的情況,我們知道圓和圓的方程直接做差就是交點連線的方程,我特判了其中的兩種情況,圓心連線平行和垂直於y軸的情況。然後我們利用推導出來的公式從連線上取兩個特殊的點,就確定了這條直線,然後求解已知圓和直線的交點方程即可。
這部分我主要對直線間交點的正確性進行了測量,10個測試樣例覆蓋了直線相交的各種情況,一條直線、兩條平行線、兩條相交線、三條平行線、三條直線乙個交點、三條直線兩個交點、三條直線兩兩相交、四條直線五個交點、四條直線六個交點等多種多樣直線間可能的相互關係進行了測試,一小見大,通過保證各種數量較少的直線的正確性來保證程式能正確處理多條直線間的情況。
不足之處在於圓圓之間、圓和直線之間的測試並未通過單元測試進行。
個人專案作業
個人專案位址 需求分析 求解數獨 gui設計 可選 如果能夠較好的完成前兩部分再來考慮gui 相關思路 檔案輸入輸出 以下是優化後的cpu使用率s。生成1000,000個數獨終局需要4分10s,雖然還是很慢,但是比最開始已經好了很多。求解1000個數獨花費的時間約為38s,檔案輸入輸出更改後速度也提...
個人專案作業
題目描述 wc 專案要求 wc.exe 是乙個常見的工具,它能統計文字檔案的字元數 單詞數和行數。這個專案要求寫乙個命令列程式,模仿已有wc.exe 的功能,並加以擴充,給出某程式語言原始檔的字元數 單詞數和行數。實現乙個統計程式,它能正確統計程式檔案中的字元數 單詞數 行數,以及還具備其他擴充套件...
個人專案作業
psp2.1 personal software process stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫 estimate 估計這個任務需要多少時間 440500 development 開發 analysis 需求分析 包括學習新技術 3030 design spec...