计算几何中的向量表示
二维图中,点与向量的表示:
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;
}