Gerade als Klasse deklarieren



  • Nabend!
    Mein Problem ist folgendes:
    Ich möchte zwei Geraden als KLassen deklarieren und anschliessend prüfen
    ob die nen gemeinsamen Schnittpunkt haben. Ich weiss jez nicht wie ich das schreiben soll (p1.x, p1.y...)

    Weiss da ev. jemand weiter? Thx, John



  • kaestlinger01 schrieb:

    Nabend!
    Mein Problem ist folgendes:
    Ich möchte zwei Geraden als KLassen deklarieren und anschliessend prüfen
    ob die nen gemeinsamen Schnittpunkt haben. Ich weiss jez nicht wie ich das schreiben soll (p1.x, p1.y...)

    Weiss da ev. jemand weiter? Thx, John

    struct Punkt {
    int x;
    int y;
    };

    class Gerade {
    public:
    Punkt Startpunkt;
    Punkt Endpunkt;
    };

    Gerade g;
    Gerade h;

    (bestimmt kein guter Code...)

    Da gibts bestimmt ne lustige Formel 😛



  • bool Gerade::HatGemeinsamenSchnittpunktMit(Gerade const& dieAndereGerade) const
    {
    	return !(b != dieAndereGerade.b && m == dieAndereGerade.m);
    }
    


  • Hallo, ich würds ungefär so machen:

    class Gerade
    {
    public:
    	Gerade(double steigung, double yabstand) :
    	  _m(steigung), _y(yabstand)
    	{
    	}
    
        bool hatSchnittpunkt(Gerade const& gerade)
    	{
    		return ! (gerade._y == _y);
    	}
    
    	double getschnittpunkt(Gerade const& gerade)
    	{
    		return (gerade._y - _y) / (_m - gerade._m);
    	}
    
    	double wert(double x)
    	{
    		return _m * x + _y; 
    	}
    
    private:
    	double _m; // steigung
    	double _y; // y-achsenabstand
    };
    
    int main()
    {
    	Gerade a(2, 5), b(3, 4);
    
    	if(!a.hatSchnittpunkt(b)) {
    		return 1;
    	}
    
    	double schnittpunkt = a.schnittpunkt(b);
    	cout << "Schnittpunkt an Stelle x = " << schnittpunkt << endl;
    	cout << "Y-Wert am Schnittpunkt f(x) = " << a.wert(schnittpunkt) << endl;
    
    	return 0;
    }
    

    edit: ach verdammt zu langsam 🤡

    Gruß



  • xindon schrieb:

    kaestlinger01 schrieb:

    Nabend!
    Mein Problem ist folgendes:
    Ich möchte zwei Geraden als KLassen deklarieren und anschliessend prüfen
    ob die nen gemeinsamen Schnittpunkt haben. Ich weiss jez nicht wie ich das schreiben soll (p1.x, p1.y...)

    Weiss da ev. jemand weiter? Thx, John

    struct Punkt {
    int x;
    int y;
    };

    class Gerade {
    public:
    Punkt Startpunkt;
    Punkt Endpunkt;
    };

    Gerade g;
    Gerade h;

    (bestimmt kein guter Code...)

    Da gibts bestimmt ne lustige Formel 😛

    Eine Gerade kann durch zwei Punkte festgelegt werden, aber sie hat weder Start- noch Endpunkt, oder hab ich was verpasst?



  • Brutus schrieb:

    Eine Gerade kann durch zwei Punkte festgelegt werden, aber sie hat weder Start- noch Endpunkt, oder hab ich was verpasst?

    Ja, mit Start- und Endpunkt wäre es eine Strecke. Man brauch wie schon gesagt 2 Punkte



  • kaestlinger01 schrieb:

    Mein Problem ist folgendes:
    Ich möchte zwei Geraden als Klassen deklarieren und anschliessend prüfen
    ob die nen gemeinsamen Schnittpunkt haben. Ich weiss jez nicht wie ich das schreiben soll (p1.x, p1.y...)

    Hallo John,

    zunächst einmal solltest Du Dir darüber im Klaren sein, ob Deine Gerade eine Geraden-Gleichung - wie von FireFlow vorgeschlagen - oder eine Gerade in der Ebene oder im Raum ist. Für letztere hat Xindon bereits angedeutet, dass man dafür außer einer Geraden auch noch einen Punkt - bzw. einen Vektor (im mathematischen Sinne) benötigt.
    Weiter wäre festzulegen, in welcher Form die Gerade gegeben ist - siehe http://de.wikipedia.org/wiki/Geradengleichung.

    Das ganze könnte dann in der Ebene (2D) im einfachsten Fall so aussehen:

    #include <iostream>
    #include <cmath>    // std::sqrt
    #include <utility>  // std::pair
    
    class Vektor
    {
    public:
        Vektor() : m_x( 0.0 ), m_y( 0.0 ) {}
        Vektor( double x, double y ) : m_x( x ), m_y( y ) {}
    
        // --   Skalarprodukt
        double operator*( const Vektor& b ) const
        {
            return m_x * b.m_x + m_y * b.m_y;
        }
        // --   Division durch einen Skalar
        Vektor operator/( double teiler ) const
        {
            return Vektor( m_x / teiler, m_y / teiler );
        }
    
        double X() const { return m_x; }
        double Y() const { return m_y; }
    
        friend std::ostream& operator<<( std::ostream& out, const Vektor& v )
        {
            return out << "(" << v.m_x << "; " << v.m_y << ")";
        }
    private:
        double m_x, m_y;
    };
    double abs( const Vektor& v )
    {
        return std::sqrt( v.X() * v.X() + v.Y() + v.Y() );
    }
    
    class Gerade
    {
    public:
        // Konstruktor für Normalform
        Gerade( const Vektor& normale, const Vektor& punkt )
            : m_n( normale / abs( normale ) )
            , m_c( punkt * m_n )
        {}
        friend std::pair< Vektor, bool > 
            schnittpunkt( const Gerade& g1, const Gerade& g2 );
    private:
        // --   interne Darstellung in Hessescher Normalform
        Vektor m_n; // abs( m_n ) == 1
        double m_c;
    };
    
    std::pair< Vektor, bool > schnittpunkt( const Gerade& g1, const Gerade& g2 )
    {
        const double EPS = 1.E-8;
        const double det = g1.m_n.X() * g2.m_n.Y() - g2.m_n.X() * g1.m_n.Y();
        if( std::abs( det ) < EPS  )
            return std::make_pair( Vektor(), false );
        return std::make_pair( Vektor( 
            g1.m_c     * g2.m_n.Y() - g2.m_c     * g1.m_n.Y(),
            g1.m_n.X() * g2.m_c     - g2.m_n.X() * g1.m_c     ) / det, true );
    }
    

    Eine kleines Testprogramm sähe dann so aus:

    int main()
    {
        using namespace std;
        //         Normale          Punkt auf der Geraden
        Gerade g1( Vektor( 3, -1 ), Vektor( 4, 0 ) );
        Gerade g2( Vektor(-1,  2 ), Vektor( 1, 1 ) );
        std::pair< Vektor, bool > ret = schnittpunkt( g1, g2 );
        if( ret.second )
            cout << "Schnittpunkt liegt bei: " << ret.first << endl;
    
        Gerade g1_parallel( Vektor( 6, -2 ), Vektor( 5, 7 ) );
        ret = schnittpunkt( g1, g1_parallel );
        if( !ret.second )
            cout << "kein Schnittpunkt von g1 und g1_parallel" << endl;
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten