Ik heb een eenvoudige loop die een 2 dimensionaal array met kleuren doorloopt en kijkt of de kleur van de betreffende pixel zwart is. Als deze zwart is geef ik de pixel een nieuwe kleur en roep ik een recursieve functie aan die de kleur van de buurpixels bekijkt. Als deze ook zwart zijn geef ik ze weer een nieuwe kleur en bekijk ik ook de buurpixels van deze pixels weer totdat er geen aaneengesloten zwarte pixels meer gevonden worden.
Dit werkt goed op kleine afbeeldingen maar bij grote afbeeldingen van 8192 * 8192 pixels krijg ik al snel een StackOverflowException. Ik houd een counter bij om te meten wanneer dit gebeurd, dit gebeurd bij ongeveer 8000 calls al.
Ik heb al wat dingetjes geprobeerd om de functie kleiner te maken maar helaas zonder succes. Hopelijk ziet iemand wat ik hier fout doe want ik kan me niet voorstellen dat 8000 calls zoveel ruimte op de stack innemen.
Dit is de recursieve functie die de de buurpixels van een bepaalde pixel bekijkt:
Vector is een klasse bestaande uit een int x en y.
Building is een eenvoudige klasse die bestaat uit een lijstje met Vectoren en een kleur die gebruikt wordt als label.
De labelPixel functie geeft de pixels een andere kleur en voegt de Vectoren toe aan de lijst uit Building
Dit werkt goed op kleine afbeeldingen maar bij grote afbeeldingen van 8192 * 8192 pixels krijg ik al snel een StackOverflowException. Ik houd een counter bij om te meten wanneer dit gebeurd, dit gebeurd bij ongeveer 8000 calls al.
Ik heb al wat dingetjes geprobeerd om de functie kleiner te maken maar helaas zonder succes. Hopelijk ziet iemand wat ik hier fout doe want ik kan me niet voorstellen dat 8000 calls zoveel ruimte op de stack innemen.
Dit is de recursieve functie die de de buurpixels van een bepaalde pixel bekijkt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| private void checkNeighbours(Vector location, ref Building newBuilding) { stackCount++; //Check the pixel left of us if (location.x != 0 && buildingMapArray2D[location.x - 1, location.y] == Color.black) { Vector newLocation = new Vector(location.x - 1, location.y); labelPixel(newLocation, ref newBuilding); checkNeighbours(newLocation, ref newBuilding); } //Check the right left of us if (location.x != (width - 1) && buildingMapArray2D[location.x + 1, location.y] == Color.black) { Vector newLocation = new Vector(location.x + 1, location.y); labelPixel(newLocation, ref newBuilding); checkNeighbours(newLocation, ref newBuilding); } //Check the pixel above us if (location.y != 0 && buildingMapArray2D[location.x, location.y - 1] == Color.black) { Vector newLocation = new Vector(location.x, location.y - 1); labelPixel(newLocation, ref newBuilding); checkNeighbours(newLocation, ref newBuilding); } //Check the pixel below us if (location.y != (height - 1) && buildingMapArray2D[location.x, location.y + 1] == Color.black) { Vector newLocation = new Vector(location.x, location.y + 1); labelPixel(newLocation, ref newBuilding); checkNeighbours(newLocation, ref newBuilding); } } |
Vector is een klasse bestaande uit een int x en y.
C#:
1
2
3
4
5
6
7
8
9
10
| class Vector { public int x, y; public Vector(int x, int y) { this.x = x; this.y = y; } } |
Building is een eenvoudige klasse die bestaat uit een lijstje met Vectoren en een kleur die gebruikt wordt als label.
C#:
1
2
3
4
5
6
7
8
9
10
11
| class Building { public List<Vector> buildingPixels; public Color32 labelColor; public Building(Color32 labelColor) { this.labelColor = labelColor; buildingPixels = new List<Vector>(); } } |
De labelPixel functie geeft de pixels een andere kleur en voegt de Vectoren toe aan de lijst uit Building
C#:
1
2
3
4
5
| private void labelPixel(Vector location, ref Building building) { building.buildingPixels.Add(location); buildingMapArray2D[location.x, location.y] = building.labelColor; } |