Example #1
0
int main (int argc, char * argv[]) {
  FILE * fp=NULL;
  int nsteps = 10000;
  vec * L=NULL;
  double * dist;
  int i, w;
  int nwalkers = 100;

  L=(vec*)malloc(nsteps*sizeof(vec));
  dist=(double*)malloc(nsteps*sizeof(vec));

  for (i=1;i<nsteps;i++) {
    dist[i]=0.0;
  }

  L[0].x=L[0].y=L[0].z=0.0;
  for (w=0;w<nwalkers;w++) {
    fprintf(stdout,"Walker %d...\n",w);
    for (i=1;i<nsteps;i++) {
      random_step(L,i,1.0);
      dist[i]+=diffnorm(&L[i],&L[0]);
    }
  }

  for (i=1;i<nsteps;i++) {
    dist[i]/=nwalkers;
  }

  fp=fopen("out.dat","w");
  for (i=0;i<nsteps;i++) {
    fprintf(fp,"%i %.5lf\n",i,dist[i]);
  }
  fclose(fp);

}
static
void ScanMatchingB(double *xyt_scan,double *x_jk,double* A,double* B,
		   int nrangesA,int nrangesB){
    

    double T0[3];
    double T1[3]  = {0.5,0.5,0.5};
    int mi[500]; 
    int wi[500];

    memcpy(T0,x_jk,sizeof(double)*3);

    double vec_b[3],vec_a[3],vec_ac[3];
    
    double dmax = 0.05;
    double m[3];

    int total_match = 0;

    while(diffnorm(T0,T1,3) > 1e-6){

	#ifdef DEBUG
	printf("diff error = %f, [%f %f %f]\n",diffnorm(T0,T1,3),T0[0],T0[1],T0[2]);
	#endif
	
	memset(mi,0,250*sizeof(int));
	memset(wi,0,250*sizeof(int));

	total_match = 0;

	for(int i=0;i<nrangesB;i++){

	    double x_b = B[i*2+0];
	    double y_b = B[i*2+1];

	    vec_b[0]  = x_b; vec_b[1]  = y_b; vec_b[2]  = 1;
	    
	    MatVecProd(T0,vec_b,vec_ac);

	    double min_val = 1e6;

	    for(int j=0;j<nrangesA;j++){

		double x_a = A[j*2 + 0];
		double y_a = A[j*2 + 1];

		vec_a[0]=x_a; vec_a[1] = y_a; vec_a[2] = 1;
		
		double dist = diffnorm(vec_ac,vec_a,3);
		
		if(dist < min_val){
		    min_val      = dist;
		    mi[i]        = j;
		   
		}	
	    }
	    
	    m[0] = A[ mi[i]*2 + 0 ];
	    m[1] = A[ mi[i]*2 + 1 ];
	    m[2] = 1;
	    
	    if(diffnorm(m,vec_ac,2) <= dmax)
		wi[i]  = 1;
	    else
		wi[i]  = 0;

	    total_match +=  wi[i];
	}
	
	memcpy(T1,T0,sizeof(double)*3);
	
	double Sxk  = 0,   Syk  = 0;
	double Sxk1 = 0,   Syk1 = 0;
	double Sxkxk1 =0, Sxkyk1 = 0;
	double Sykxk1 = 0, Sykyk1 = 0;
     
	for(int i=0;i<nrangesB;i++){

		
	    double x_k = A[mi[i]*2 + 0];
	    double y_k = A[mi[i]*2 + 1];;

	    double x_k1 = B[i*2+0];
	    double y_k1 = B[i*2+1];

	    Sxk  += wi[i]*x_k;
	    Syk  += wi[i]*y_k;

	    Sxk1 += wi[i]*x_k1;
	    Syk1 += wi[i]*y_k1;

	    Sxkxk1 += wi[i] * x_k*x_k1;
	    Sykyk1 += wi[i] * y_k*y_k1;

	    Sxkyk1 += wi[i] * x_k*y_k1;
	    Sykxk1 += wi[i] * y_k*x_k1;

	}
	
	double tan_deltNr = Sxk*Syk1 + total_match*Sykxk1 - total_match*Sxkyk1 - Sxk1*Syk;
	double tan_deltDr = total_match*Sxkxk1 + total_match*Sykyk1 - Sxk*Sxk1 - Syk*Syk1;

	//double tan_delt   = tan_deltNr/tan_deltDr;
	
	double del_t = atan2(tan_deltNr,tan_deltDr);
	double del_x = (Sxk - cos(del_t)*Sxk1 + sin(del_t)*Syk1)/total_match;
	double del_y = (Syk - sin(del_t)*Sxk1 - cos(del_t)*Syk1)/total_match;

	T0[0] = del_x;
	T0[1] = del_y;
	T0[2] = del_t;

    
    }
    
    memcpy(xyt_scan,T0,sizeof(double)*3);

   
}