您當前的位置:首頁 > 文化

向量複習(一)

作者:由 fengkeyleaf 發表于 文化時間:2022-10-17

首先,我們先來複習一下二維空間幾何求交涉及的向量相關知識,方便那些數學基礎不太好或好多年未接觸數學的童鞋們。樓主就是其中一員哦,6-7年沒有再碰高中數學了,所以對於向量比較熟悉的童鞋可以跳過這部分內容。

1. 向量的定義

在數學中,向量(也稱為歐幾里得向量、幾何向量、向量),指具有大小(magnitude)和方向的量。它可以形象化地表示為帶箭頭的線段。箭頭所指:代表向量的方向;線段長度:代表向量的大小。與向量對應的量叫做數量(物理學中稱標量),數量(或標量)只有大小,沒有方向。

[1]

定義大家應該都能明白,但是需要注意一點:給定的向量並不是固定不動的,它不像線段,起始和中止點都是固定的,向量是可以隨意平移的,但線段不行,這點後面我們也會說。

2. 向量的表示

向量有兩種表示方式:1。 幾何表示法;2。 座標表示法;幾何表示法如下圖

[1]

向量複習(一)

而座標表示法比較重要,後面所涉及的都是這種方法,如下圖

[1]

向量複習(一)

簡單來說,向量(a, b)(以下簡稱v(a, b)),表示往x軸正方向移動a個單位,往y軸正方向移動b個單位。比如說v(4, 2),如下圖所示:

向量複習(一)

每個虛線小箭頭表示一個單位,我們可以看到從(2, 2)為起點,向x正方向移動4個單位,然後向y軸正方向移動2個單位,最後連線首尾兩點的有向線段即為v(4, 2)。注意,我們之前提到向量可以隨意平移,所以下面兩組向量都表示同一個向量,即使它們的起點和終點並不相同:

向量複習(一)

也就是說,向量和起始終止位置無關,之和移動的方向和大小有關係。也可以說向量是動態的,而線段是靜態的,這點大家需要注意啦噠~

3. 向量的求解

如果我們已知兩個座標點,如何求解這兩點所表示的向量呢?方法也很簡單:

v(a, b) = point1 - point2 = v(point1。x - point2。x, point1。y - point2。y)

其實就是兩個座標點x和y相減,那向量方向為:point2為起始點,point1為中止點,比如下面兩點 (2,2) 和 (4,4),可以表示兩個相反方向但模相同的向量(模即為向量的長度),v(2, 2)和v(-2, -2):

向量複習(一)

所以大家在用座標求解向量的時候一定要注意方向哦。

4. 向量的四則運算

4.1 加法

兩個向量相加,一般使用三角形法則或四邊形法則。比如v(4, 0) + v(0, 2) = v(4, 2):

向量複習(一)

從上圖可以看出,最終求解的向量(標紅)即為另外兩個向量所組成的三角形的邊。或者我們將v(4, 0) 和 v(0, 2)平移到對面的方向,組成一個平行四邊形,那麼最終求解的向量為這個平行四邊形的內對角線:

向量複習(一)

而且我們也可以注意到,向量相加即為兩個向量座標之和:

/**

* vector addition

* */

public

Vector

add

Vector

vector

{

// 無視minsID

return

new

Vector

x

+

vector

x

y

+

vector

y

minsID

——

);

}

4.2 減法

其實向量的減法可以看成加上一個方向相反的向量,所以同樣適用三角形或平行四邊形法則。還是上面的例子,這次我們減去v(0, 2),即加上v(0, -2)。另外注意,向量的運算需要兩兩向量首尾相連才能運算,所以下面右邊這種是不允許的:

向量複習(一)

/**

* vector subtract

* */

public

Vector

subtract

Vector

vector

{

return

new

Vector

x

-

vector

x

y

-

vector

y

minsID

——

);

}

4.3 乘法和除法

這裡的乘法和除法並不是兩個向量的乘法和除法,而是和一個常量相乘和相除。向量之間的乘法是後面會講的點積和叉積,但向量之間沒有除法。向量和常量相乘或相除,大家可以理解為兩個向量之間的比例關係,我們用最簡單的共線向量(即平行向量)來舉例:

向量複習(一)

