Rectangleskoordinaten in Array speichern



  • Hi zusammen,

    ich habe vile Rechteck und brauch von jedem Rechteck jeweils alle Eckkoordinaten.
    Diese würde ich gerne in einem Array abspeichern.

    Wie löse ich das am besten???

    Jedes viereck hat ja quasi vier ecken und somit vier Punkte!

    Wie kann ich alle Punkte des jeweiligen Rechtsecks zusammen absoeichern, damit ich einfach dann sagen kann:

    "Holde Rechteck A aus Array" und dann bekomm ich auch automatisch alle vier (4*x und 4*y)Koordinatenpunkte mitgeliefert!

    In c# hätte ich eine Klasse geschrieben und die Klasse in einer ArrayList gespeichert!
    In der Klasse hätte ich rückgabewerte eingefügt und dann alle meine Koordinaten per return bekommen!

    Kann ich sowas auch mit c++ machen?

    Danke Bench



  • Hallo,

    Es gibt ja schon TRect. Das kannst du ja in einen vector packen.

    std::vector<TRect> rect_vect;
    


  • hi,

    ok das klingt gut und wie geht das dann!!!

    Habe die unteren in klammer stehenden Koordinaten!
    Aus diesen wird ja dann mein Rechteck gezeichnet!

    Habe folgendes probiert:

    std::vector<TRect> rect_vect;
    TRect rect = new TRect(X-3,Y+3,X+3,Y-3);
    rect_vect[0] = rect;
    

    aber der meckert beim erzeugen des Recheck!?

    Wäre um Hilfe dankbar

    Bench



  • Hallo

    std::vector<TRect> rect_vect;
    rect_vect.push_back(TRect(X-3,Y+3,X+3,Y-3));
    

    Grundlagen in C++ wären sehr hilfreich.

    bis bald
    akari



  • Hi,

    Geil, geht!
    sorry, aber komm von Java und c# und muss mir jetzt c++ draufhaken!!

    Jetzt noch eine kurze Frage:

    Habe jetzt einen Punkt x,y!
    Jetzt will ich schauen, ob dieser in einem Rechteck aus meinem Array liegt!!

    Wie kann ich einen den Punkt mit allen Rechtecken aus dem Array ervleichen und schauen ob er innerhalb liegt?

    Sorry dass ich die da frag, aber wüsste nicht wie ich das anpacken soll!!!

    Danke Bench



  • Hallo

    - Schleife über die Elemente des vectors
    - Punkt mit den Dimensionen des Rects vergleichen

    bis bald
    akari



  • Hi,

    schon wieder ich!

    Also habe jetzt folgendes:

    vector<TRect>::iterator pos = find(rect_vect.begin(),rect_vect.end(),TRect(X-3,Y+3,X+3,Y-3));
    if ( pos != rect_vect.end()) ausserhalb = false;
    

    Jetzt kommt aber:

    [C++ Fehler] Test1.cpp(314): E2451 Undefiniertes Symbol 'vector'
    [C++ Fehler] Test1.cpp(314): E2108 Ungültige Verwendung von typedef 'TRect'
    [C++ Fehler] Test1.cpp(314): E2451 Undefiniertes Symbol 'iterator'

    Versteh nicht!
    Habe das doch schon inizialisiert?

    😕



  • Hallo

    Der Container heißt **std::**vector und damit auch alle davon abgeleiteten Iteratoren.

    bis bald
    akari



  • Hi,,

    ok hab ich auch gerade rausgefunden!

    jetzt habe ich folgendes und das geht auch super:

    std::vector<TRect>::iterator pos = std::find(rect_vect.begin(),rect_vect.end(),TRect(X-3,Y+3,X+3,Y-3));
                if ( pos != rect_vect.end() ){
                 rect_vect.erase(pos);
                 ausserhalb=false;
                }
    

    Wie kann ich jetzt x und y mit der Iteratin vergleichen?

    vielen Dank bench



  • Hallo

    *seufz*

    int x = ...;
    int y = ...;
    std::vector<TRect>::iterator iterator = rect_vect.begin();
    while( iterator != rect_vect.end() ) 
    {
      if (iterator->Left <= x && iterator->Right >= x 
        && iterator->Top <= y && iterator->Bottom >= y)
      {
        // Treffer ! in iterator ist ein passendes TRect
        break; // Wenn der erste Treffer ausreicht
      }
      iterator++;
    }
    

    bis bald
    akari



  • Hier noch eine find_if-Variante

    #include <functional>
    #include <algorithm>
    
    struct PointInRect : public std::unary_function<TRect, bool>
    {
      private:
        int x, y;
      public:
        PointInRect(int x_, int y_) : x(x_), y(y_) {}
        bool operator()(const TRect& rect)
        {
      	return rect.Left <= x && rect.Right >= x && rect.Top <= y && rect.Bottom >= y;
        }
    };
    
    std::vector<TRect>::iterator found = std::find_if(rect_vect.begin(), rect_vect.end(), PointInRect(x,y));
    if( found != rect_vect.end())
    {
    // gefunden
    }
    


  • HI,

    geil geil geil!!!
    Es geht!!!

    Dank dir Vielmals!!!!!!

    Bench


Anmelden zum Antworten