關於Toleft的一點思考

2021-07-25 07:06:21 字數 2151 閱讀 1776

先看下面的圖:

任給乙個三角形,當你從某個頂點沿著三角形逆時針運動時,你會發現三角形內部的點始終在你的左手邊。所以這就給了我們啟示:如果能判斷乙個點在三條有向線段的左邊,而且這三條有向線段構成乙個三角形(首尾相接),那麼這個點就在這個三角形內。

所以現在的問題是如何快速判斷乙個點在直線的左邊還是右邊。學過解析幾何的同學都知道:利用兩點的座標就可以求出過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 ...

關於演算法的一點思考。。。

關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...