W
Hallo alterbro,
Die mathematische Lösung wurde Dir ja schon gezeigt. Wenn Du das in C++ umsetzt, kannst Du Dir zunutze machen, dass das Skalarprodukt eines Vektors mit den Einheitsvektoren in X- bzw. Y-Richtung jeweils den X- bzw. Y-Wert des Vektors liefern.
Also zum Beispiel e\_x \cdot \left( \begin{eqnarray} a\_x \\ a\_y \end{eqnarray} \right) = a\_x
Statt zwei Funktionen jeweils für X und Y zu schreiben, schreibst Du nur eine Funktion und gibst eine Variable Einheitsvektor als Unterscheidung für die Richtung mit - etwa so:
// -- Einheitsvektoren in X- und Y-Richtung
class Ex {};
class Ey {};
namespace
{
const Ex eX;
const Ey eY;
}
template< typename V >
Vector getPoint( const Vector& a, const Vector& b, const V& n, double d )
{
Vector diff = b-a;
double t = (d - n * a) / (n * diff);
return a + t*diff;
}
Der Aufruf geschieht dann einfach unter Angabe der jeweiligen Richtung - zum Beispiel:
Vector a( -1, 2 );
Vector b( 9, 7 );
Vector pnt = getPoint( a, b, eX, 5.0 );
Damit das funktioniert, muss Deine Vector-Klasse über die notwendigen Operatoren verfügen:
class Vector
{
public:
Vector( double x, double y )
: x_(x), y_(y)
{}
Vector operator+( const Vector& b ) const
{
return Vector( x_+b.x_, y_+b.y_ );
}
Vector operator-( const Vector& b ) const
{
return Vector( x_-b.x_, y_-b.y_ );
}
friend std::ostream& operator<<( std::ostream& out, const Vector& v );
// -- Skalarprodukte
friend double operator*( Ex, const Vector& v ) { return v.x_; }
friend double operator*( Ey, const Vector& v ) { return v.y_; }
friend double operator*( const Vector& a, const Vector& b )
{
return a.x_ * b.x_ + a.y_ * b.y_;
}
// -- Multiplikation Skalar * Vektor
friend Vector operator*( double factor, const Vector& v )
{
return Vector( factor * v.x_, factor * v.y_ );
}
private:
double x_, y_;
};
.. ansonsten siehe auch hier.
Dieses Vorgehen hat den Vorteil, dass Du mit der identischen Funktion auch den Schnittpunkt mit einer schrägen Wand bestimmen kannst. Du benötigst dazu einen Normalenvektor der Wand und einen beliebigen Punkt auf der Wand. Etwa so:
// -- Schnittpunkt mit einer Wand
Vector n(4, -1); // Wandnormale
Vector wand( 2, 0 ); // ein Punkt der Wand
pnt = getPoint( a, b, n, n*wand );
.. und da hier keine Einschränkung auf 2Dimensionen gemacht wird (außer in der Vektorklasse selbst) - geht das auch sofort in 3D!
alterbro schrieb:
Ich bin halt ne Lusche in Geometrie.
Versuch' das zu ändern
Gruß
Werner