向量-向量叉乘向量點乘_第1頁
向量-向量叉乘向量點乘_第2頁
向量-向量叉乘向量點乘_第3頁
向量-向量叉乘向量點乘_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、向量-向量叉乘向量點乘2010年07月28日 星期三 14:33向量(Vector)在幾乎所有的幾何問題中,向量(有時也稱矢量)是一個基本點。向量的定義包含方向和一個數(shù)(長度)。在二維空間中,一個向量可以用一對x和y來表示。例如由點(1,3)到(5,1的向量可以用(4,-2)來表示。這里大家要特別注意,我這樣說并不代表向量定義了起點和終 點。向量僅僅定義方向和長度。向量加法向量也支持各種數(shù)學運算。最簡單的就是加法。我們可以對兩個向量相加,得到的仍然是一 個向量。我們有:V1 (x1, y1 ) +V2 (x2, y2 ) =V3(x1+x2, y1+y2)下圖表示了四個向量相加。注意就像普通的

2、加法一樣,相加的次序對結果沒有影響(滿足交換律),減法也是一樣的。The sum of vectors A+B+C+D點乘(Dot Product)如果說加法是憑直覺就可以知道的,另外還有一些運算就不是那么明顯的,比如點乘和叉乘。點乘比較簡單,是相應元素的乘積的和:V1( x1, y1)V2(x2, y2) = x1*x2 + y1*y2注意結果不是一個向量,而是一個標量(Scalar)。點乘有什么用呢,我們有:A B = |A|B|Cos( 3)。是向量A和向量B見的|B。這里|A|我們稱為向量 A的模(norm),也就是A的長度,在二維空間中就是|A| = sqrt(x2+y2)。這樣我們

3、就和容易計算兩條線的:Cos( 0 ) = A B /(|A|B|)當然你知道要用一下反余弦函數(shù)acos()啦。(回憶一下cos(90)=0和cos(0) = 1還是有好處的,希望你沒有忘記。)這可以告訴我們?nèi)绻c乘的結果,簡稱點積,為 0的話就表示這兩個向量垂直。當兩向量平行時,點積有最大值另外,點乘運算不僅限于 2維空間,他可以推廣到任意維空間。(譯注:不少人對量子力學中的高維空間無法理解,其實如果你不要試圖在視覺上想象高維空間,而僅僅把它看成三維空間在數(shù)學上的推廣,那么就好理解了)fl叉乘(cross product)相對于點乘,叉乘可能更有用吧。2維空間中的叉乘是:V1(x1, y1)

4、 X V2(x2, y2) = x1y2 - y1x2看起來像個標量,事實上叉乘的結果是個向量,方向在z軸上。上述結果是它的模。在二維空間里,讓我們暫時忽略它的方向, 將結果看成一個向量,那么這個結果類似于上述的點積, 我們有:A x B = |A|B|Sin( 。)然而角度 。和上面點乘的角度有一點點不同,他是有正負的,是指從 A到B的角度。下圖 中。為負。另外還有一個有用的特征那就是叉積的絕對值就是A和B為兩邊說形成的平行四邊形的面積。也就是AB所包圍三角形面積的兩倍。在計算面積時,我們要經(jīng)常用到叉積。(譯注:三維及以上的叉乘參看維基:/wiki

5、/Cross_product )Parallelogram from A and B點-線距離找出一個點和一條線間的距離是經(jīng)常遇見的幾何問題之一。假設給出三個點,A, B和C,你想找出點C到點A、B定出的直線間距離。第一步是找出 A到B的向量AB和A到C的 向量AC ,現(xiàn)在我們用該兩向量的叉積除以|AB|,這就是我們要找的的距離了(下圖中的紅線)。如果你有基礎的高中幾何知識,你就知道原因了。上一節(jié)我們知道(AB X AC)/2是三角形ABC的面積,這個三角形的底是 |AB|,高就是C到AB的距離。有時叉積得到的是一個負 值,這種情況下距離就是上述結果的絕對值。當我們要找點到線段的距離時,情況變

6、得稍稍復雜一些。這時線段與點的最短距離可能是點到線段的某一端點,而不是點到直線的垂線。例如上圖中點 C到線段AB的最短距離應該 是線段BC。我們有集中不同的方法來判斷這種特殊情況。第一種情況是計算點積AB Bc來判定兩線段間 。如果點積大于等于零,那么表示 AB到BC是在-90到90度間,也就是 說C到AB的垂線在AB外,那么AB上到C距離最近的點就是B。同樣,如果 BAAC大于等于零,那么點 A就是距離C最近的點。如果兩者均小于零,那么距離最近的點就在線 段AB中的莫一點。源代碼參考如下:/Compute the dot product AB BCint dot(int A, int B,

7、int C)AB = new int2;BC = new int2;AB0 = B0-A0;AB1 = B1-A1;BC0 = C0-B0;BC1 = C1-B1;int dot = AB0 * BC0 + AB1 * BC1;return dot;/Compute the cross product AB x ACint cross(int A, int B, int C)AB = new int2;AC = new int2;AB0 = B0-A0;AB1 = B1-A1;AC0 = C0-A0;AC1 = C1-A1;int cross = AB0 * AC1 - AB1 * AC0;r

8、eturn cross;/Compute the distance from A to B double distance(int A, int B) int di = A0 - B0; int d2 = A1 - B1; return sqrt(d1*d1+d2*d2);/Compute the distance from AB to C/if isSegment is true, AB is a segment, not a line.double linePointDist(int A, int B, int C, boolean isSegment)double dist = cros

9、s(A,B,C) / distance(A,B);if(isSegment)(int dotl = dot(A,B,C);if(dot1 > 0)return distance(B,C);int dot2 = dot(B,A,C);if(dot2 > 0)return distance(A,C);return abs(dist);上面的代碼看起來似乎是很繁瑣。不過我們可以看看在C+和C#中,采用了運算符重載的類point,用*代表點乘,用時代表叉乘(當然'+''-'還是你所希望的),那么看起來就簡單些, 代碼如下:/Compute the distance from AB to C/if isSegment is true, AB is a segment, not a line.double linePointDist(point A, point B, point C, bool isSegment)(double dist = (B-A)A(C-A) / sqrt(B-A)*(B-A);if

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論