初學計算幾何(一)——點與向量·叉積與點積
阿新 • • 發佈:2018-12-09
前言
計算幾何應該是一個比較複雜的東西吧,它的應用十分廣泛。為此,我花了很長的時間來學習計算幾何。
點與向量
點
點應該還算比較簡單吧!對於平面上的一個座標為的點,我們可以用來表示它。
向量
向量表示的是一個有大小和方向的量,在平面座標系下它與點一樣也用兩個數來表示。這兩個數的實際含義是將這個向量的起點移至原點後終點的座標。通常,我們用來表示一個向量,用來表示向量的長度。
點與向量的基本定義與運算
雖然點與向量十分相像,但是它們在概念上還是有許多不同的。
下面是它們的基本定義與運算。
struct Point//一個結構體用來儲存一個點
{
double x,y;//分別儲存點的兩個座標
Point(double x=0,double y=0):x(x),y(y){}//建構函式
};
typedef Point Vector;//向量在程式碼中其實與點差不多,因此可以直接typedef一下
inline Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x,A.y+B.y);}//向量+向量=向量
inline Vector operator - (Point A,Point B) {return Vector(A.x-B.x,A.y-B.y);}//點-點=向量
inline Vector operator * (Vector A,double x) {return Vector(A.x*x,A.y*x);}//向量*一個數=向量
inline Vector operator / (Vector A,double x) {return Vector(A.x/x,A.y/x);}//向量/一個數=向量
點積
下面,先來介紹一下向量的點積。
點積的計算公式及其擴充套件
對於兩個向量和,如果它們的夾角為,則它們的點積就等同於 。
既然這樣,我們就可以推匯出以下公式:
向量的長度:(因為對於兩個相同的向量,,因此)
向量的夾角:(因為,所以)
以下是程式碼實現:
inline double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}//點積
inline double Len(Vector A) {return sqrt(Dot(A,A));}//向量的長度等於sqrt(A,A)
inline double Ang(Vector A,Vector B) {return acos(Dot(A,B)/Len(A)/Len(B));}//向量的夾角等於acos(A·B/|A|/|B|)
點積的正負
該如何判斷兩個向量的點積的正負呢?
點積的正負是由兩個向量的夾角所決定的。
- 當