typedef std::multimap<int, int> EqTable;
int serialScan(QRect area, std::vector<Data>* points, byte epsilon1, byte epsilon2) {
int x, y, i, j, L = 0,
w = area.width(),
h = area.height();
bool binA, binB, binC;
EqTable eq_table;
for (y = area.y(); y < area.y() + h; y++) {
for (x = area.x(); x < area.x() + w; x++) {
int bx = (x - 1 < area.x()) ? x : x-1,
cy = (y - 1 < area.y()) ? y : y-1;
Data &A = matVecAt<Data>(x , y, _settings::current_image->height(), *points);
binA = (pixelBrightness(A.pixelInt()) >= epsilon1 && pixelBrightness(A.pixelInt()) <= epsilon2);
Data &B = matVecAt<Data>(bx, y, _settings::current_image->height(), *points);
Data &C = matVecAt<Data>(x, cy, _settings::current_image->height(), *points);
// binB = (pixelBrightness(B.pixelInt()) >= epsilon);
// binC = (pixelBrightness(C.pixelInt()) >= epsilon);
B.m = (bx == x) ? 0 : B.m;
C.m = (cy == y) ? 0 : C.m;
// if (!binB && !binC) A.m = ++L;
// else if (binB && !binC) A.m = B.m;
// else if (!binB && binC) A.m = C.m;
// else if (binB && binC) {
if (!binA) ;
else if (!B.m && !C.m) A.m = ++L;
else if (B.m && !C.m) A.m = B.m;
else if (!B.m && C.m) A.m = C.m;
else if (C.m && B.m) {
if (C.m == B.m) A.m = B.m;
else eq_table.insert(std::pair<int, int>(C.m, B.m));
}
}
}
std::vector<Data>::iterator it = points->begin(), jt;
EqTable::iterator f_it;
for (it; it != points->end(); ++it) {
if (!it->m) continue;
f_it = eq_table.find(it->m);
if (f_it != eq_table.end()) {
std::pair<EqTable::iterator, EqTable::iterator> labels = eq_table.equal_range(it->m);
for (labels.first; labels.first != labels.second; ++labels.first) {
for (jt = points->begin(); jt != points->end(); ++jt)
if (labels.second->second == jt->m)
jt->m = it->m;
}
eq_table.erase(it->m);
if (eq_table.empty()) break;
}
}