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.