peienwu
Mon, Aug 23, 2021 12:06 PM
2020資訊之芽
2021暑期筆記
計算幾何
計算幾何:「以數學方式精確與高效的計算出幾何結構與其屬性的嚴謹應用」。我們可以延伸解決n維的幾何問題,但這篇討論的範圍都是二維平面上的幾何。
計算幾何最重要的莫過於座標上的點,實作方式可以用 或是自己定義一個類別,將點的資訊以及相關的運算式定義出來。我們總共需要重載點的大於、等於、小於的運算子,以及加法減法、向量外積內積等,同時還有很多功能是可以繼續定義下去,例如向量乘上一個定值,可以繼續加入類別中。
以上是預設點的x座標y座標都是整數的情況,如果要改成使用自定義型別,可以改用樣板(Template)自定義資料型別,根據題目的要求,使用整數或是浮點數進行運算。
針對 以及 外積的結果,可以知道兩者之間相對的方向。如果 和 共線,則回傳0, 轉向 如果是順時針則回傳1,其餘回傳-1。
以下函式可以判斷點o是否在 上,首先利用外積是否為0判斷是 與 是否平行;接著以內積判斷是否在線段中,而非線段的兩側(平行的條件下內積只可能是1或是-1)。
以下函式為給定四個點,判斷 是否相交於 。首先是特例的判斷,線段的其中一端點在另一線段上,利用上方點與線段關係的函式完成這個判斷。
特例判斷完成之後,我們需要用到上方方向函式判斷線段兩端點是否在另一條線段的異側,即以下的關係式:
我們要檢查兩條線段,其相乘結果必須皆為負數,表示處於線段的異側!最後是平行線的判斷,如果兩線平行且相交,表示兩線共線,這可以在特例時就被判斷出來。
在進行全點對線段共線問題的判斷時,使用極角排序通常會比單純暴力枚舉更快速。極角也就是極座標中每一個跟原點的夾角。如果兩個點位在左半平與右半平面,則先將其判斷出來,如此才能確定起始的角度為何。
如果位在同一個左右半平面,則透過外積的方式比較兩個向量的先後順序。以下程式碼是從座標平面270度的地方開始逆時針掃一圈依序經過的點。
首先先將所有點依照x座標進行排序,之後用掃描線由左而右的將符合要求的點推入維護的單調容器中,維護下凸包,接著利用reverse()函數將所有點逆序,也就是x座標由大到小讓掃描線由右而左掃過一遍,將上凸包也圍起來。時間複雜度為。
旋轉卡尺可以被應用在尋找最遠點對、面積最大三角形等問題。利用兩條平行的線中間夾著凸包,繞一圈的過程中更新需要求的數值。實作上來說就是使用兩個指針,分別指向旋轉卡尺的平行線所在的兩個點,依照旋轉的方向進行增減的動作!
計算幾何圍繞著幾個主軸,向量運算、內積、外積,利用它們進行角度、共線與否、距離等等的判斷。之前有稍微接觸過向量,不過內積與外積是第一次碰到的主題。
因為目前絕大部分的討論都是在二維平面上進行,因此以下都是以二維平面為前提所進行的討論!
內積跟 有關,因此主要可以幫助我們判斷線段是否垂直(等於零)、以及共線時點位於正向或是反向的判斷(等於正負一)。兩個向量 以及 的內積可以寫成以下關係式:
兩個向量做內積的正負號會跟餘弦函數的正負變化相同(如下圖),值域為 ,並且在 有最大最小值, 的值為零。
外積跟 有關,主要可以判斷兩向量方向關係(順逆時針旋轉)、是否平行、比較角度大小等。外積的應用十分廣泛,找凸包以及旋轉卡尺都會用到外積判斷兩個向量角度關係。兩個向量 以及 的外積可以寫成以下關係式:
用更簡單的方式理解外積 ,其正負值可以想像成 轉向 所經的劣弧順逆時鐘方向。順時針為正、逆時針為負。
關於外積的數值變化,與正弦函數的變化是一樣的(下圖),其值域跟內積一樣,不過最大最小值發生在 ,並在 時兩向量叉積為零。
這是一個從給定多邊形的座標推得面積的公式,寫成很多個三角形有向面積的總和。以下圖來說,、 、 的有向面積皆大於零,而 、 都會因為有向面積是負的(逆時針旋轉)而被扣除掉,運算的總和即是多邊形 的面積!
一般化的公式,多邊形上總共有 個點,令第 個點為第1個點(為了要繞一圈計算面積),多邊形面積為:
三角形面積有非常多算法,不過利用外積的公式還是第一次聽到。以下是公式推導過程:
先從高中三角函數的三角形公式開始:
將三角形其中一點對另外兩點的向量做外積,除以2即為三角形面積。這個公式會在旋轉卡尺的地方使用到!
根據上面三角形面積公式的推導,可以相對應得知道兩向量所夾平行四邊形面積公式:
題目敘述:
給你n個數字(0≤i<1,小數點精度到末九位),想知道到底有多少組 滿足 ,其中 可以重複。
這題其實跟計算幾何沒什麼關係,直接用unordered_map去做(有點像two sum,不過下面的code好像也不用開到multi),簡單!不過我在浮點數的地方吃了一些WA,最後算了直接改用字串處理這個惱人的東西XD
題目敘述:
給定平面上很多個點,求出有幾對線段等長(輸入有重複的點)。
既然n≤500,那就直接枚舉吧,沒啥特別難度。
題目敘述
給你平面上n個點,依序走訪每一個點,試問走訪過程中共執行幾次的左轉、右轉以及迴轉。
很特別,計算幾何讓電腦可以處理平常我們所看到的平面圖形,可以利用向量內積、外積等方式判斷方向。這一題最重要的就是方向函數。傳入3個點,方向函數會會回傳 的正負數值。
下圖為外積 的結果,當 的結果為負,也就是下圖的情況,從B走到A就需要往左邊走;反之亦然。
至於如何判斷當兩個向量的方向呈現一直線時,也就是外積回傳的值為0時(),應該是同向還是異向呢?這時候就需要搭配向量內積(這我想了很久),因為內積公式是,將兩個向量內積之後就可以很明確的判斷到底是朝原本的方向走,還是反方向的行走!
內積、外積公式
有一點數學,不過蠻有趣的。可以利用與達到計算角度的目的,利用兩者不同的值域,互相搭配,就可以更輕鬆的進行判斷!注意到外積的正負就代表著A到B是順時針或是逆時鐘。
方向函數
當我們要判斷方向的時候,會利用正弦函數,逆時針正、順時針為負進行判斷!
注意到此時在判斷是否為平行的時候(cross==0),使用到這個函數,目的是為了避免誤差而導致判斷錯誤,因此需要進行誤差的處理(其實不用也沒差啦,只是這樣嚴謹一點)
以下是AC Code:
題目連結
Submission
線段相交 = 線段香蕉,自動選字永遠都是香蕉,有點煩XDD
如何判斷兩線段是否相交?首先需要一個函數可以判斷點是否在一個線段上,如此一來就可以判斷端點在另一條線段上的特殊情況。以下程式碼為判斷點 是否在 上。利用向量外積可以判斷兩線段是否平行,而使用內積公式可以判斷是否在線段中,而非線段的兩側!
說明:由點指向a和b的向量必須呈現180度角(也就是異向),才可確保在ab線段中(跟a,b重合也算是跟ab線段相交)。
接下來是主要的部分,首先先確認4個端點是否恰好在另外一條線段上,判斷完之後就是處理一般相交的情況。若線段 與 相交,則點 與點 會在線段 的異側。用方向函數表示:。確認完兩個線段之後即完成線段相交的判斷!
由下圖可以得到上面的結論,當兩線段相交時,方向函數得到的值(用外積,也就是下圖 以及 )的方向),會呈現一正一負,從兩個相反的方向看同一條線段得出來的結論!
AC Code:
題目敘述
給定n個二維平面的點,找出位在凸包上的所有點的個數
最小凸多邊形 = 凸包,要找出能包住所有點的最小凸多邊形,簡稱凸包。聽說最好寫的凸包演算法是:Andrew's Monotone Chain,翻成中文叫做Andrew's 單調鍊?有一點單調+鍊的味道。下圖是我用照片合成起來的GIF,大致模擬出使用Andrew's Monotone Chain 找凸包的方法。
Andrew's Monotone Chain
這個演算法的時間複雜度是 ,空間複雜度 ,資料說它可以解決了凸包有重疊的點、共線的點、退化成線段和點的情況。它的名字叫做「單調鍊」,要維護一個有點像單調隊列的東西,對於在容器中第 個位置的點都滿足 ,如果有點做外積後的結果小於等於0,則它會被pop掉(這是依照上圖逆時針完成凸包的描述,如果方向相反則會變號)。
以下是此演算法的執行步驟:
一般會用一個vector儲存在凸包上面的點(不包含在邊上的點,只有位於轉折點的點),在頭尾的部分(x座標最大與最小)需要特別處理,讓每一個點最多近到vector一次。
實作細節
以下是確認是否需要將vector中元素pop出來的關鍵,對向量 做外積的結果,必須排除外積結果為0的情況,如果將0也納入,會造成一個點被push進去很多次,在數量和計算上出現問題。
等於的情況代表這些點會共線,因此如果題目要求要輸出所有凸包上的點,就必須在等號發生的情況也一併紀錄下去。對一個極端的多邊形來說(所有點都線線時),必須要處理去重的情況(用set完成),才不會有一個點被重複push進去的問題。
除此之外,上凸包在範圍限制上是需要注意的。假設x座標最大的點i,當在圍上凸包的過程中i是不可以被pop出去的,因此vector的大小必須大於下凸包的大小。
凸包使用第i-1跟第i個點的向量去看第i到第i+1個點的向量,決定一個點要不要被推入vector中。當我們逆序從x座標最大的點往前看時,要確保每一輪結束之後在i點後都必須要有至少一個點,設定hull.size() > down_hull的原因是防止在下凸包的點被圍上凸包的過程更新到。
以下是AC Code:
題目敘述
找出二維平面上n個點的凸包所圍出來的面積為何?
跟上一題類似,在找到全部在凸包上面的點後,就可以利用有向面積把凸包面積算出來,有一個公式可以計算多邊形面積,利用外積得到正負值,轉一圈後得到面積!對於多邊形的頂點 的面積如下:
其中最後一個點會回到起點,形成一個封閉的迴路。
以下是AC Code:
題目敘述
給你二維平面上n個點(n≤2400),每一個點座標皆不相同,求出總共可以圍出多少個三角形?
這是NEOJ上的加分題,好像是一個題組吧,反正總共有三題,這是第一題。如果 的枚舉,複雜度會爆炸(量級約),根據電神的說法,這一題要用極角排序以及雙指標找到共線,接著就可以利用排列組合把因為共線而不能形成三角形的組合扣掉,就是答案了。
這一題的核心概念是找共線,具體來說的作法是枚舉每一個點的同時,以它為原點對其他的點進行排序,如果遇到有相同的極角座標表示這些點共線,同時利用陣列cnt[x]統計共線點數為x的線段總共有幾條。
以下的GIF就是大致上程式執行的樣子。因為一條長度為x的線段會因為枚舉x次的關係,在最後扣掉的情況會重複x次因此需要除掉。
共線與三角形
一般情況下(任三點不共線),總共可以形成 個三角形,如果有一條m個點共線的情況下(其他點不共線),則可以形成的三角形數量就必須扣除共線限制的情況,變成 個三角形。
時間複雜度為:枚舉每一個點 ,極角排序 ,總時間複雜度
實作小細節
1. 維護共線連續區間
我們要想辦法讓有共線的點們所在位置是一個連續的位置。三個點共線可能為在對角線的象限中,也就是點差了180度,如此一來就沒辦法讓共線的點為在連續的區間。為了達到這個目的,我們將所有位於下半平面的點都移到上半平面(在上半平面找到有相同 值的位置),接著就能利用雙指針找極角座標排序後有相同極角的區間之最大值!
2. 特例判斷
如果有一點y座標為0但x座標為負,要將其移到x軸正向的地方,不能把這種情況涵蓋為一般情況,否則原本在x軸正向的點會被移到x軸負向,沒有達到預期的效果。
以下是AC Code:
題目敘述
共有n個二維平面上的格子點,這些點會形成簡單多邊形。試求或在簡單多邊形內部的格線總長(包括垂直與水平格線)。
這邊有一個不嚴謹的推導方式,不過他是正確的。令多邊形內部格線長度為S,多邊形的邊落在的格線長度為T,多邊形面積T,則有以下關係式:
詳細的公式推導可以可以參閱下圖,平行四邊形(斜線部分)內部垂直的格線長度為: 大矩形 扣掉左右上下共四個三角形兩兩拼成一個矩形 以及 ,還有左上右下兩個正方形 ,整理之後會發現其實跟面積是一樣的。對於垂直部分也是類似的情況。
好像隱約發現到面積與格線長度有十分密切的關係,算出面積,把在格線上的邊進行特判扣掉,就可以得到格線長度。
這一題我想了很久,一直看不出來關係式到底長怎樣,直到大神提點才發現原來有這樣的關係,我反應好遲鈍
以下是AC Code:
題目敘述
給你N(N≤1500)個座標平面上的點,請問總共可形成多少個直角三角形呢?
從極角排序後的第一個點開始逆時針進行雙指針的枚舉。這邊使用到一個很特別的手法,對於共線的情況我們先透過預處理的方式將共線的點合併起來,並用cnt[x]陣列紀錄第x個點是由幾個點所合併起來的,如此一來,在進行計算的時候就不會有共線要分別處理的問題(不需擔心是不是可以跟之前的點形成直角三角形,因為相同斜率的點已經被合併剩下一個),直接將數量相乘就可以知道直角三角形的數量!
時間複雜度:枚舉所有點 進行極角排序 以及雙指標,總時間複雜度為 。
實作小細節
雙指針進行枚舉的過程中,很有可能會指標指向的索引值會超出範圍。解決的方法有兩種:
以下是AC Code:
題目敘述
給你平面上N個點(N≤3000),請求出最遠點對的索引值(小的在前、大的在後)
我做了一份最近點對:不同複雜度之解決方式的筆記,共有四種方法可以解決那個問題,這一題要求的是最遠點對,作法與最近點對其實差蠻遠的。由上幾題知道凸包的求法,因為凸包是可以圍住所有點的多邊形,因此最遠點對也應該在凸包上,而且所在的位置會為在凸包的兩側上(如果不落在凸包上,一定可以把點向兩側延伸到凸包上,且移動過後的點對距離一定比原始的點對距離大)。
找完凸包之後,可以用旋轉卡尺的方式尋找最遠點對。想像兩條平行線中間夾著凸包,逆時鐘旋轉繞行凸包一圈,過程不斷更新最遠點對的距離。在實作上兩條平行線可以被想像成由 指向 的向量,透過外積三角形面積公式決定卡尺該如何移動。
以下圖為例,我們要找 為底可以形成的最大三角形面積的頂點,因為在同底的情況下面積就代表點與邊的垂直距離,最大的垂直距離意味著這條底邊可以垂直延伸的最遠距離。因為凸包必定是凸多邊形,因此三角形的面積會呈現單峰函數,因此只需要從下一個三角形面積的大小,決定雙指針中比較快的指標的移動情況。
如果仔細來看,以下圖為例,當前較快的指標指向的位置是 點,考慮一條與與 平行的直線,若下一個點 在平行線段的另外一側,則將指標移往 點。可能會有一個疑問,如果比較下圖的線段長度,會發現到 的長度比經過 點的兩條線段都還要長,那為何還要更新至 點?舉這個例子不太好,不過可以想像當旋轉卡尺轉到以 為底的時候,會將最遠點對的距離更新成 的長度。如果今天 的左側又多加了一個新點 ,則最遠點對會變成 的距離。
簡單來說,最遠點對一定會發生對角的凸包點上面,即使現在以 為底最遠點並非 而是 ,但在旋轉卡尺旋轉到 時就能將距離更新成 的距離。
實作小細節
這一題有點麻煩,因為他要輸出的是最遠點對的索引值,而不是最遠點對之間的距離。在尋找凸包的過程中,會對所有點進行排序,因此原有的索引值順序會被打亂,需要在一開始輸入的時後就好好維護每一個座標的索引值。
以下是AC Code:
題目敘述
請輸出在N個二維平面的座標,挑選3顆出來成組成三角形的最大面積
比較一下兩個複雜度的作法,第一個是使用 枚舉所有的點並計算面積,所需要的時間是0.4sec,而且需要特別注意不能使用到海龍公式計算面積,否則有很大的機會會超時。
以下作法是先進行 找尋凸包,因為面積最大的三角形必定三個點都在凸包上,因此用 的時間進行枚舉,旋轉卡尺(類似最遠點對的作法)找面積最大的第三個點,就能在總時間複雜度 完成!(會再更少,因為只要枚舉凸包上的點)
以下是AC Code:
題目敘述
平面上n個點找最近點對的距離
最近點對真的有超多種作法的,枚舉、掃描線、分治、隨機都可以做!這邊有一篇筆記比較各種時間複雜度的最近點對作法,這邊不多做贅述!
以下程式碼是掃描線演算法,最差情況下的時間複雜度是 ,因為需要排序,所以下限為 !
題目敘述
一個國家有 n 個安全哨,每一個都有座標 ,代表在座標軸上的位置。輸出該國安全哨所能圍出的最大領土。
n個點所能圍成的最大面積,其實等價於凸包的面積。與前幾題的最小凸多邊形是一模一樣的題目!
題目敘述
n個點圍成的多邊形,求面積
水題,直接套行列式公式即可算出答案!
題目連結TIOJ
TIOJ Submission
題目連結ZJ
題目敘述
間單來說是求出多邊形面積以及凸包面積的差,詳細可以點上面題目連結。
題目說多邊形需要才剪下的面積,我們就算凸包面積以及多邊形面積,兩者的差去除上題目給的色塊面積即是答案!
題目敘述
有一個三角形工廠有一個很大的問題。給你一些邊的邊長,想辦法找出用這些邊長圍出最大的三角形。
根據海龍公式,三角形面積:
可以利用貪婪法,將所有邊長由大到小進行排序,每一次拿最大的三個邊長進行枚舉,即可算出最大的三角形面積。不難理解,當換上一個比較大的邊,算出來的s也會比較大,跟邊相減的值也會比較大,總面積自然較大(好啦,這是非常不嚴謹的證明XD)
在想題過程中,我有思考到,如果周長一樣的情況下,到底何種面積的三角形面積會比較大?答案是正三角形!
三角形周長固定下面積的比較
根據海龍公式:
想要比較在周長固定下三角形的面積,可以用算幾不等式比較,因為 是定值,所以可以列出以下式子:
等好成立時,。因為,因此:
得到海龍公式
以下是使用貪婪法的AC Code:
題意:給你平面上n個矩形,請求出它們覆蓋的總表面積。
這一題所使用的技巧是掃描線以及線段樹,下圖中的水平藍色線即為掃描線,由y=0開始往上掃描,當遇到了矩形的邊,利用線段樹查詢區間內當前的矩形寬度,乘上兩掃描線的高度差即為面積。當然,掃描線也可以使用垂直方向的線段由左而右的掃描,實作細節是一樣的。
我們可以定義線段樹為區間中有被矩形覆蓋的大小有多大,也就是圖中當前掃描線對應到的區域的寬度。這樣子維護有一個問題,當我們直接用儲存答案,我們在修改的時候沒有辦法確切知道這段區間被覆蓋的情況。
下圖為一種模擬的情況,每一個區間的數字代表著非0的數字個數,也就是它的寬度。今天我們要對區間加減值,將區間拆成跟,這時候區間的數值是1,我們卻不知道到底是3還是4是有被覆蓋到的,必須要遞迴下去到葉節點才能得到完整的覆蓋情況,這時候每一次加減值的複雜就會提升到,因此不能以這種方式維護。
有別於第一種方法對進行維護,我們可以多開一個區間 來紀錄被矩形覆蓋的情況。下圖有3個矩形,其中的數字代表每一塊區域被覆蓋的情況,這邊使用了來紀錄(他是附在區間上的,不會像圖中一樣的方式呈現)。tag的數值為非負整數,紀錄當前區間有多少矩形覆蓋在上面,用來輔助維護可以在的時間進行修改與查詢。
以下程式碼是是 的轉移,當大的區間的tag值不為0,代表有一個矩形曾完整覆蓋這個區間,這時候可以直接回傳區間大小,否則即回傳左右節點的的數值。
這邊定義為:「考慮 id 的子孫們(不含 id 本身)的所有 tag 值,假設這些子孫只有被tag值作用過,共有多少非0的數字」。
首先是維護矩形的方法。我們一個矩形總共要維護四個東西:矩形左界x1、矩形右界x2、矩形上下界的y座標(分上下兩條),這兩條邊是下界或是上界val。為什麼要水平方向要分兩條討論?是因為下界代表進入,當掃描線掃到這一條邊的時候表示我們要新增區間 進入線段樹;反之如果掃到了上界,則表示離開這個矩形,在線段樹中扣掉區間 。
上下界我們利用val維護,當 時表示是矩形的下界; 則是矩形上界,這兩個搭配在一起剛好就可以用線段樹區間加值的方式進行操作!總共有 個矩形,因此我們要掃描線總共掃描 條線段。
一樣對值域(這題是1000000)的4倍開了線段樹,同時維護一個非負整數 表示區間被覆蓋的情況。當每一次修改完成之後,我們可以直接取用根節點 的數值表示寬度(非0的個數)!
接下來就是在程式執行的過程中將 條邊依照y座標進行排序 ,接著依序使用掃描線搭配線段樹的修改,計算矩形的面積。最後就是輸出加起來的答案。
Debug 小錯誤
Submission1:WA
可以看到有一筆測資過不了,95分QQQ
後來debug之後發現到,因為我是對每一個矩形先輸入下界之後才是上界,當我在排序的過程中,上界有可能有機會跑到下界之前,造成 被扣到負的情況,但在定義中可以清楚知道 是非負整數造成錯誤。因此只要把排序的過程改成 stable_sort() 即可!
最後終於是程式碼的部分,以下:
給你三個點 ,判斷出向量 之於 的方向為何?
關係共有相交、位於左側以及位於右側。
給你兩條線段,判斷他們是否相交。線段相交裸題。
給你N個點,計算出此多邊形圍成的面積為何。帶入行列式公式可解。
給你N個點構成的一個簡單多邊形,判斷一個點是否在多邊形內部。
參考資料:greekforgreek
凸多邊形的情況,我們可以利用內角和是360度轉一圈的的方法,判斷一點是否在多邊形內部。但本題是簡單多邊形,因此用這種方法是不可行的。
這張圖是作法,我們做出一個由x點出發向x軸正向的射線,計算這一條射線跟多邊形共有幾個交點。如果是奇數,表示在內部;反之則是在外部。交在多邊形上的點要特別注意,因為他可能會被統計到兩次,因此我們特別處理當點相交一點時,只計算那條邊的兩端點中,y座標比較大的那一點是否相交的情況。
最後,我們發現遇上如圖中g點的狀況直接就被處理好了!他會被算到零次,因為在看兩條邊加上去之後,又因為頂點是y座標比較大的,會被剪掉兩次。
給定頂點座標均是整點(或正方形格子點)的簡單多邊形,皮克定理說明了其面積 和內部格點數目 、邊上格點數目 的關係:
最近點對問題。不過,既然是計算幾何,我們就用掃描線做最近點對。掃描線有兩個做法(可以參考那個連結),至於搭配set輔助步驟就是:
凸包裸題。
Leetcode 總共有27題的tag是計算幾何的,題單在這裡。有三題被鎖起來不能看,所以總共有24題。
直接Random半徑會出事(可能不夠亂,或是半徑太小),如果random面積之後算半徑才OK。
三種不同的投影對應到三種不同的角度看圖形。x-y的面積即為由上而下看有方格的個數。x-z是從前方看,因此對應到的是每一行的最大方塊個數。
這一題是模擬退火,非常酷,之前沒有寫過的東西。
換另外一種迭代方式
把圖形考慮成一張圖,符合條件的就增加一條有向邊,接著對每一個點做一次DFS即可。時間 。
計算幾何,顧名思義就是在電腦完成幾何的運算,要怎麼把平面的東西轉化成電腦看得懂的東西就是計算幾何在做的事情。常常我們覺得很容易判斷的事情,例如判斷線段是否相交,我們可以利用肉眼直輕易判斷出來,因為我們有強大的空間感幫助我們進行判斷,但換作是電腦就必須用一些數學的技巧,對於不同的情況做各自的判斷,才能讓電腦正確回答兩條線段的相交情形。
除此之外,在寫題過程中,使用到ggb進行輔助,讓我可以對程式的執行過程有更是覺化的概念,也幫助我在解題時能更理解解題的策略!上面一題三角形個數的判斷,就使用了ggb判定將點搬移的所有情況。利用它我抓到了當點的y座標為零時並沒進行好特殊情況的判斷,這也是一個視覺化之後的好處!
有一題沒有做的是模擬退火的題目實作,要求圓與三角形的交集面積,感覺超級複雜,以後有時間來慢慢實作!