static void paste_track_insert(bg_nle_project_t * p, bg_nle_track_t * src, bg_nle_track_t * dst, gavl_time_t dst_pos, gavl_time_t dst_len) { int i; int start_seg = -1; /* Make room for pasted segments */ for(i = 0; i < dst->num_segments; i++) { if(dst->segments[i].dst_pos + dst->segments[i].len > dst_pos) { start_seg = i; break; } } if(start_seg >= 0) { /* Check whether to split the segment */ if(dst->segments[start_seg].dst_pos < dst_pos) { split_segment(p, dst, start_seg, dst_pos - dst->segments[start_seg].dst_pos, &p->undo_id); start_seg++; } for(i = dst->num_segments-1; i >= start_seg; i--) { move_segment(p, dst, i, dst->segments[i].dst_pos + dst_len, &p->undo_id); } } /* Insert new segments */ if(start_seg < 0) start_seg = 0; for(i = 0; i < src->num_segments; i++) { insert_segment(p, dst, start_seg + i, &src->segments[i], dst_pos + src->segments[i].dst_pos, &p->undo_id); } }
unsigned long long int nb_subtessellations(config_droites &stl,int i) { /* Implémente Algorithme 1 : calcul du nombre de sous-tessellations compatibles avec une sous-tessellation parrtielle donnée. */ /* Déterminer tous les segments de la droite numéro i compatibles avec la sous-tessellation partielle. */ comp_seg all_seg_i = compatible_segments(stl[0]); if((int) stl.size()==1) // On est sur la dernière droite { if (all_seg_i.size() > 0) //{ comp_seg::iterator seg=all_seg_i.end()-1; //last_stl[i][0] = (*seg)[0]; //last_stl[i][1] = (*seg)[1]; //last_stl[i][2] = stl[0].size(); //std::ofstream tracer("tracer.txt",std::ios::out); //for (int j=0;j<=i;j++) // tracer << j+5 << " : (" << last_stl[j][0] << "," << last_stl[j][1] <<")" << " taille : " << last_stl[j][2] << std::endl; //tracer.close(); //} return((unsigned long long int) all_seg_i.size()); } unsigned long long int nb = 0; // Nombre de sous-tessellations à calculer. for(comp_seg::iterator seg=all_seg_i.begin();seg<all_seg_i.end();seg++) { config_droites new_stl(stl.begin()+1,stl.end()); insert_segment(stl[0],new_stl,(*seg)[0],(*seg)[1],i+5); // Insertion segment // Incrémentation du nbre de sous-tessellations. */ //last_stl[i][0] = (*seg)[0]; //last_stl[i][1] = (*seg)[1]; //last_stl[i][2] = stl[0].size(); nb += nb_subtessellations(new_stl,i+1); } return(nb); }
bool TrapezoidSweep::next_step() { if (current_endpoint == NULL_POINT) { done = false; queue_it = queue.begin(); } if (queue_it == queue.end()) { done = true; return done; } endpoint p = queue_it->first; segment* s = queue_it->second; current_segment = *s; current_endpoint = p; x_sweep = p.x; // update y-coordinate of intersection with sweep line s->y_sweep = p.y; update_y_sweep(L_red); update_y_sweep(L_blue); finished_t.insert(finished_t.end(),current_t.begin(),current_t.end()); current_t.clear(); if (s->color == RED || p.type == LEFT) { add_trapezoid(*search(L_blue,s, 1),*search(L_blue,s,-1)); } else { add_trapezoid(*search(L_blue,s, 1),*s); add_trapezoid(*s,*search(L_blue,s,-1)); } // find the nearest s_blue in both directions if (s->color == RED || p.type == LEFT) { advance(search(L_blue,s, 1)); advance(search(L_blue,s,-1)); } // right blue segment else { advance(next(L_blue,s, 1)); advance(s); advance(next(L_blue,s,-1)); } // update both L_red and L_blue list if (p.type == LEFT) { if (s->color == RED) insert_segment(L_red , s); if (s->color == BLUE) insert_segment(L_blue, s); } else { if (s->color == RED) delete_segment(L_red , s); if (s->color == BLUE) delete_segment(L_blue, s); } ++queue_it; return done; }
static void paste_track_overwrite(bg_nle_project_t * p, bg_nle_track_t * src, bg_nle_track_t * dst, gavl_time_t dst_pos, gavl_time_t dst_len) { int i; int start_seg = -1; /* Make room for pasted segments */ i = 0; while(i < dst->num_segments) { /* ---------| |------------ */ /* ----| |----------------------- */ if(dst->segments[i].dst_pos + dst->segments[i].len < dst_pos) { i++; continue; } /* ---------| |------------ */ /* ----------------------| |----- */ else if(dst->segments[i].dst_pos >= dst_pos + dst_len) break; if(dst->segments[i].dst_pos < dst_pos) { /* ---------| |------------ */ /* ------| xxxxxxxx |------- */ if(dst->segments[i].dst_pos + dst->segments[i].len > dst_pos + dst_len) { split_segment(p, dst, i, dst_pos - dst->segments[i].dst_pos, &p->undo_id); i++; change_segment(p, dst, i, dst->segments[i].src_pos + gavl_time_scale(dst->segments[i].scale, dst_len+5), dst->segments[i].dst_pos + dst_len, dst->segments[i].len - dst_len, &p->undo_id); start_seg = i; break; } /* ---------| |------------ */ /* ------| xxxx|---------------- */ else { gavl_time_t diff = dst->segments[i].dst_pos + dst->segments[i].len - dst_pos; change_segment(p, dst, i, dst->segments[i].src_pos, dst->segments[i].dst_pos, dst->segments[i].len - diff, &p->undo_id); start_seg = i; i++; } } else { /* ---------| |------------ */ /* -------------|xxxx |------- */ if(dst->segments[i].dst_pos + dst->segments[i].len > dst_pos + dst_len) { gavl_time_t diff = dst_pos + dst_len - dst->segments[i].dst_pos; change_segment(p, dst, i, dst->segments[i].src_pos + gavl_time_scale(dst->segments[i].scale, diff+5), dst->segments[i].dst_pos + diff, dst->segments[i].len - diff, &p->undo_id); if(start_seg < 0) start_seg = i; break; } /* ---------| |------------ */ /* -----------|xx|---------------- */ else { delete_segment(p, dst, i, &p->undo_id); if(start_seg < 0) start_seg = i; } } } /* Insert new segments */ if(start_seg < 0) start_seg = 0; for(i = 0; i < src->num_segments; i++) { insert_segment(p, dst, start_seg + i, &src->segments[i], dst_pos + src->segments[i].dst_pos, &p->undo_id); } }