Fläche ausfüllen (Punkt 1, Punkt 2)



  • Hey,

    nehmen wir an ich habe eine solche Tilemap:

    O O O O O
    O O O O O
    O O O O O
    O O O O O
    O O O O O

    Nun wähle ich 2 Punkte aus:

    O O O O O
    O O O 1 O
    O O O O O
    O 2 O O O
    O O O O O

    Wie kann ich nun die Flächen dazwischen ausfüllen, das folgendes herauskommt?

    O O O O O
    O x x x O
    O x x x O
    O x x x O
    O O O O O

    Dabei ist mir wichtig, dass der Algorithmus unabhängig davon funktioniert, in welcher Reihenfolge Punkt 1 und Punkt 2 markiert wurden und wo die Punkte markiert wurden.

    Ich habe folgendes ausprobiert:

    for (int j = p1.y; j <= p2.y; ++j)
    {
     for (int i = p1.x; i <= p2.x; ++i)
     {
      b[i, j].Markieren();
     }
    }
    
    for (int j = p2.y; j <= p1.y; ++j)
    {
     for (int i = p2.x; i <= p1.x; ++i)
     {
      b[i, j].Markieren();
     }
    }
    

    Leider erscheint mir das nicht elegant und es klappt auch nur von links oben nach rechts unten und umgekehrt.

    Hat jemand eine Idee, wie man das schöner und vorallem richtig umsetzen kann.

    Es ist halt einfach ein Feld der Größe FELD_X und FELD_Y geben und die Punkt(P1.X|P1.Y) und (P2.X|P2.Y).



  • uups, aus Vesehne kaputteditiert.



  • So wirklich hinbekommen tue ich es leider nicht. Vielleicht ist meine Schleife auch schon suboptimal. Könntest du etwas mehr Code zeigen?



  • Welche Sprache? In C und C++ ist b[i,j] NICHT b[i][j] oder meistens besser b[j][i]. b[i,j] ist b[j] und der Kommaoperator treibt sein böses Spiel.



  • Es handelt sich um C# 🙂 Das ist also nicht das Problem und vollkommen okay. 🙂



  • Dann ist

    if(p1.x>p2.x) swap(p1.x,p2.x);
    if(p1.y>p2.y) swap(p1.y,p2.y);
    for (int j = p1.y; j <= p2.y; ++j) 
    { 
     for (int i = p1.x; i <= p2.x; ++i) 
     { 
      b[i, j].Markieren(); 
     } 
    }
    

    ok, würde ich meinen.



  • Ich weiß nicht, ob ich es vielleicht falsch umgesetzt habe, aber es geht nur von unten rechts nach oben links. Ale anderen Varianten gehen nicht.


Anmelden zum Antworten