예제 #1
0
void SRS::SolveAim(float psi_angle, Matrix  R1)
{
    float h1[3], N[3], angle;
    Matrix S0, S1;

    // Get the final hand position 
    evalcircle(c, u, v, radius, psi_angle, h1);

    // Rotate ee_r1 to h1
    crossproduct(N, ee_r1, h1);
    unitize(N);
    angle = angle_between_vectors(ee_r1, h1, N);
    rotation_axis_to_matrix(N, angle, S0);

    // Now rotate a0 to a
    float a[3], a0[3];

    vecsub(a, (float*)ee, h1);
    unitize(a);
    
    hmatmult(S1,Ry,S0);
    vecmult0(a0, (float*)axis, S1);

    cpvector(N, h1);
    unitize(N);
    angle = angle_between_vectors(a0, a, N);
    rotation_axis_to_matrix(N, angle, S1);

    hmatmult(R1, S0, S1);
}
예제 #2
0
float SRS::PosToAngle(const float p[3]) 
{
    // Find vector from center of circle to pos and project it onto circle
    float cp[3], pp[3];

    vecsub(cp, (float *) p, c);
    project_plane(pp , cp, n);

    // Find angle between u and pp. This is the swivel angle
    
    return angle_between_vectors(u, pp, n); 
}
/*****************************************************************
   double* excess_of_quad(int ni, int nj, double *vec1, double *vec2, 
                          double *vec3, double *vec4 )
*******************************************************************/
double* excess_of_quad(int ni, int nj, double *vec1, double *vec2, double *vec3, double *vec4 )
{
  int n;
  double ang12, ang23, ang34, ang41;
  double *excess, *plane1, *plane2, *plane3, *plane4;
  double *angle12, *angle23, *angle34, *angle41;
  
  excess = (double *)malloc(ni*nj*sizeof(double));

  plane1=plane_normal(ni, nj, vec1, vec2);
  plane2=plane_normal(ni, nj, vec2, vec3);
  plane3=plane_normal(ni, nj, vec3, vec4);
  plane4=plane_normal(ni, nj, vec4, vec1);
  angle12=angle_between_vectors(ni, nj, plane2,plane1);
  angle23=angle_between_vectors(ni, nj, plane3,plane2);
  angle34=angle_between_vectors(ni, nj, plane4,plane3);
  angle41=angle_between_vectors(ni, nj, plane1,plane4);

  for(n=0; n<ni*nj; n++) {
    ang12 = M_PI-angle12[n];
    ang23 = M_PI-angle23[n];
    ang34 = M_PI-angle34[n];
    ang41 = M_PI-angle41[n];
    excess[n] = ang12+ang23+ang34+ang41-2*M_PI;
  }

  free(plane1);
  free(plane2);
  free(plane3);
  free(plane4);
  free(angle12);
  free(angle23);
  free(angle34);
  free(angle41);
  
  return excess;

}; /* excess_of_quad */
예제 #4
0
void   CBurer::face_enemy ()
{
	if ( !EnemyMan.get_enemy() )
	{
		return;
	}
	Fvector	const	enemy_pos		=	EnemyMan.get_enemy()->Position();
	Fvector	const	self_pos		=	Position();
	Fvector	const	self2enemy		=	enemy_pos - self_pos;
	bool  	const 	good_aiming		=	angle_between_vectors(self2enemy, Direction()) 
										< deg2rad(20.f);

	if ( !good_aiming )
	{
		dir().face_target				(enemy_pos);
	}

	set_action							(ACT_STAND_IDLE);
}
void calc_fvgrid(int nx, int ny, int nratio, double *dx, double *dy, double *area)
{
  int nxf, nyf, nif, njf, nxp, nyp, nxh, nyh, i, j, n, m;
  double ar;
  double *lx, *ly, *X, *Y, *Z, *vec1, *vec2, *vec3, *vec4, *dxl, *dyl, *areal;
  size_t *dims;
  
  nxp = nx+1;
  nyp = ny+1;
  nxh = (nxp+1)/2;
  nyh = (nyp+1)/2;

  nxf = nx*nratio+1;
  nyf = nxf; 
  nif = (nxf+1)/2;
  njf = nif;

  lx = (double *)malloc(nif*njf*sizeof(double));
  ly = (double *)malloc(nif*njf*sizeof(double));

  n = 0;
  for(j=0; j<njf; j++) {
    for(i=0; i<nif; i++) {
      lx[n] = -1. + 2.0*i/(nxf-1);
      ly[n++] = -1. + 2.0*j/(nyf-1);
    }
  } 

  X = (double *)malloc(nif*njf*sizeof(double));
  Y = (double *)malloc(nif*njf*sizeof(double));
  Z = (double *)malloc(nif*njf*sizeof(double));

 /* calculating 3D coordinates on unit sphere */
  conformal_map_coords2xyz( nif, njf, lx, ly, X, Y, Z);

  vec1  = (double *)malloc((nif-1)*njf*3*sizeof(double));
  vec2  = (double *)malloc((nif-1)*njf*3*sizeof(double));

  for(j=0;j<njf;j++) {
    for(i=0;i<nif-1;i++) {
      n = j*(nif-1)+i;
      vec1[n] = X[j*nif+i];
      vec2[n] = X[j*nif+i+1];
      vec1[(nif-1)*njf+n] = Y[j*nif+i];
      vec2[(nif-1)*njf+n] = Y[j*nif+i+1];
      vec1[2*(nif-1)*njf+n] = Z[j*nif+i];
      vec2[2*(nif-1)*njf+n] = Z[j*nif+i+1];
    }
  }
  
  dxl = angle_between_vectors( nif-1, njf, vec1, vec2);

  free(vec1);
  free(vec2);

  vec1  = (double *)malloc(nif*(njf-1)*3*sizeof(double));
  vec2  = (double *)malloc(nif*(njf-1)*3*sizeof(double));

  for(j=0;j<njf-1;j++) {
    for(i=0;i<nif;i++) {
      n = j*nif+i;
      vec1[n] = X[j*nif+i];
      vec2[n] = X[(j+1)*nif+i];
      vec1[nif*(njf-1)+n] = Y[j*nif+i];
      vec2[nif*(njf-1)+n] = Y[(j+1)*nif+i];
      vec1[2*nif*(njf-1)+n] = Z[j*nif+i];
      vec2[2*nif*(njf-1)+n] = Z[(j+1)*nif+i];
    }
  }  

  dyl = angle_between_vectors( nif, njf-1, vec1, vec2);
  
  free(vec1);
  free(vec2);

  vec1  = (double *)malloc((nif-1)*(njf-1)*3*sizeof(double));
  vec2  = (double *)malloc((nif-1)*(njf-1)*3*sizeof(double)); 
  vec3  = (double *)malloc((nif-1)*(njf-1)*3*sizeof(double));
  vec4  = (double *)malloc((nif-1)*(njf-1)*3*sizeof(double)); 

  for(j=0;j<njf-1;j++) {
    for(i=0;i<nif-1;i++) {
      n = j*(nif-1)+i;
      vec1[n] = X[j*nif+i];
      vec2[n] = X[j*nif+i+1];
      vec3[n] = X[(j+1)*nif+i+1];
      vec4[n] = X[(j+1)*nif+i];
      vec1[(nif-1)*(njf-1)+n] = Y[j*nif+i];
      vec2[(nif-1)*(njf-1)+n] = Y[j*nif+i+1];
      vec3[(nif-1)*(njf-1)+n] = Y[(j+1)*nif+i+1];
      vec4[(nif-1)*(njf-1)+n] = Y[(j+1)*nif+i];
      vec1[2*(nif-1)*(njf-1)+n] = Z[j*nif+i];
      vec2[2*(nif-1)*(njf-1)+n] = Z[j*nif+i+1];
      vec3[2*(nif-1)*(njf-1)+n] = Z[(j+1)*nif+i+1];
      vec4[2*(nif-1)*(njf-1)+n] = Z[(j+1)*nif+i];
    }
  }  

  areal = excess_of_quad( nif-1, njf-1, vec1, vec2, vec3, vec4);
  free(vec1);
  free(vec2);
  free(vec3);
  free(vec4);  

  /*Force some symmetry (probably does nothing) */
  for(j=0; j<njf; j++) {
    for(i=0; i<nif-1; i++) dxl[j*(nif-1)+i] = (dxl[j*(nif-1)+i]+dyl[i*nif+j])*0.5;
  }

  for(j=0; j<njf-1; j++) {
    for(i=0; i<nif; i++) dyl[j*nif+i] = dxl[i*(nif-1)+j];
  }

  for(j=0; j<njf-1; j++) {
    for(i=0; i<nif-1; i++) {
      if(j<i) 
	areal[j*(nif-1)+i] = (areal[j*(nif-1)+i]+areal[i*(nif-1)+j])*0.5;
      else if(j>i)
        areal[j*(nif-1)+i] = areal[i*(nif-1)+j];
    }
  }

  /* Use symmetry to fill second octant */
  for(j=1; j<njf; j++) {
    for(i=0; i<j; i++) {
      dxl[j*(nif-1)+i] = dyl[i*nif+j];
    }
  }

  for(j=1; j<njf-1; j++) {
    for(i=0; i<j; i++) {
      areal[j*(nif-1)+i] = areal[i*(nif-1)+j];
    }
  }

  /* copy data from fine grid to super grid. */
  
  for(j=0;j<nyh;j++) {
    for(i=0;i<nxh-1;i++) {
      ar = 0;
      for(n=0;n<nratio;n++) ar = ar + dxl[j*nratio*(nif-1)+i*nratio+n];
      dx[j*nx+i] = ar*RADIUS;
    }
  }
    
  for(j=0;j<nyh-1;j++) {
    for(i=0;i<nxh-1;i++) {
      ar = 0;
      for(n=0; n<nratio; n++) 
	for(m=0; m<nratio; m++) ar += areal[(j*nratio+n)*(nif-1)+i*nratio+m];
      area[j*nx+i] = ar*RADIUS*RADIUS;
    }
  }
  
  /*use reflection symmetry of quadrants to fill face. */
  for(j=0;j<nyh; j++) {
    for(i=nxh-1; i<nx; i++) {
      dx[j*nx+i] = dx[j*nx+nxp-i-2];
    }
  }

  for(j=nyh;j<nyp; j++) {
    for(i=0; i<nx; i++) {
      dx[j*nx+i] = dx[(ny-j)*nx+i];
    }
  }

  for(j=0;j<nyh-1; j++) {
    for(i=nxh-1; i<nx; i++) {
      area[j*nx+i]   = area[j*nx+nxp-i-2];
    }
  }

  for(j=nyh-1;j<ny; j++) {
    for(i=0; i<nx; i++) {
      area[j*ny+i]   = area[(nyp-j-2)*nx+i];
    }
  }

  /* copy dx to dy */
  for(j=0;j<ny;j++) 
    for(i=0;i<nxp;i++) dy[j*nxp+i] =  dx[i*nx+j] ;

}; /* calc_fvgrid */