double check_multiple( double * tgt, double * src, int & ind, IntList & nb, SeedList & seeds, double & tolerance, int & nx, int & ny ) { if ( nb.size() == 1 ) return nb.front(); if ( nb.size() < 1 ) return 0.0; // dumb protection double diff, maxdiff = 0.0, res = 0.0; int i; IntList::iterator it; SeedList::iterator sit; PointXY ptsit, pt = pointFromIndex( ind, nx ); double distx, dist = FLT_MAX; /* maxdiff */ for ( it = nb.begin(); it != nb.end(); it++ ) { if ( !get_seed( seeds, *it, sit ) ) continue; diff = fabs( src[ ind ] - src[ (*sit).index ] ); if ( diff > maxdiff ) { maxdiff = diff; /* assign result to the steepest until and if it not assigned to closest over the tolerance */ if ( dist == FLT_MAX ) res = *it; } /* we assign to the closest centre which is above tolerance, if none than to maxdiff */ if ( diff >= tolerance ) { ptsit = pointFromIndex( (*sit).index, nx ); distx = distanceXY( pt, ptsit); if ( distx < dist ) { dist = distx; res = * it; } } } /* assign all that need assignment to res, which has maxdiff */ for ( it = nb.begin(); it != nb.end(); it++ ) { if ( *it == res ) continue; if ( !get_seed( seeds, *it, sit ) ) continue; if ( fabs( src[ ind ] - src[ (*sit).index ] ) >= tolerance ) continue; for ( i = 0; i < nx * ny; i++ ) if ( tgt[ i ] == *it ) tgt[ i ] = res; seeds.erase( sit ); } return res; }
void highway(Way *way, short coord_y[way->size],short coord_x[way->size],int thick){ Sint16 coord_xNode[4] = {0.0,0.0,0.0,0.0}; Sint16 coord_yNode[4] = {0.0,0.0,0.0,0.0}; int i; for(i = 1;i < way->size;i++){ if(i == 1){ float length = distanceXY(coord_x[i-1],coord_y[i-1],coord_x[i],coord_y[i]); float fx = normalize(coord_y[i-1],coord_y[i],length); float gx = fx; float fy = 0.0-normalize(coord_x[i-1],coord_x[i],length); float gy = fy; coord_xNode[0] = fx; coord_xNode[1] = gx; coord_yNode[0] = fy; coord_yNode[1] = gy; float coeff = (coord_y[i-1]-coord_y[i])/(coord_x[i-1]-coord_x[i]); if(coeff>0){ extremite(coord_x[i-1],fx*thick/2,gx*thick/2,coord_xNode,1,1); extremite(coord_y[i-1],fy*thick/2,gy*thick/2,coord_yNode,1,1); } else{ extremite(coord_x[i-1],fx*thick/2,gx*thick/2,coord_xNode,0,1); extremite(coord_y[i-1],fy*thick/2,gy*thick/2,coord_yNode,0,1); } } if(i==way->size-1){ int j; for(j=0;j<4;j++){ printf("Fin X : %d, Y %d\n",coord_xNode[j],coord_yNode[j] ); } printf("\n"); float length = distanceXY(coord_x[i-1],coord_y[i-1],coord_x[i],coord_y[i]); float fx = normalize(coord_y[i-1],coord_y[i],length); float gx = fx; float fy = 0.0-normalize(coord_x[i-1],coord_x[i],length); float gy = fy; coord_xNode[2] = fx; coord_xNode[3] = gx; coord_yNode[2] = fy; coord_yNode[3] = gy; float coeff = (coord_y[i-1]-coord_y[i])/(coord_x[i-1]-coord_x[i]); if(coeff>0){ extremite(coord_x[i],fx*thick/2,gx*thick/2,coord_xNode,1,2); extremite(coord_y[i],fy*thick/2,gy*thick/2,coord_yNode,1,2); } else{ extremite(coord_x[i],fx*thick/2,gx*thick/2,coord_xNode,0,2); extremite(coord_y[i],fy*thick/2,gy*thick/2,coord_yNode,0,2); } for(j=0;j<4;j++){ printf("Fin XX : %d, Y %d\n",coord_xNode[j],coord_yNode[j] ); } printf("\n"); filledPolygonRGBA(renderer,coord_xNode,coord_yNode,4,255,0,0,255); } else{ float lengthAB = distanceXY(coord_x[i-2],coord_y[i-2],coord_x[i-1],coord_y[i-1]); float resABy = normalize(coord_y[i-2],coord_y[i-1],lengthAB); float resABx = normalize(coord_x[i-2],coord_x[i-1],lengthAB); float lengthBC = distanceXY(coord_x[i-1],coord_y[i-1],coord_x[i],coord_y[i]); float resBCx = normalize(coord_x[i-1],coord_x[i],lengthBC); float resBCy = normalize(coord_y[i-1],coord_y[i],lengthBC); float X = (resABx - resBCx)*thick/2; float Y = (resABy - resBCy)*thick/2; double angleCal = angle(coord_x[i-2],coord_y[i-2],coord_x[i-1],coord_y[i-1],coord_x[i],coord_y[i]); if(angleCal >0){ midle(coord_x[i-1],X,0,coord_xNode); midle(coord_y[i-1],Y,0,coord_yNode); } else{ midle(coord_x[i-1],X,1,coord_xNode); midle(coord_y[i-1],Y,1,coord_yNode); } int j; for(j=0;j<4;j++){ printf("Inter X : %d, Y %d\n",coord_xNode[j],coord_yNode[j] ); } printf("\n"); filledPolygonRGBA(renderer,coord_xNode,coord_yNode,4,255,0,0,255); if(i !=way->size-1){ swap(coord_yNode); swap(coord_xNode); } } thickLineRGBA(renderer,coord_x[i-1],coord_y[i-1],coord_x[i],coord_y[i],thick,way->tag->c->red,way->tag->c->green,way->tag->c->blue,105); } }