[ create a new paste ] login | about

Link: http://codepad.org/Jlp4Cupo    [ raw code | fork ]

C++, pasted on May 16:
    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;
            }
       }


Create a new paste based on this one


Comments: