Vector2D& Vector2D::operator/=(double u) { if (!EQUALZERO(u)) { x /= u; y /= u; } return(*this); }
double calc_angle(double *u, double *v) { double ps; double n1; double n2; double angle; if (u == NULL || v == NULL) return (0.001F); angle = 0.0F; ps = calc_ps(v, u); n1 = calc_norme(u); n2 = calc_norme(v); if (!EQUALZERO(ps) && !EQUALZERO(n1) && !EQUALZERO(n2)) angle = ps / (n1 * n2); angle = angle < 0.0000001 ? 0.00000 : angle; return (angle); }
short Vector2D::AtWhere(Vector2D v0,Vector2D v1) { Vector2D vTemp1(v1.y-v0.y,v0.x-v1.x); Vector2D vTemp2(x-v0.x,y-v0.y); double d=vTemp1*vTemp2; if(EQUALZERO(d)) return 0; if(d>0)//right return 1; return -1; }
bool Vector2D::Intersect(Vector2D v1,Vector2D v2,Vector2D v3,Vector2D v4)//tow line intersect { double d=(v4.y-v3.y)*(v1.x-v2.x)-(v2.y-v1.y)*(v3.x-v4.x); if(EQUALZERO(d)) return false; double d1=v1.x*v2.y-v2.x*v1.y; double d2=v3.x*v4.y-v4.x*v3.y; x=((v4.x-v3.x)*d1-(v2.x-v1.x)*d2)/d; y=((v4.y-v3.y)*d1-(v2.y-v1.y)*d2)/d; return true; }