計算幾何筆記01
阿新 • • 發佈:2020-08-06
01
A
什麼是凸包?
NailslnTheTable
PaintBlending
ColorSpace
ConvexHull:所有分量總和為100%且非負。
B
Extremity(極性)
極點(Extreme Point):在一組點中,沿著這個點座直線,必然能找到一條直線,使得其他所有點都在該直線的一側。
Strategy
將問題轉化為如何在所有點中鑑別極點和非極點。
判斷一個點是否會被包含於另外三個點所確定的三角形內部。如果是則不是極點。
In-Triangle Test
虛擬碼:
Mark all points of S as EXTREME
for each triangle \(\Delta (p, q, r)\)
for each \(s\in S\\ \{p, q, r\}\)
If \(s \in \Delta(p, q, r)\) then
mark s as NON_EXTREME
void extremePoint(Point S[], int n) { for(int s = 0; s < n; s++) S[s].extreme = true; for(int p = 0; p < n; p++) for(int q = p + 1; q < n; q++) for(int r = q + 1; r < n; r++) for(int s = 0; s < n; s++) { if(s == p || s == q || s == r || !S[s].extreme) continue; if(InTriangle(S[p], S[q], S[r], S[s])) S[s].extreme = false; } }
複雜度為\(O(n^4)\)。
To-Left Test
如何判定點是否落在三角形內部?
點相對於另外兩個點確定的有向線段而言落在左側還是右側?
InTriangle(p, q, r, s) iff
ToLeft(p, q, s) == ToLeft(q, r, s) == ToLeft(r, p, s) == True