1. 程式人生 > >初學計算幾何(一)——點與向量·叉積與點積

初學計算幾何(一)——點與向量·叉積與點積

前言

計算幾何應該是一個比較複雜的東西吧,它的應用十分廣泛。為此,我花了很長的時間來學習計算幾何。

點與向量

應該還算比較簡單吧!對於平面上的一個座標為(x,y)的點,我們可以用P(x,y)來表示它。

向量

向量表示的是一個有大小和方向的量,在平面座標系下它與點一樣也用兩個數來表示。這兩個數的實際含義是將這個向量的起點移至原點後終點的座標。通常,我們用v來表示一個向量,用|v|來表示向量v的長度。

點與向量的基本定義與運算

雖然點與向量十分相像,但是它們在概念上還是有許多不同的。

下面是它們的基本定義與運算。

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);}//向量/一個數=向量

點積

下面,先來介紹一下向量的點積

點積的計算公式及其擴充套件

v(X1,Y1)·u(X2,Y2)=X1X2+Y1Y2

對於兩個向量vu,如果它們的夾角為θ,則它們的點積就等同於

|v||u|cosθ

既然這樣,我們就可以推匯出以下公式:

向量的長度v·v(因為對於兩個相同的向量,cosθ=0,因此v·v=|v||v|=|v|2

向量的夾角acos(v·u/|v|/|u|)(因為v·u/|v|/|u|=cosθ,所以θ=acos(v·u/|v|/|u|)

以下是程式碼實現:

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|)
點積的正負

該如何判斷兩個向量的點積的正負呢?

點積的正負是由兩個向量的夾角θ所決定的。