示例#1
0
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;
}
示例#2
0
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);
	}
}