向量複習(一)
首先,我們先來複習一下二維空間幾何求交涉及的向量相關知識,方便那些數學基礎不太好或好多年未接觸數學的童鞋們。樓主就是其中一員哦,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. 免責宣告
※ 本文之中如有錯誤和不準確的地方,歡迎大家指正噠~
※ 此專案僅用於學習交流,請不要用於任何形式的商用用途,謝謝呢;