Beispiel #1
0
int find_quad_center(VertType *vert_ary, short *vert_ind_ary,
					 int poly_num, VertType *ret_vt)
{
    int res;
    double dist0=1e14,dist1=1e14;
    VertType *p0,*p1,*p2,*p3,pt1,pt2;
	
    if(poly_num!=4)
	{
		printf("Error! find_quad_center(poly_num=%d)\n",poly_num);
		return 0;
    }
    
	p0=&(vert_ary[vert_ind_ary[0]]);
    p1=&(vert_ary[vert_ind_ary[1]]);
    p2=&(vert_ary[vert_ind_ary[2]]);
    p3=&(vert_ary[vert_ind_ary[3]]);
	
    pt1[0]=((*p0)[0] + (*p2)[0])/2.0;
    pt1[1]=((*p0)[1] + (*p2)[1])/2.0;
    pt2[0]=((*p1)[0] + (*p3)[0])/2.0;
    pt2[1]=((*p1)[1] + (*p3)[1])/2.0;
    
	res=is_inside_contour(&pt1,vert_ary, vert_ind_ary, 4, NULL,NULL);
    if(res)dist0=line_distance_2d(p0,p2);
    
	res=is_inside_contour(&pt2,vert_ary, vert_ind_ary, 4, NULL,NULL);
    
	if(res)dist1=line_distance_2d(p1,p3);
    
	if(dist0 <1e10 && dist1<1e10)
	{
		(*ret_vt)[0]=(pt1[0]+pt2[0])/2.0;
		(*ret_vt)[1]=(pt1[1]+pt2[1])/2.0;
		return 1;
    }
    
	if(dist0>dist1)
	{
		(*ret_vt)[0]=pt2[0];
		(*ret_vt)[1]=pt2[1];
		return 1;
    }
    
	if(dist0<dist1)
	{
		(*ret_vt)[0]=pt1[0];
		(*ret_vt)[1]=pt1[1];
		return 1;
    }
    else return 0;
}
Beispiel #2
0
double calc_edge_distance_2d_of_a_poly(VertType *vert_ary, short *vert_ind_ary, 
									   int poly_num, double *dist_ary)
{
    int i,j;
    double dist;

    for(i=0; i<poly_num; i++)
	{
        j=i+1;
        if(j>=poly_num)j=0;
        dist = line_distance_2d(&vert_ary[vert_ind_ary[i]],
			&vert_ary[vert_ind_ary[j]]);
        dist_ary[i]=sqrt(dist);
    }
    
	dist=0.0;
    for(i=0; i<poly_num; i++)dist+=dist_ary[i];
    return dist;
}
Beispiel #3
0
void find_best_tiling_group_to_group(int topdown,
									 VertType *lines_ary0, VertType *lines_ary1,
									 short *new_group_ary0, short ary_ind0, int group0,
									 short *new_group_ary1, short ary_ind1, int group1,
									 TileType *best_tiling_tab0, TileType *best_tiling_tab1)
{
#define ARY_SIZE1 2000
    int i,j,k;
    int i1,j1;
    int result,not_shortest_cnt=0;
    double min_dist;
    double dist_ary[ARY_SIZE1];
    int dist_ind_ary[ARY_SIZE1];
    /* use the stupidest search */

    for(j=0; j<ary_ind0; j++)
	{
		min_dist=best_tiling_tab0[j].dist;
		if(min_dist>0.000001)
		{
			if(ary_ind1>=ARY_SIZE1)
			{
				fprintf(stderr,"dist_ary[2000] overflow, ary_ind1=%d\n",ary_ind1);
				printf("dist_ary[2000] overflow, ary_ind1=%d\n",ary_ind1);
				exit(1);
			}
			
			j1=new_group_ary0[j];
			
			for(i=0; i<ary_ind1; i++)
			{
				i1=new_group_ary1[i];
				dist_ary[i]=line_distance_2d(&lines_ary0[j1], &lines_ary1[i1]);
				dist_ind_ary[i]=i;
			}
			
			quick_sort(dist_ary, dist_ind_ary, ary_ind1);
			/*
			if(j==65 && group0==1 && group1==1)
			debug_pt();
			*/
			i=0;
			
			while(i<ary_ind1)
			{ /* try the shortest first */
				k=dist_ind_ary[i]; /* the index of shortest */
				i1=new_group_ary1[k];
				if(dist_ary[k]>=min_dist)break;
			
				if(dist_ary[k]<=0.000001) 
				{ /* overlapping point */
					if(!(best_tiling_tab0[j].and_or&2)) /* overlapping */
						if(!SILENT)printf("**** Warning find_best_tiling_group_to_group(), dist=%.10lf topdown=%d, %d %d\n",
							dist_ary[k], topdown,group0,j); 
						result=1;
				}
				else 
				{
					if(topdown)
						result=is_line_legal(0, &lines_ary1[i1], &lines_ary0[j1],
						&(best_tiling_tab1[k]),
						&(best_tiling_tab0[j]));
					else 
						result=is_line_legal(0, &lines_ary0[j1], &lines_ary1[i1],
						&(best_tiling_tab0[j]),
						&(best_tiling_tab1[k]));
				}
				if(result) 
				{
					min_dist=dist_ary[k];
					best_tiling_tab0[j].dist=(float) min_dist;
					best_tiling_tab0[j].group=group1;
					best_tiling_tab0[j].ind=k;
					if(i>0)not_shortest_cnt++;
					break;
				}
				i++;
			}
		}
    }
	/*
    printf("ind0=%d ind1=%d, %d pts are not shortest\n",
	ary_ind0,ary_ind1,not_shortest_cnt);
	*/
}