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 ONun 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 OWie 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 ODabei 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.