void CL_OutlineTriangulator::next_polygon()
{
	next_contour();
	if (impl->current_polygon.contours.empty()) return;
	impl->polygons.push_back(impl->current_polygon);
	impl->current_polygon = CL_OutlineTriangulator_Polygon();
}
Example #2
0
void startcontour(double *data,int x,int y,double cut, double **cont,
		  int *index,int startdir[2],int *charact,int periodic,
		  int *boundary)
{
  int dirmode,dir[2],endcontour=0;
  double d0,d3,cutp;

  *boundary=0;
  *charact=0;
  dir[0]=startdir[0];
  dir[1]=startdir[1];
  if (dir[0]==0) dirmode=vertical; else dirmode=horizontal;
  set_exclude(x,y,dirmode,1);
  d0=data[(*ind)(x,y)];
  d3=data[(*ind)(x+abs(dir[1]),y+abs(dir[0]))];
  cutp=(cut-d0)/(d3-d0);
  (*cont)[*index*2]=x+abs(dir[1])*cutp;
  (*cont)[*index*2+1]=y+abs(dir[0])*cutp;
  (*index)++;
  if((*index)>=indexmax)
    {
      indexmax+=contl;
      *cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
      if (*cont==NULL) { 
	fprintf(stderr,"Error in realloc in contour() for *cont\n"); 
	exit(1);}
      if (*index> 4*lattx*latty) {
	fprintf(stderr,
		"contour.c: startcontour:"
		"More contour points than lattice points %d",
		*index);
	return;
      }
    }
  
  for(;0==endcontour;(*index)++){
    
    if((*index)>=indexmax)
      {
	indexmax+=contl;
	*cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
	if (*cont==NULL) { fprintf(stderr,"Error in malloc in contour()" 
				   " for *cont\n"); 
			   exit(1);}
	if (*index>4*lattx*latty) return; 
      }
    endcontour=next_contour(data,cut,&x,&y,dir,&(*cont)[*index*2],
			    &(*cont)[*index*2+1],charact,periodic,
			    boundary);
  }

  if((*index)>=indexmax)
    {
      indexmax+=contl;
      *cont=(double*)realloc(*cont,(indexmax*2+10)*sizeof(double));
      if (*cont==NULL) { fprintf(stderr,"Error in malloc in contour()" 
				 " for *cont\n"); 
			 exit(1);}
      if (*index>4*lattx*latty) return; 
    }
}