如果只看兩者的模,我們知道 |v(8,0)| = 4|v(2,0)|,或者 |v(8,0)| / 4 = |v(2,0)|;上面表達了兩個向量之間模的比例,但我們也可以直接用向量來表示兩者之間的關係:v(8,0) = 4v(2,0),或者 v(8,0) / 4 = v(2,0);也就是說四分之一個v(8,0)即為v(2,0),4個v(2,0)即為一個v(8,0):

向量複習(一)

理解了這些概念,那麼相應的程式碼也是很簡單了:

/**

* vector multiplication

* */

public

Vector

multiply

float

ratio

{

return

new

Vector

ratio

*

x

ratio

*

y

minsID

——

);

}

/**

* vector division

* */

public

Vector

division

float

ratio

{

return

new

Vector

x

/

ratio

y

/

ratio

minsID

——

);

}

同時,樓主給到的圖例也說明了向量四則運算的幾何關係,大家可以注意下呢。

5. 點積和叉積

這部分主要介紹點積和叉積的計算方法和幾何意義,至於其他詳細的內容,有興趣的童鞋可以參考這篇文章:

向量內積(點乘)和外積(叉乘)概念及幾何意義

5.1 點積

先介紹一下點積的基本求解形式

[2]

,如果給定兩個向量a和b:

向量複習(一)

向量複習(一)

則它們的點積定義為:

向量複習(一)

其實就是兩個向量的每個變數兩兩相乘,再相加:

/**

* dot multiplication, vector * vector

* */

public

static

float

dot

Vector

vector1

Vector

vector2

{

return

vector1

x

*

vector2

x

+

vector1

y

*

vector2

y

}

點積的幾何意義也很簡單:向量b在a上面的投影。注意,這裡也說明了點積的結果為常量,而非向量:

向量複習(一)

圖上紅色部分即為v(3,4)在v(8,0)上面的投影,至於點積的其他內容,請參看上面提到的文章。

5.2 叉積

叉積的一般計算求解需要用到矩陣乘法,而後面涉及的幾何求交主要是二維座標,所以這裡直接介紹二維座標的乘法:即x和y交叉相乘,再相減。

/**

* cross multiplication, vector x vector

* */

public

static

float

cross

Vector

vector1

Vector

vector2

{

return

vector1

x

*

vector2

y

-

vector1

y

*

vector2

x

}

叉積的幾何意義相對複雜一些:1)其模等於兩個向量所組成的平行四邊形的面積;2)方向為垂直於兩個向量所在平面。所以叉積和點積不一樣,叉積的結果是向量,而不是常量。大家可以看下面圖示

[2]

來理解:

向量複習(一)

6. 模的求解

模的求解最簡單的方法就是兩點之間的距離公式,這點我們從上面的向量幾何意義就能看出來,但是這樣計算太複雜了。還記得我們說過向量可以自由平移麼?那麼為何不把向量平移到原點,然後再計算其模呢?透過這樣的處理,一個向量的模可以使用其座標直接求解,而不用兩點間的距離公式:

/**

* vector‘s norm, but without radical

* */

public

float

normWithoutRadical

()

{

return

x

*

x

+

y

*

y

}

/**

* vector’s norm

* */

public

float

norm

()

{

return

float

Math

sqrt

normWithoutRadical

()

);

}

norm()是開方之後的結果,normWithoutRadical()則沒有開方,後面兩個都有用到,因為有些時候我們不需要開方,可以減少浮點數計算誤差。

透過這樣,我們可以求得向量的模。我們最後再提一下一個概念:單位向量(e),即模為1的向量。那麼,給定一個向量如何求得e呢?其實很簡單:

e(a, c) = v(a, b) / |v(a, b)|

也就是向量除以它的模,即為每個單位的向量。

好啦,向量先複習到這裡,以後有遇到更多知識再來講解噠~接下來,我們將開始正式講解兩種幾何求交的問題:直線和直線,圓和直線。

下一節:

幾何求交(一):直線和直線的交點

幾何求交(二):直線和圓的交點

7. 附錄:程式碼

程式碼:

Vector類

專案程式碼:

Algorithm Repository

8. 免責宣告

※ 本文之中如有錯誤和不準確的地方,歡迎大家指正噠~

※ 此專案僅用於學習交流,請不要用於任何形式的商用用途,謝謝呢;

向量複習(一)

標簽: 向量  vector  點積  幾何  求解