#ifndef _global_h # include "global.h" #endif #ifndef _vec2_h # include "vec2.h" #endif Vec2 Vec2Zero( RealZero, RealZero ); // // Aufsplittung des Vektors in 2 Vektoren parallel und vertikal zum // Richtungsvektor d. Dazu wird folgendes Gleichungssytem gelöst: // // vx dx -dy // ( ) = l *( ) + u *( ) // vy dy dx // // V() = x + y // void Vec2::Split( const Vec2 &d, Vec2 *vx, Vec2 *vy ) const { Real l,u; if (d.Y()!=RealZero) { l = ( Y() + ( X() * d.X() / d.Y() ) ) / ( d.Y() + ( d.X() * d.X() / d.Y() ) ); u = ( l * d.X() - X() ) / d.Y(); *vx = Vec2( l* d.X() , l*d.Y() ); *vy = Vec2( u*(-d.Y()), u*d.X() ); } else { if (d.X()!=RealZero) { *vx = Vec2( X(), RealZero ); // parallel zur X-Achse *vy = Vec2(RealZero, Y() ); } else { *vx = *this; // keine Richtung -> gesamter Vektor ist x *vy = Vec2Zero; } } } // // Analog zur kompletten Aufsplittung wird in der folgenden // Version von split nur der parallele Anteil zurückgeliefert. // void Vec2::Split( const Vec2 &d, Vec2 *vx ) const { Real l; if (d.Y()!=RealZero) { l = ( Y() + ( X() * d.X() / d.Y() ) ) / ( d.Y() + ( d.X() * d.X() / d.Y() ) ); *vx = Vec2( l* d.X() , l*d.Y() ); } else { if (d.X()!=RealZero) { *vx = Vec2( X(), RealZero ); // parallel zur X-Achse } else { *vx = *this; // keine Richtung -> gesamter Vektor ist x } } } // // Berechnung des Winkels, den der angegebene Punkt zur aktuellen Korrdinate // hat. Ergebnis liegt zwischen 0 und 2*M_PI // Real Vec2::AngleRadial( const Vec2 &d ) const { Real erg; if (d.X()!=X()) erg = atan( (Y()-d.Y())/(d.X()-X()) ); else erg = (d.Y()