1. 程式人生 > 實用技巧 >計算幾何筆記01

計算幾何筆記01

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