【計算幾何】向量表示

CN_swords發表於2017-02-24

計算幾何中的向量表示

二維圖中,點與向量的表示:

struct point   //點座標
{
    double x;
    double y;
};
struct V   //兩點式
{
    point start;
    point end;
};
V change(V a)   //兩點式起點化為 0,0
{
       V b;
       b.start.x = 0;
       b.start.y = 0;
    b.end.x = a.end.x - a.start.x;
    b.end.y = a.end.y - a.start.y;
    return b;
}

向量的運演算法:

1.向量加減

V add(V a,V b)
{
    V aa = change(a);
    V bb = change(b);
    V c;
    c.start.x = 0;
    c.start.y = 0;
    c.end.x = aa.end.x+bb.end.x;
    c.end.y = aa.end.y+bb.end.y;
    return c;
}
V dec(V a,V b)
{
    V aa = change(a);
    V bb = change(b);
    V c;
    c.start.x = 0;
    c.start.y = 0;
    c.end.x = aa.end.x-bb.end.x;
    c.end.y = aa.end.y-bb.end.y;
    return c;
}

2.向量點積

可以通過向量點積計算向量夾角

a•b = |a|*|b|*cos(∠)

a•b = x1*x2 + y1*y2;

double dot_mul(V a,V b)
{
    double result;
    V aa = change(a);
    V bb = change(b);
    result = aa.end.x*bb.end.x + aa.end.y*bb.end.y;
    return result;
}

3.向量叉積

叉積可以計算三角形面積

可以通過向量叉積的符號判斷向量的順逆時針關係

a×b > 0 , a 在 b的順時針方向

a×b < 0 , a 在 b的逆時針方向

a×b = 0 , a 在 b同方向或反方向

a×b = x1*y2 - x2*y1;

double cross_mul(V a,V b)
{
    double result;
    V aa = change(a);
    V bb = change(b);
    result = aa.end.x*bb.end.y - aa.end.y*bb.end.x;
    return result;
}




相關文章