Einzelnen Beitrag anzeigen

Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Regionen erkennen aus einer Matrix

  Alt 9. Jan 2011, 13:03
Das grundsätzliche Vorgehen das ich wählen würde sieht so aus:

Wenn du nicht nur die Anzahl der Regionen nund deren Felder haben willst, sondern auch die Zuordnung Punkt => Region dann musst du eine Integer-Array hernehmen. Ich definiere mir jetzt mal folgende Werte:
-1 : Zu zählender Punkt
-2 : Zu ignorierender Punkt
>=0: Punkt gehört zu der Region mit dem Index

Zuerst: Schreib eine rekursive Funktion, die dir die umliegenden Felder abklappert und zu einer Region verbindet. Klingt kompliziert, ist es aber nicht.
Dann: Alle Felder durchgehen und für jedes Feld die Funktion aufrufen.

Zu Punkt 1:
Delphi-Quellcode:
function MakeRegions(const Map: Array of Integer; index, regionindex, width: Integer): Integer;
Result := 0;
if (index >= 0) and (index < length(Map)) then
if Map[index] == -1 then
begin
  Map[index] = regionindex;
  Result := 1;

  Result += MakeRegions(Map, index + 1, regionindex, width);
  Result += MakeRegions(Map, index - 1, regionindex, width);
  Result += MakeRegions(Map, index + width, regionindex, width);
  Result += MakeRegions(Map, index - width, regionindex, width);
end;
Sowas in der Richtung. Ist jetzt ein wenig gemischter Code aber der Gedanke soll klar werden.

Aufruf dann für jeden Punkt:
Delphi-Quellcode:
  for o := 0 to length(Map) - 1 do
    begin
     MakeRegions(Map, i, i, width);
    end;
Falls der Rückgabewert > 0 ist, wurde eine neue Region gefunden, mit der angegebenen Zahl von Feldern.
Das Array sollte nur mit -1 und -2 initialisiert sein. Danach kannst du anhand des Werts im Array die Region ablesen, zu der der Punkt gehört.
  Mit Zitat antworten Zitat