Example #1
0
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);
    }
  
  }
Example #2
0
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;
}
Example #4
0
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);
    }
  
  }