static void tst9() { std::cout << "--------------------------------\n"; imdd_manager m; imdd_ref d2(m), d3(m); d2 = m.mk_empty(5); add_5tuple(m, d2, 2,2, 3,3, 1, 1, 5, 10, 100, 200); std::cout << mk_ll_pp(d2, m) << "\n"; add_5tuple(m, d2, 2,2, 3,3, 1, 1, 15, 20, 100, 200); std::cout << mk_ll_pp(d2, m) << "\n"; add_5tuple(m, d2, 4,4, 5,5, 1, 1, 5, 10, 100, 200); std::cout << mk_ll_pp(d2, m) << "\n"; add_5tuple(m, d2, 4,4, 5,5, 1, 1, 15, 20, 100, 200); std::cout << mk_ll_pp(d2, m) << "\n"; m.mk_swap(d2, d3, 2); std::cout << "after swap 2<->3\n"; std::cout << mk_ll_pp(d3, m) << "\n"; }
void filterSegments(ntuple_list ntl_in, ntuple_list ntl_out , float distance_thr){ int i,j,k,l; double dist[4], dist3[4]; double angle, anglej, anglei; int marker_id = 0; int count = 0; int index[4]; segment seg[4]; segment segi; /*use width field to flag marker id - initialize*/ for (j=0;j<ntl_in->size;j++) ntl_in->values[4+j*ntl_in->dim] = 0; /*search for markers of the form of 4 conex segments*/ for (j=0;j<ntl_in->size;j++){ if (ntl_in->values[4+j*ntl_in->dim] == 0){ index[0] = j; seg[0] = segmentNew(ntl_in->values[0+j*ntl_in->dim], ntl_in->values[1+j*ntl_in->dim], ntl_in->values[2+j*ntl_in->dim], ntl_in->values[3+j*ntl_in->dim], ntl_in->values[4+j*ntl_in->dim]); dist[0] = 0; dist[1] = 0; dist[2] = 0; dist[3] = 0; /*search for 2 conex segments to seg1*/ for (i=0;i<ntl_in->size;i++){ //for (i=j+1;i<ntl_in->size;i++){ if (ntl_in->values[4+i*ntl_in->dim] == 0){ segi = segmentNew(ntl_in->values[0+i*ntl_in->dim], ntl_in->values[1+i*ntl_in->dim], ntl_in->values[2+i*ntl_in->dim], ntl_in->values[3+i*ntl_in->dim], ntl_in->values[4+i*ntl_in->dim]); if (!dist[0] && !dist[1]) { //seg[0] p1 endpoint not matched yet dist[0] = ( pow(seg[0].p1[1]-segi.p1[1],2) + pow(seg[0].p1[2]-segi.p1[2],2) ) < distance_thr; dist[1] = ( pow(seg[0].p1[1]-segi.p2[1],2) + pow(seg[0].p1[2]-segi.p2[2],2) ) < distance_thr; if (dist[0] || dist[1]) { // p1 match seg[1] = segmentNew(ntl_in->values[0+i*ntl_in->dim], ntl_in->values[1+i*ntl_in->dim], ntl_in->values[2+i*ntl_in->dim], ntl_in->values[3+i*ntl_in->dim], ntl_in->values[4+i*ntl_in->dim]); index[1] = i; }; }; if (!dist[2] && !dist[3]) { //seg[0] p2 endpoint not matched yet dist[2] = ( pow(seg[0].p2[1]-segi.p1[1],2) + pow(seg[0].p2[2]-segi.p1[2],2) ) < distance_thr; dist[3] = ( pow(seg[0].p2[1]-segi.p2[1],2) + pow(seg[0].p2[2]-segi.p2[2],2) ) < distance_thr; if (dist[2] || dist[3]) { // p2 match seg[2] = segmentNew(ntl_in->values[0+i*ntl_in->dim], ntl_in->values[1+i*ntl_in->dim], ntl_in->values[2+i*ntl_in->dim], ntl_in->values[3+i*ntl_in->dim], ntl_in->values[4+i*ntl_in->dim]); index[2] = i; }; }; if ( (dist[0] || dist[1]) && (dist[2] || dist[3]) ) { //conex segments found, find the last k = 0; while (k<ntl_in->size){ if ( (k!=index[0]) && (k!=index[1]) && (k!=index[2]) ){ seg[3] = segmentNew(ntl_in->values[0+k*ntl_in->dim], ntl_in->values[1+k*ntl_in->dim], ntl_in->values[2+k*ntl_in->dim], ntl_in->values[3+k*ntl_in->dim], ntl_in->values[4+k*ntl_in->dim]); if (dist[0] && dist[2]) { //seg[0].p1 matched seg[1].p1 and seg[0].p2 matched seg[2].p1 dist3[0] = ( pow(seg[1].p2[1]-seg[3].p1[1],2) + pow(seg[1].p2[2]-seg[3].p1[2],2) ) < distance_thr; dist3[1] = ( pow(seg[2].p2[1]-seg[3].p2[1],2) + pow(seg[2].p2[2]-seg[3].p2[2],2) ) < distance_thr; dist3[2] = ( pow(seg[1].p2[1]-seg[3].p2[1],2) + pow(seg[1].p2[2]-seg[3].p2[2],2) ) < distance_thr; dist3[3] = ( pow(seg[2].p2[1]-seg[3].p1[1],2) + pow(seg[2].p2[2]-seg[3].p1[2],2) ) < distance_thr; } else if (dist[0] && dist[3]){ //seg[0].p1 matched seg[1].p1 and seg[0].p2 matched seg[2].p2 dist3[0] = ( pow(seg[1].p2[1]-seg[3].p1[1],2) + pow(seg[1].p2[2]-seg[3].p1[2],2) ) < distance_thr; dist3[1] = ( pow(seg[2].p1[1]-seg[3].p2[1],2) + pow(seg[2].p1[2]-seg[3].p2[2],2) ) < distance_thr; dist3[2] = ( pow(seg[1].p2[1]-seg[3].p2[1],2) + pow(seg[1].p2[2]-seg[3].p2[2],2) ) < distance_thr; dist3[3] = ( pow(seg[2].p1[1]-seg[3].p1[1],2) + pow(seg[2].p1[2]-seg[3].p1[2],2) ) < distance_thr; } else if (dist[1] && dist[2]){ //seg[0].p1 matched seg[1].p2 and seg[0].p2 matched seg[2].p1 dist3[0] = ( pow(seg[1].p1[1]-seg[3].p1[1],2) + pow(seg[1].p1[2]-seg[3].p1[2],2) ) < distance_thr; dist3[1] = ( pow(seg[2].p2[1]-seg[3].p2[1],2) + pow(seg[2].p2[2]-seg[3].p2[2],2) ) < distance_thr; dist3[2] = ( pow(seg[1].p1[1]-seg[3].p2[1],2) + pow(seg[1].p1[2]-seg[3].p2[2],2) ) < distance_thr; dist3[3] = ( pow(seg[2].p2[1]-seg[3].p1[1],2) + pow(seg[2].p2[2]-seg[3].p1[2],2) ) < distance_thr; } else if (dist[1] && dist[3]){ //seg[0].p1 matched seg[1].p2 and seg[0].p2 matched seg[2].p2 dist3[0] = ( pow(seg[1].p1[1]-seg[3].p1[1],2) + pow(seg[1].p1[2]-seg[3].p1[2],2) ) < distance_thr; dist3[1] = ( pow(seg[2].p1[1]-seg[3].p2[1],2) + pow(seg[2].p1[2]-seg[3].p2[2],2) ) < distance_thr; dist3[2] = ( pow(seg[1].p1[1]-seg[3].p2[1],2) + pow(seg[1].p1[2]-seg[3].p2[2],2) ) < distance_thr; dist3[3] = ( pow(seg[2].p1[1]-seg[3].p1[1],2) + pow(seg[2].p1[2]-seg[3].p1[2],2) ) < distance_thr; }; if ( (dist3[0] && dist3[1]) || (dist3[2] && dist3[3]) ) { /*success! marker found*/ index[3] = k; marker_id++; for (l=0;l<4;l++){ add_5tuple( ntl_out, //add marker segments to output list ntl_in->values[0+index[l]*ntl_in->dim], ntl_in->values[1+index[l]*ntl_in->dim], ntl_in->values[2+index[l]*ntl_in->dim], ntl_in->values[3+index[l]*ntl_in->dim], marker_id); ntl_in->values[4+j*ntl_in->dim] = marker_id; //burn segments used }; break; }; }; k++; }; }; }; }; }; }; };