Gewissensfrage



  • Wie sieht es denn bei Deiner Kugelformel aus, wenn sie bei 2/3. abgeschnitten wurde?

    Ist mir ehrlich gesagt nicht so ganz klar, was du damit meinst!

    Grüße,
    TS++



  • Du suchst scheinbar sowas wie eine virtuelle Methode, die aber anhand von zwei oder mehr Objekten ausgewählt wird. Sowas läuft glaub ich unter dem Stichwort double-dispatching. => Google hilft.



  • du kommst um einen downcast nicht herum. den kannst du aber schick hinter einem visitor mechanismus verstecken.
    dabei abstrahierst du gleichzeitig vom container, und einen baum von aussen zu durchwandern ist ja auch nicht so ganz ohne, und wenn man das in verschiedenen zusammenhaengen macht, hat man einen haufen unuebersichtlicher schleifen, die man nicht braucht.



  • Erstmal: Danke Jester, bin noch am RumGooglen! 😉

    @PeterTheMaster:
    Was meinst du denn bitte genau mit visitor mechanismus?

    Grüße,
    TS++



  • Original erstellt von TS++:
    Was meinst du denn bitte genau mit visitor mechanismus?

    Ich vermute er meint das Visitor Pattern.



  • @all:
    Danke euch für eure Antworten!

    Grüße,
    TS++



  • Nur ein Entwurf, nicht kompiliert und nur 2x durchgelesen 😉
    Erklärung folgt bei Bedarf morgen

    //Funktionen zur Überprüfung der Kollision
    
     bool
    ChckCollision( CGlobe& , CGlobe&);
    
     bool
    ChckCollision( CGlobe& , CCube&);
    
    /* abstrakte Basisklasse für Kollisionsüberprüfungsklassen*/
     class
    CCollisionChecker
    {
    public:
      /** - */
       virtual
       bool
      ChckCollision( CGlobe&) = 0;
    
      /** - */
       virtual
       bool
      ChckCollision( CCube&) = 0;
    };
    
    /* CollisionChecker-Klasse für Vergleiche mit Globes*/
     class
    CGlobeCollisionChecker
    :public CCollisionChecker
    {
       CGlobe&
      m_Globe;
    
    public:
    
      CGlobeCollisionChecker(CGlobe& Globe)
      :m_Globe(Globe)
      {
      }
    
       bool
      ChckCollision( CGlobe& Other)
      {
        ChckCollision( m_Globe, Other);
      }
    
       bool
      ChckCollision( CCube& Other)
      {
        ChckCollision( m_Globe, Other);
      }
    
    };
    
    /* CollisionChecker-Klasse für Vergleiche mit Cubes*/
     class
    CCubeCollisionChecker
    :public CCollisionChecker
    {
       CCube&
      m_Cube;
    
    public:
    
      CGlobeCollisionChecker(CCube& Globe)
      :m_Globe(Globe)
      {
      }
    
       bool
      ChckCollision( CGlobe& Other)
      {
        ChckCollision( m_Cube, Other);
      }
    
       bool
      ChckCollision( CCube& Other)
      {
        ChckCollision( m_Cube, Other);
      }
    
    };
    
    /** Basisklasse für Körper*/
     class
    CGeometricBody
    {
    public:
    
       bool
      ChckCollision( CGeometricBody& OtherBody)
      {
         std::auto_ptr<CCollisionChecker>
        CollisionChecker( GenCollisionChecker());
    
        return OtherBody.PerfCollisionCheck( *CollisionChecker);
      }
    
    protected:
    
       virtual
       std::auto_ptr<CCollisionChecker>
      GenCollisionChecker() = 0;
    
       virtual
       std::auto_ptr<CCollisionChecker>
      PerfCollisionCheck( CCollisionChecker& ) = 0;
    
    };
    
    //Implementationen konkreter Körper
     class
    CGlobe
    :public CGeometricBody
    {
    
    protected:
    
       virtual
       std::auto_ptr<CCollisionChecker>
      GenCollisionChecker()
      {
        return new (CGlobeCollisionChecker(*this));
      }
    
       virtual
       std::auto_ptr<CCollisionChecker>
      PerfCollisionCheck( CCollisionChecker& )
      {
        return CCollisionChecker.ChckCollision(*this));
      }
    
    };
    
    //Implementationen konkreter Körper
     class
    CCube  
    :public CGeometricBody
    {
    
    protected:
    
       virtual
       std::auto_ptr<CCollisionChecker>
      GenCollisionChecker()
      {
        return new (CCubeCollisionChecker(*this));  )
      }
    
       virtual
       std::auto_ptr<CCollisionChecker>
      PerfCollisionCheck( CCollisionChecker& )
      {
        return CCollisionChecker.ChckCollision(*this));
        //bin mir nicht sicher: könnte
        //das nicht auch in die 
        //Basisklasse? (d.h. hat this in
        //der Basisklasse den Typ der
        //der konkreten Ableitung?)
      }
    
    };
    

    [ Dieser Beitrag wurde am 08.07.2003 um 22:31 Uhr von kartoffelsack editiert. ]

    [ Dieser Beitrag wurde am 09.07.2003 um 12:06 Uhr von kartoffelsack editiert. ]



  • Morgen kartoffelsack!

    bool CGeometricBody::ChckCollision( CGeometricBody& secondBody )
    {
        std::auto_ptr<CCollisionChecker> 
        CollisionChecker( GenCollisionChecker());
        return PerfCollisionCheck( *CollisionChecker);
    }
    

    Wo verwertest du denn die Referenz auf den GeometricBody, gegen den getestet werden soll?
    Ich müsste, wenn schon, dann von secondBody einen CollisionChecker anfordern und auf diesen dann 'PerfCollisionCheck' anwenden.

    Ach übrigens:
    (Gehört zwar eigentlich in ein anderes Forum)
    Ich bin jetzt auf ein Konzept zur Kollisionskontrolle gestossen, das es nicht mehr erforderlich macht, den exakten Typen des jeweiligen Volumes zu kennen.
    Nennt sich: Separating Axis Theorem (unter Gamasutra)
    Jedoch was die Effizienz anbelangt, bin ich mir noch nicht so ganz sicher.

    Das DownCast-Problem kann natürlich bei anderen Fallbeispielen, als dem aktuellen, mit diesem Theorem nicht gelöst werden, klar!

    Grüße,
    TS++



  • @TS++
    Zu meinem letzten Beitrag, schau Dir mal das an: http://www-sst.informatik.tu-cottbus.de/~wk/cg_v08b.pdf



  • @TS++
    Jo, hast recht. Habs ausgebessert


Anmelden zum Antworten