// -- Constructs the ``ccs'' array from run's ccids. void CCImage::make_ccs_from_ccids() { int n; Run *pruns = runs; // Find maximal ccid int maxccid = -1; for (n=0; n<=runs.hbound(); n++) if (pruns[n].ccid > maxccid) maxccid = runs[n].ccid; GTArray<int> armap(0,maxccid); int *rmap = armap; // Renumber ccs for (n=0; n<=maxccid; n++) armap[n] = -1; for (n=0; n<=runs.hbound(); n++) if (pruns[n].ccid >= 0) rmap[ pruns[n].ccid ] = 1; int nid = 0; for (n=0; n<=maxccid; n++) if (rmap[n] > 0) rmap[n] = nid++; // Adjust nregularccs (since ccs are renumbered) while (nregularccs>0 && rmap[nregularccs-1]<0) nregularccs -= 1; if (nregularccs>0) nregularccs = 1 + rmap[nregularccs-1]; // Prepare cc descriptors ccs.resize(0,nid-1); for (n=0; n<nid; n++) ccs[n].nrun = 0; // Relabel runs for (n=0; n<=runs.hbound(); n++) { Run &run = pruns[n]; if (run.ccid < 0) continue; // runs with negative ccids are destroyed int oldccid = run.ccid; int newccid = rmap[oldccid]; CC &cc = ccs[newccid]; run.ccid = newccid; cc.nrun += 1; } // Compute positions for runs of cc int frun = 0; for (n=0; n<nid; n++) { ccs[n].frun = rmap[n] = frun; frun += ccs[n].nrun; } // Copy runs GTArray<Run> rtmp; rtmp.steal(runs); Run *ptmp = rtmp; runs.resize(0,frun-1); pruns = runs; for (n=0; n<=rtmp.hbound(); n++) { int id = ptmp[n].ccid; if (id < 0) continue; int pos = rmap[id]++; pruns[pos] = ptmp[n]; } // Finalize ccs for (n=0; n<nid; n++) { CC &cc = ccs[n]; int npix = 0; runs.sort(cc.frun, cc.frun+cc.nrun-1); Run *run = &runs[cc.frun]; int xmin = run->x1; int xmax = run->x2; int ymin = run->y; int ymax = run->y; cc.color = run->color; for (int i=0; i<cc.nrun; i++, run++) { if (run->x1 < xmin) xmin = run->x1; if (run->x2 > xmax) xmax = run->x2; if (run->y < ymin) ymin = run->y; if (run->y > ymax) ymax = run->y; npix += run->x2 - run->x1 + 1; } cc.npix = npix; cc.bb.xmin = xmin; cc.bb.ymin = ymin; cc.bb.xmax = xmax + 1; cc.bb.ymax = ymax + 1; } }