20#include "hdrl_cat_apclust.h"
22#include "hdrl_cat_terminate.h"
26static void minmax_xy( cpl_size np, plstruct *plstr,
27 cpl_size *ix1, cpl_size *ix2,
28 cpl_size *iy1, cpl_size *iy2);
63 double i2compare = ap->thresh;
64 double icompare = i2compare * (double)ap->multiply;
68 cpl_size ix1, ix2, iy1, iy2;
69 minmax_xy(np, plstr, &ix1, &ix2, &iy1, &iy2);
71 cpl_size nx = ix2 - ix1 + 1;
72 cpl_size ny = iy2 - iy1 + 1;
74 cpl_size nwork = nx * ny;
75 cpl_size *work = cpl_malloc(nwork *
sizeof(cpl_size));
77 for (cpl_size i = 0; i < nwork; i++) {
81 for (cpl_size k = 0; k < np; k++) {
83 cpl_size i = plstr[k].x - 1;
84 cpl_size j = plstr[k].y - 1;
86 cpl_size kk = (j - iy1) * nx + i - ix1;
91 for (cpl_size j = iy1; j <= iy2; j++) {
93 for (cpl_size i = ix1; i <= ix2; i++) {
95 cpl_size kk = (j - iy1) * nx + i - ix1;
96 cpl_size k = work[kk];
100 ap->lastline[i + 1] = 0;
104 if (plstr[k].zsm > icompare) {
107 cpl_size is = ap->lastline[i];
108 cpl_size ip = ap->lastline[i + 1];
116 if (ap->ipstack > ap->maxpa * 3 / 4) {
117 for (cpl_size ik = 0; ik < ap->maxpa * 3 / 8; ik++) {
122 ip = ap->pstack[ap->ipstack++];
124 ap->parent[ip].first = ap->bstack[ap->ibstack];
125 ap->parent[ip].pnop = 0;
126 ap->parent[ip].pnbp = 0;
127 ap->parent[ip].growing = 0;
130 ap->parent[ip].touch = 1;
132 ap->parent[ip].touch = 0;
136 if (ip > ap->maxip) {
146 }
else if ((ip > 0 && is > 0) && (ip != is)) {
149 ap->blink[ap->parent[ip].last] = ap->parent[is].first;
152 ap->parent[ip].last = ap->parent[is].last;
153 ap->parent[ip].pnop += ap->parent[is].pnop;
154 ap->parent[ip].pnbp += ap->parent[is].pnbp;
157 cpl_size ib = ap->parent[is].first;
162 cpl_size i1 = ap->plessey[ib].x;
164 if (ap->lastline[i1 + 1] == is) {
165 ap->lastline[i1 + 1] = ip;
168 if (ap->parent[is].last == ib) {
176 ap->parent[is].pnop = -1;
177 ap->parent[is].pnbp = -1;
180 ap->pstack[--ap->ipstack] = is;
184 cpl_size ib = ap->bstack[ap->ibstack++];
187 if (ap->parent[ip].pnop > 0) {
188 ap->blink[ap->parent[ip].last] = ib;
192 ap->parent[ip].last = ib;
195 ap->plessey[ib].x = i;
196 ap->plessey[ib].y = j;
197 ap->plessey[ib].z = plstr[k].z;
198 ap->plessey[ib].zsm = plstr[k].zsm;
201 ap->parent[ip].pnop++;
204 ap->lastline[i + 1] = ip;
209 ap->lastline[i + 1] = 0;
218 if (ap->lastline[1] > 0) {
219 ap->parent[ap->lastline[1]].touch |= 2;
222 if (ap->lastline[ap->lsiz] > 0) {
223 ap->parent[ap->lastline[ap->lsiz]].touch |= 4;
251static void minmax_xy( cpl_size np, plstruct *plstr,
252 cpl_size *ix1, cpl_size *ix2,
253 cpl_size *iy1, cpl_size *iy2)
259 *ix1 = plstr[0].x - 1;
260 *ix2 = plstr[0].x - 1;
262 *iy1 = plstr[0].y - 1;
263 *iy2 = plstr[0].y - 1;
265 for (cpl_size i = 1; i < np; i++) {
267 *ix1 = CPL_MIN(*ix1, plstr[i].x - 1);
268 *ix2 = CPL_MAX(*ix2, plstr[i].x - 1);
269 *iy1 = CPL_MIN(*iy1, plstr[i].y - 1);
270 *iy2 = CPL_MAX(*iy2, plstr[i].y - 1);
void hdrl_apclust(ap_t *ap, cpl_size np, plstruct *plstr)
Detect multiple objects from a given Plessey array.
void hdrl_apfu(ap_t *ap)
Get rid of the largest contributor in an ap structure.