最近在看編程之美,看到4.4節,講如何判斷一個點是否在三角形內部時,第二種解法:可以通過判斷點是否在邊射線的左邊來判斷點是否在三角形內部,頓時覺得很新奇,
但是看代碼是,有點沒看懂,為啥要用兩個向量的叉積?能不能用點乘呢?
其實關於點積,叉積早不知道是什么了(如果你也像我迷惑看這里:http://blog.csdn.net/fox64194167/article/details/8147460),於是google了一下,叉積,但是看來看去也沒看明白為啥這個叉積就可以判斷?
又找小伙伴討論,才搞明白。
現總結一下:
判斷一個點是否在一條射線的左邊可以轉化成兩個向量的叉積的方向只想問題
設點P1,和射線P0P2,則 兩個向量分別為 : a = P0P2 , b = P0P1,
由叉積的定義:
對三維的兩個向量a,b 而言
a×b = (aybz-azby) i + (azbx-axbz) j + (axby-aybx) k
=
假設 a , b 都是二維的則,
|a×b| = (axby-aybx),方向和a,b兩向量構成的平面垂直;
根據右手定則:
一個簡單的確定滿足“右手定則”的結果向量的方向的方法是這樣的:若坐標系是滿足右手定則的, 當右手的四指從 a 以不超過180度的轉角轉向 b 時,豎起的大拇指指向是 c 的方向。由於向量的叉積由坐標系確定,所以其結果被稱為偽向量。
那么我們就可以根據 c 方向來判斷點是在射線的左邊還是右邊,
判斷原則如下:看(axby-aybx)的正負
1,如果 (axby-aybx) > 0 ,則點P0在射線P0P2的左邊。
2,如果 (axby-aybx) = 0 ,則點P0在射線P0P2上。
3,如果 (axby-aybx) < 0 ,則點P0在射線P0P2的右邊。
分析到這里編程很好實現了吧,(*^__^*) 嘻嘻……