Voronoi Diagram 4:結論與心得

 陸、結論與心得

ㄧ、第一支GUI程式

這份學期專案是我第一支完整的GUI程式,我選擇使用C++並搭配Qt框架來做開發。會想選擇C++是因為我比較熟悉C++,且想要擴展C++在GUI這塊的技能樹。雖然實驗室有些同學說用C++寫GUI會較難,但我實際的經驗是,其實我花比較多的時間在熟悉Qt框架,通常遇到的問題都是對Qt套件的不熟習而造成的bug。

例如:Qt有<QString>套件,其中QString -> C++ string時,macOS和Win10所用的函數是不同的。因此導致我在macOS測試程式時是正常,但在Win10測試時就發生字串變亂碼的問題。macOS可以使用toStdString()或toUtf8(),而Win10則要使用toLocal8Bit()。

Qt官方的文件非常完整,且網路上有不少英文的討論文章可以參考,所以我遇到的Qt問題,大多去網路上找都可以找到相對的解法。由於C++對於型別非常要求,所以我也很重視函數的參數與回傳值型態,這方面Qt官方文件整理的非常清楚。

整體來說,使用Qt for C++來開發GUI的資源是充足的,且Qt支援跨平台開發。我自己就是在macOS開發、測試與部署程式,同時也在Win10測試與部署,跨平台也是我選擇Qt for C++的原因之一。然後使用Qt部署程式也是蠻簡單的,只要下1個指令,Qt自動幫你打包一些必要的檔案。

二、撰寫過程

(一)介面

Qt自己有專屬的IDE叫Qt Creator,UI的部分只要在Qt Creator用圖形化介面拉一拉,基本介面就形成了!一些比較客製化的介面,再使用程式碼的方式設定即可完成,因此不需要所有介面都自己手刻。

(二)資料結構

本專案中,所使用的資料結構幾乎都是我自己手刻的,Qt其實也有提供點、邊、多邊形等類別。由於我對Qt套件不熟習,所以我就自己刻一個,也順便學習建構類別與使用繼承機制。後來我覺得,我應該要善用Qt的類別,去繼承Qt類別,來客製化一個新類別會比較省事

我的畫布類別 (DiagramScene),就是去繼承Qt <QGraphicsScene>,這樣的方法就省事很多。除了省事外,我選擇繼承還有一個重要的理由,就是Qt的滑鼠事件是使用多型的方式去實作的。因此我如果想要在我的畫布中使用滑鼠事件的話,我必須要自定一個新類別並繼承<QGraphicsScene>,然後我在新類別中override滑鼠事件的虛擬函數,這樣我的畫布就可以觸發滑鼠事件,這一經驗也讓我體會到多型的強大

(三)演算法

真正卡最久的部分其實不是學習Qt,也不是建構資料結構,而是實作演算法。原本在解3點時,我想將之分割成2點和1點,然後合併起來,但一直寫都發現畫出來的Voronoi是錯誤的,之後學長跟我說3點直接當成終止條件並用暴力法解它就好,之後就先算出外心,然後畫中垂線,就順利解決3點的情況。

4點以上就會遇到合併問題,而合併有3個步驟要做,分別為找上下切線、找hyperplane與消線。找上下切線涉及到convex hull問題,而convex hull問題有很多解法被提出,所以這部分有不少現成演算法可以參考。反而找hyperplane與消線這2步驟,一直都沒有想到什麼好的且正確的演算法,這2步我卡很久,直到現在所設計出來的演算法都是有bug的

三、總結

這份學期專案是我第一支完整的GUI程式,且C++是我2021年初才剛學的程式語言,現在是2021年底,所以我學習C++的時間快滿一年。這份學期專案也算是我學習C++一週年的里程碑,所以意義重大。這份學期專案也運用了很多物件導向程設的觀念,舉凡:封裝、繼承、多型,並且盡可能切割函數與重複使用函數,所以這份學期專案能夠體現我目前對物件導向程設的熟習程度,以及演算法的實作能力。我對於目前能有這樣的學習表現,算很滿意,希望下個週年,能夠更精進物件導向程設與實作演算法的能力。


留言