今天下午偶然瞄了一眼編程之美, 看到了一個問題, 4.4 點是否在多邊形內. 為什么關注這個問題呢? 因為在今年給中科院保送研究生機試出題的時候,我也出了一道這樣的題目.
看了編程之美的解答之后, 感覺作者沒有把這個問題講清楚, 所以來寫這樣一個東西.
<編程之美>的兩種解答方案都很直觀, 一種是 秦九韶海倫公式來做面積判斷, 一種是 常用的判斷點是否在三角形內.
為什么說 <編程之美> 沒有講清楚問題呢? 因為實質上這兩種方法是統一的.
對於三角形的情況, 我們使用有向面積來判斷,假設三角形三個點為(x1,y1),(x2,y2), (x3,y3), 需要判斷的點為(x,y). 根據向量代數的公式, 已知3點坐標, 判斷三角形有向面積為
有向面積的正負與行列式的排列順序有關(交換行列式的任意兩行, 行列式的正負發生變化)
簡單的可以展開為 A0 = (x1y2 – x1y3 – x2y1 + x3y1 + x2y3 - x3y2)/2. 這個判斷式子與 叉乘的判斷的公式是一模一樣的. 可以看出通過有向面積可以統一 <編程之美>中的兩種方法, 面積與叉乘的方法在數學本質上是一致的.
在編程之美之后凹多邊形的判斷, 這個是圖形學里面的一個經典問題, 從點(x,y)發出水平的射線, 判斷與凹多邊形的交點個數的奇偶性, 注意處理通過頂點的特殊情況.
如何判斷一個點在四面體的內部呢? 使用有向體積的概念. 假設四面體的四個頂點的坐標為 (x1,y1,z1), (x2,y2,z2), (x3,y3,z3), (x4,y4,z4). 需要判斷的點為(x,y,z). 那么原來四面體的有向體積 為
同理剩下的4個有向體積分別為
判斷准則很簡單, V0與V1V2V3V4都同向的時候, 則點位於四面體內, 否則位於四面體外. 當Vi = 0 的時候, 則此四面體退化了.