先看下面的圖:
任給乙個三角形,當你從某個頂點沿著三角形逆時針運動時,你會發現三角形內部的點始終在你的左手邊。所以這就給了我們啟示:如果能判斷乙個點在三條有向線段的左邊,而且這三條有向線段構成乙個三角形(首尾相接),那麼這個點就在這個三角形內。
所以現在的問題是如何快速判斷乙個點在直線的左邊還是右邊。學過解析幾何的同學都知道:利用兩點的座標就可以求出過2點的直線方程,而一條直線將平面分割成2個平面,如果我們指定這條直線的方向,那麼就可以將要判定的點帶入直線方程,看其符號:
如圖,當p點座標帶入方程大於0,我們便得知p點位於直線左側了。
原理上可行但是我們要求直線的方程,這樣會不會過於麻煩了呢?確實,事實上,我們有更好的辦法:向量。我們可以利用向量的叉積,如圖:
知道ap
→×ab
−→−=
−ab→
×ap−
→−,這
是乙個好
性質,當
p位於a
b的兩側
時,ab
→×ap
−→−會
異號,a
p→×a
b−→−
=∣∣∣
ap→∣
∣∣∣∣
ab−→
−∣∣sinθ,
剛好也等
於兩個向
量所構成
的三角形
面積的2
倍。
到這裡我們的集合描述就差不多了。現在看一下代數性質。
假設有2個三維向量a→
=(x1
,y1,
z1),
b→=(
x2,y
2,z2
) 則叉積為: a→
×b→=
∣∣∣∣
ix1x
2jy1
y2kz
1z2∣
∣∣∣
當在平面上時,我們可以認為z分量為0,那麼就有: a→
×b→=
∣∣∣∣
ix1x
2jy1
y2k0
0∣∣∣
∣=(x
1y2−
x2y1
)k 這
裡的a→
,b→分
別代表的
應該是a
p−→−
,ab−
→−,一
般情況下
我們的原
始資料應
該是a、
b、p三
個點的坐
標 鄧老師的課件上的公式卻是乙個3*3的行列式:
開始不明白這個怎麼來得,後來才明白利用了行列式的技巧: ∣∣
∣∣∣p
xqxs
xpyq
ysy1
11∣∣
∣∣∣=
∣∣∣∣
∣pxq
x−px
sx−p
xpyq
y−py
sy−p
y100
∣∣∣∣
∣ =∣
∣∣∣∣
0qx−
pxsx
−px0
qy−p
ysy−
py10
0∣∣∣
∣∣=∣
∣∣qx
−pxs
x−px
qy−p
ysy−
py∣∣
∣ 到這裡就基本明白了。在實際編寫程式的時候依然還是轉化為代數:
關於makefile的一點思考
在gnu編譯工具軟體中,如果對單一的原始檔進行編譯,可執行指令如下 gcc o x x.c 此指令會將原始檔編譯為目標檔案。若是對執行緒類檔案進行編譯,則在末尾加上 lpthread指令。但若是對多檔案進行編譯,即若是編譯的目標檔案同時包含另一檔案中的函式。則在編譯的時候需將另一檔案加到編譯原始檔中...
關於指標的一點思考
指標是乙個變數,所不同的是,它存的是位址。因為資料型別決定著如何解釋這個位址 位元組數和操作 因此根據的資料型別的不同,指標又有不同的型別。某個物件 a 的位址範圍為 a,a size n 其中size n是a所佔的位元組數 比如乙個一維陣列int a 10 位址範圍為 a,a 10 sizeof ...
關於演算法的一點思考。。。
關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...