由点乘计算角度,由叉乘计算正负。
点乘公式:a * b= |a| * |b| * cos<a,b>=a.x * b.x + a.y* b.y
cos<a,b> = (a.x * b.x + a.y* b.y) / |a| * |b|
叉乘公式:a X b = |a| * |b| * sin<a,b> = a.x * b.y - b.x* a.y
代码:
double angle(POINT o,POINT s,POINT e)
{
double cosfi,fi,norm;
double dsx = s.x - o.x;
double dsy = s.y - o.y;
double dex = e.x - o.x;
double dey = e.y - o.y;
cosfi=dsx*dex+dsy*dey;
norm=(dsx*dsx+dsy*dsy)*(dex*dex+dey*dey);
cosfi /= sqrt( norm );
if (cosfi >= 1.0 ) return 0;
if (cosfi <= -1.0 ) return -3.1415926;
fi=acos(cosfi);
if (dsx*dey-dsy*dex>0) return fi; // 说明矢量os 在矢量 oe的顺时针方向
return -fi;
}