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; }
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; }
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); */ }