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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
int TfusionSize = min ( USHRT_MAX, 8 +(width*height)/8);
int* Tfusion = (int*)malloc(TfusionSize * sizeof(int));
if(Tfusion == NULL) return GIPS_ERR_ALLOC;
memset(Tfusion,0,sizeof(int) * TfusionSize );
Tfusion[0]=0;
Tfusion[1]=1;
int NextLabel = 1;
TD[0][0] = NextLabel;
Tfusion[NextLabel] = NextLabel;
if (NextLabel < TfusionSize)NextLabel++;
for(x=1; x<width; x++) {
if (TS[0][x] == TS[0][x-1]) {
TD[0][x] = TD[0][x-1];
} else {
TD[0][x] = NextLabel;
Tfusion[NextLabel] = NextLabel;
if (NextLabel < (TfusionSize - 2)) NextLabel++;
}
}
for(y=1; y<height; y++)
{
if (TS[y][0] == TS[y-1][0]) {
TD[y][0] = TD[y-1][0];
} else {
TD[y][0] = NextLabel;
Tfusion[NextLabel] = NextLabel;
if (NextLabel < (TfusionSize - 2)) NextLabel++;
}
for(x=1; x<width; x++)
{
int p1 = TD[y][x-1];
int p2 = TD[y-1][x];
if (TS[y][x] == TS[y][x-1] ) {
if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
while (Tfusion[p1]!=p1){
p1 = Tfusion[p1];
}
while (Tfusion[p2]!=p2){
p2 = Tfusion[p2];
}
if (p2>p1){
TD[y][x] = Tfusion[p2] = p1;
} else {
TD[y][x] = Tfusion[p1] = p2;
}
} else {
TD[y][x] = TD[y][x-1];
}
} else if (TS[y][x] == TS[y-1][x] ) {
if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
while (Tfusion[p1]!=p1){
p1 = Tfusion[p1];
}
while (Tfusion[p2]!=p2){
p2 = Tfusion[p2];
}
if (p2>p1){
TD[y][x] = Tfusion[p2] = p1;
} else {
TD[y][x] = Tfusion[p1] = p2;
}
}
else {
TD[y][x] = TD[y-1][x];
}
}
else {
TD[y][x] = NextLabel;
Tfusion[NextLabel] = NextLabel;
if (NextLabel < TfusionSize-2 ) NextLabel++;
else{
NextLabel = TfusionSize ;
}
}
}
}
if (NextLabel>=TfusionSize) {
free(Tfusion);
return GIPS_ERR_OUT_OF_BOUND;
} |
Partager