Exemple #1
0
uint64_t fibonacci( uint64_t n, uint64_t module ) {
    uint64_t power[] = { 0, 1, 1, 1 };
    uint64_t result[] = { 1, 0, 0, 1 };

    while ( n ) {
        if ( n & 1 ) {
            mult_matrix( result, power, module );
        }
        mult_matrix( power, power, module );
        n >>= 1;
    }
    return result[1];
}
Exemple #2
0
void translate_matrix(double (*im)[4], double (*om)[4], struct vector3 *translate)
{
  double tm[4][4];
  unsigned short l,m,n;

  tm[0][0]=1;
  tm[0][1]=0;
  tm[0][2]=0;
  tm[0][3]=0;
  tm[1][0]=0;
  tm[1][1]=1;
  tm[1][2]=0;
  tm[1][3]=0;
  tm[2][0]=0;
  tm[2][1]=0;
  tm[2][2]=1;
  tm[2][3]=0;
  tm[3][0]=translate->x;
  tm[3][1]=translate->y;
  tm[3][2]=translate->z;
  tm[3][3]=1;

  l=4;
  m=4;
  n=4;
  mult_matrix(im,tm,om,l,m,n);
}
Exemple #3
0
void f_rotate_z (void)
{
    array_t *matrix;
    double angle;
    Matrix current_matrix;
    Matrix rot_matrix;
    Matrix final_matrix;
    int i;

    /*
     * get arguments from stack.
     */
    matrix = (sp - 1)->u.arr;
    angle = (sp--)->u.real;
    /*
     * convert vec matrix to float matrix.
     */
    for (i = 0; i < 16; i++) {
        current_matrix[i] = matrix->item[i].u.real;
    }
    /*
     * create z rotation matrix.
     */
    rotate_z_matrix(angle, rot_matrix);
    /*
     * compute transformed matrix.
     */
    mult_matrix(current_matrix, rot_matrix, final_matrix);
    /*
     * convert float matrix to vec matrix.
     */
    for (i = 0; i < 16; i++) {
        matrix->item[i].u.real = final_matrix[i];
    }
}
Exemple #4
0
/**
 * Scales the rows of a matrix according to scaling vector3.
 * Scales row0 of im by scale.x
 * Scales row1 of im by scale.y
 * Scales row2 of im by scale.z
 * Scales row3 of im by 1 (no scaling)
 * Result is placed in om.
 */
void scale_matrix(double (*im)[4], double (*om)[4], struct vector3 *scale)
{
  double sc[4][4];
  unsigned short l,m,n;

  sc[0][0]=scale->x;
  sc[0][1]=0;
  sc[0][2]=0;
  sc[0][3]=0;
  sc[1][0]=0;
  sc[1][1]=scale->y;
  sc[1][2]=0;
  sc[1][3]=0;
  sc[2][0]=0;
  sc[2][1]=0;
  sc[2][2]=scale->z;
  sc[2][3]=0;
  sc[3][0]=0;
  sc[3][1]=0;
  sc[3][2]=0;
  sc[3][3]=1;

  l=4;
  m=4;
  n=4;
  mult_matrix(im,sc,om,l,m,n);
}
Exemple #5
0
void calculate_view(t_3dview *view)
{
#define SMALL 1e-6
  mat4 To,Te,T1,T2,T3,T4,T5,N1,D1,D2,D3,D4,D5;
  real dx,dy,dz,l,r;
  
  /* eye center */
  dx=view->eye[XX];
  dy=view->eye[YY];
  dz=view->eye[ZZ];
  l = sqrt(dx*dx+dy*dy+dz*dz);
  r = sqrt(dx*dx+dy*dy);
#ifdef DEBUG
  print_v4(debug,"eye",N,view->eye);
  printf("del: %10.5f%10.5f%10.5f l: %10.5f, r: %10.5f\n",dx,dy,dz,l,r);
#endif
  if (l < SMALL)
    fatal_error(0,"Error: Zero Length Vector - No View Specified");
  translate((real)(-view->origin[XX]),
	    (real)(-view->origin[YY]),(real)(-view->origin[ZZ]),To);
  translate((real)(-view->eye[XX]),
	    (real)(-view->eye[YY]),(real)(-view->eye[ZZ]),Te);

  unity_m4(T2);
  T2[YY][YY]=0, T2[YY][ZZ]=-1, T2[ZZ][YY]=1, T2[ZZ][ZZ]=0;

  unity_m4(T3);
  if (r > 0)
    T3[XX][XX]=-dy/r, T3[XX][ZZ]=dx/r, T3[ZZ][XX]=-dx/r, T3[ZZ][ZZ]=-dy/r;

  unity_m4(T4);
  T4[YY][YY]=r/l, T4[YY][ZZ]=dz/l, T4[ZZ][YY]=-dz/l, T4[ZZ][ZZ]=r/l;

  unity_m4(T5);
  T5[ZZ][ZZ]=-1;

  unity_m4(N1);
  /* N1[XX][XX]=4,N1[YY][YY]=4; */

  mult_matrix(T1,To,view->Rot);
  mult_matrix(D1,Te,T2);
  mult_matrix(D2,T3,T4);
  mult_matrix(D3,T5,N1);
  mult_matrix(D4,T1,D1);
  mult_matrix(D5,D2,D3);

  mult_matrix(view->proj,D4,D5);

#ifdef DEBUG
  print_m4(debug,"T1",T1);
  print_m4(debug,"T2",T2);
  print_m4(debug,"T3",T3);
  print_m4(debug,"T4",T4);
  print_m4(debug,"T5",T5);
  print_m4(debug,"N1",N1);
  print_m4(debug,"Rot",view->Rot);
  print_m4(debug,"Proj",view->proj);
#endif
}
Exemple #6
0
static void rand_rot(int natoms, rvec x[], rvec v[], vec4 xrot[], vec4 vrot[],
                     int *seed, rvec max_rot)
{
    mat4 mt1, mt2, mr[DIM], mtemp1, mtemp2, mtemp3, mxtot, mvtot;
    rvec xcm;
    real phi;
    int  i, m;

    clear_rvec(xcm);
    for (i = 0; (i < natoms); i++)
    {
        for (m = 0; (m < DIM); m++)
        {
            xcm[m] += x[i][m]/natoms; /* get center of mass of one molecule  */
        }
    }
    fprintf(stderr, "center of geometry: %f, %f, %f\n", xcm[0], xcm[1], xcm[2]);

    translate(-xcm[XX], -xcm[YY], -xcm[ZZ], mt1); /* move c.o.ma to origin */
    for (m = 0; (m < DIM); m++)
    {
        phi = M_PI*max_rot[m]*(2*rando(seed) - 1)/180;
        rotate(m, phi, mr[m]);
    }
    translate(xcm[XX], xcm[YY], xcm[ZZ], mt2);

    /* For mult_matrix we need to multiply in the opposite order
     * compared to normal mathematical notation.
     */
    mult_matrix(mtemp1, mt1, mr[XX]);
    mult_matrix(mtemp2, mr[YY], mr[ZZ]);
    mult_matrix(mtemp3, mtemp1, mtemp2);
    mult_matrix(mxtot, mtemp3, mt2);
    mult_matrix(mvtot, mr[XX], mtemp2);

    for (i = 0; (i < natoms); i++)
    {
        m4_op(mxtot, x[i], xrot[i]);
        m4_op(mvtot, v[i], vrot[i]);
    }
}
Exemple #7
0
void rotate_3d(t_3dview *view,int axis,bool bPositive)
{
  static bool bFirst=TRUE;
  static mat4 RotP[DIM];
  static mat4 RotM[DIM];
  int  i,j;
  mat4 m4;

  if (bFirst) {
    real rot=DEG2RAD*15;

    for(i=0; (i<DIM); i++) {
      rotate(i,        rot ,RotP[i]);
      rotate(i,(real)(-rot),RotM[i]);
#ifdef DEBUG
      print_m4(debug,"RotP",RotP[i]);
      print_m4(debug,"RotM",RotM[i]);
#endif
    }
  }

  /*
    if (bPositive)
    m4_op(RotP[axis],view->eye,v4);
    else
    m4_op(RotM[axis],view->eye,v4);
    for(i=0; (i<DIM); i++)
    view->eye[i]=v4[i];
    */
  if (bPositive)
    mult_matrix(m4,view->Rot,RotP[axis]);
  else
    mult_matrix(m4,view->Rot,RotM[axis]);
  for(i=0; (i<N); i++)
    for(j=0; (j<N); j++)
    view->Rot[i][j]=m4[i][j];

  calculate_view(view);
}
Exemple #8
0
  //! \brief Calculate the Graph Potentials of a molecule
  //! 
  //! based on
  //! V.E. and Rozenblit, A.B. Golender
  //! <em>Logical and Combinatorial Algorithms for Drug Design</em>. \n
  //! For an example see:
  //! Walters, W. P., Yalkowsky, S. H., \em JCICS, 1996, 36(5), 1015-1017.
  //! <a href="http://dx.doi.org/10.1021/ci950278o">DOI: 10.1021/ci950278o</a>
  void GraphPotentials(OBMol &mol, std::vector<double> &pot)
  {
    double det;

    vector<vector<double> > g,c,h;
    construct_g_matrix(mol,g);
    invert_matrix(g,det);
    construct_c_matrix(mol,c);
    mult_matrix(h,g,c);
    pot.resize(mol.NumAtoms()+1);

    for (unsigned int i = 0; i < mol.NumAtoms();++i)
      pot[i+1] = h[i][0];
  }
Exemple #9
0
void rotate_3d(t_3dview *view, int axis, gmx_bool bPositive)
{
    int  i, j;
    mat4 m4;

    if (bPositive)
    {
        mult_matrix(m4, view->Rot, view->RotP[axis]);
    }
    else
    {
        mult_matrix(m4, view->Rot, view->RotM[axis]);
    }
    for (i = 0; (i < N); i++)
    {
        for (j = 0; (j < N); j++)
        {
            view->Rot[i][j] = m4[i][j];
        }
    }

    calculate_view(view);
}
Exemple #10
0
int main(){
  
  const uint64_t N = 1000;
  clock_t start_t = 0;
  clock_t end_t = 0;
  
  double *A_matrix, *B_matrix, *A_matrix_dev, *B_matrix_dev, *result_cpu, *result_gpu;
  
  TIMEIT_START;
  // allocate memmory on HOST
  A_matrix = (double*)malloc(N*N*sizeof(double));
  B_matrix = (double*)malloc(N*N*sizeof(double));
  result_cpu = (double*)malloc(N*N*sizeof(double));
  result_gpu = (double*)malloc(N*N*sizeof(double));
  TIMEIT_END(clock_t host_alloc_t);
  print_timeit(host_alloc_t,"allocating memory on host:");
  
  fill_matrix(A_matrix,N);
  fill_matrix(B_matrix,N);
  //print_matrix(A_matrix,N);
  printf("\n");
  
  TIMEIT_START;
  mult_matrix(A_matrix,B_matrix,result_cpu,N);
  TIMEIT_END(clock_t cpu_mult_t);
  print_timeit(cpu_mult_t,"multiplying matrix by a matrix with into another one:");
  //print_matrix(result_cpu,N);
  
  TIMEIT_START;
  cudaMalloc((void **) &A_matrix_dev,N*N*sizeof(double));
  cudaMalloc((void **) &B_matrix_dev,N*N*sizeof(double));
  cudaMalloc((void **) &result_gpu,N*N*sizeof(double));
  TIMEIT_END(clock_t gpu_alloc_t);
  print_timeit(gpu_alloc_t,"allocation memory on device:");
  
  TIMEIT_START;
  cudaMemcpy(A_matrix_dev, A_matrix, N*N*sizeof(double), cudaMemcpyHostToDevice);
  cudaMemcpy(B_matrix_dev, B_matrix, N*N*sizeof(double), cudaMemcpyHostToDevice);
  TIMEIT_END(clock_t gpu_copy_t);
  print_timeit(gpu_copy_t,"allocation memory on device:");
  
  free(A_matrix);
  free(B_matrix);
  free(result_cpu);
  free(result_gpu);
  
  return EXIT_SUCCESS;
}
Exemple #11
0
void f_translate (void)
{
    array_t *matrix;
    double x, y, z;
    Matrix current_matrix;
    Matrix trans_matrix;
    Matrix final_matrix;
    int i;

    if ((sp - 1)->type != T_REAL) {
        bad_arg(3, F_TRANSLATE);
    }
    if (sp->type != T_REAL) {
        bad_arg(4, F_TRANSLATE);
    }
    /*
     * get arguments from stack.
     */
    matrix = (sp - 3)->u.arr;
    x = (sp - 2)->u.real;
    y = (sp - 1)->u.real;
    z = sp->u.real;
    sp -= 3;

    /*
     * convert vec matrix to float matrix.
     */
    for (i = 0; i < 16; i++) {
        current_matrix[i] = matrix->item[i].u.real;
    }
    /*
     * create translation matrix.
     */
    translate_matrix(x, y, z, trans_matrix);
    /*
     * compute transformed matrix.
     */
    mult_matrix(current_matrix, trans_matrix, final_matrix);
    /*
     * convert float matrix to vec matrix.
     */
    for (i = 0; i < 16; i++) {
        matrix->item[i].u.real = final_matrix[i];
    }
}
Exemple #12
0
void f_scale (void)
{
    array_t *matrix;
    LPC_FLOAT x, y, z;
    Matrix current_matrix;
    Matrix scaling_matrix;
    Matrix final_matrix;
    int i;

    if ((sp - 1)->type != T_REAL) {
	bad_arg(3, F_SCALE);
    }
    if (sp->type != T_REAL) {
	bad_arg(4, F_SCALE);
    }
    /*
     * get arguments from stack.
     */
    matrix = (sp - 3)->u.arr;
    x = (sp - 2)->u.real;
    y = (sp - 1)->u.real;
    z = sp->u.real;
    sp -= 3;
    /*
     * convert vec matrix to float matrix.
     */
    for (i = 0; i < 16; i++) {
	current_matrix[i] = matrix->item[i].u.real;
    }
    /*
     * create scaling matrix.
     */
    scale_matrix(x, y, z, scaling_matrix);
    /*
     * compute transformed matrix.
     */
    mult_matrix(current_matrix, scaling_matrix, final_matrix);
    /*
     * convert float matrix to vec matrix.
     */
    for (i = 0; i < 16; i++) {
	matrix->item[i].u.real = final_matrix[i];
    }
}
Exemple #13
0
void get_rotation(float angle, float ax, float ay, float az, gtMatrix mat)
{
  gtMatrix r1,r2,r3;
  float theta;
  gtVector n;
  gtVector a,b,c;

  a[0] = ax;
  a[1] = ay;
  a[2] = az;
  normalize_vector(a);

  /* create vector not parallel to "a" */

  ax = fabs(a[0]);
  ay = fabs(a[1]);
  az = fabs(a[2]);

  n[0] = n[1] = n[2] = 0;

  if (ax > ay) {
    if (ay > az)
      n[2] = 1;    /* z is smallest */
    else
      n[1] = 1;    /* y is smallest */
  }
  else {
    if (ax > az)
      n[2] = 1;    /* z is smallest */
    else
      n[0] = 1;    /* x is smallest */
  }

  /* create "b" orthogonal to "a" */

  cross (b, a, n);
  normalize_vector(b);

  /* create "c" orthogonal to "a" and "b" */

  cross (c, a, b);

  /* make matrix that rotates a,b,c into x,y,z axes */

  identity_matrix (r1);
  r1[0][0] = a[0];
  r1[1][0] = a[1];
  r1[2][0] = a[2];
  r1[0][1] = b[0];
  r1[1][1] = b[1];
  r1[2][1] = b[2];
  r1[0][2] = c[0];
  r1[1][2] = c[1];
  r1[2][2] = c[2];

  /* make matrix for rotation by theta degrees around x-axis */

  theta = angle * 3.1415926535 / 180.0;
  identity_matrix (r2);
  r2[1][1] =  cos(theta);
  r2[2][2] =  cos(theta);
  r2[1][2] =  sin(theta);
  r2[2][1] = -sin(theta);

  /* make matrix that is inverse of r1 */
  copy_matrix (r3, r1);
  transpose_matrix (r3);

  /* compose these matrices for final matrix mat = r3 * r2 * r1 */
  mult_matrix (mat, r3, r2);
  mult_matrix (mat, mat, r1);
}
// Performs matrix multiplication and returns a new matrix.
Matrix *mult_matrix_func(Matrix *A, Matrix *B) {
    Matrix *C = make_matrix(A->rows, B->cols);
    mult_matrix(A, B, C);
    return C;
}
Exemple #15
0
void rotate_matrix(double (*im)[4], double (*om)[4], struct vector3 *axis, double angle)
{
  double r1[4][4],r2[4][4],r3[4][4],rm[4][4];
  double a,b,c,v;
  double rad;
  unsigned short l,m,n;

  normalize(axis);
  a=axis->x;
  b=axis->y;
  c=axis->z;
  v=sqrt(b*b+c*c);

  r1[0][0]=1;
  r1[0][1]=0;
  r1[0][2]=0;
  r1[0][3]=0;
  r1[1][0]=0;
  r1[1][1]=1;
  r1[1][2]=0;
  r1[1][3]=0;
  r1[2][0]=0;
  r1[2][1]=0;
  r1[2][2]=1;
  r1[2][3]=0;
  r1[3][0]=0;
  r1[3][1]=0;
  r1[3][2]=0;
  r1[3][3]=1;

  if (v!=0.0) {
    r1[1][1]=c/v;
    r1[1][2]=b/v;
    r1[2][1]=-b/v;
    r1[2][2]=c/v;
  }

  r2[0][0]=v;
  r2[0][1]=0;
  r2[0][2]=a;
  r2[0][3]=0;
  r2[1][0]=0;
  r2[1][1]=1;
  r2[1][2]=0;
  r2[1][3]=0;
  r2[2][0]=-a;
  r2[2][1]=0;
  r2[2][2]=v;
  r2[2][3]=0;
  r2[3][0]=0;
  r2[3][1]=0;
  r2[3][2]=0;
  r2[3][3]=1;

  rad=MY_PI/180.0;
  r3[0][0]=cos(angle*rad);
  r3[0][1]=sin(angle*rad);
  r3[0][2]=0;
  r3[0][3]=0;
  r3[1][0]=-sin(angle*rad);
  r3[1][1]=cos(angle*rad);
  r3[1][2]=0;
  r3[1][3]=0;
  r3[2][0]=0;
  r3[2][1]=0;
  r3[2][2]=1;
  r3[2][3]=0;
  r3[3][0]=0;
  r3[3][1]=0;
  r3[3][2]=0;
  r3[3][3]=1;

  l=4;
  m=4;
  n=4;
  mult_matrix(r1,r2,rm,l,m,n);
  mult_matrix(rm,r3,rm,l,m,n);

  r2[0][2]=-a;
  r2[2][0]=a;

  if (v!=0.0) {
    r1[1][2]=-b/v;
    r1[2][1]=b/v;
  }

  mult_matrix(rm,r2,rm,l,m,n);
  mult_matrix(rm,r1,rm,l,m,n);
  mult_matrix(im,rm,om,l,m,n);
}
Exemple #16
0
static void csc(enum v4l2_colorspace colorspace, double *r, double *g, double *b)
{
	/* Convert the primaries of Rec. 709 Linear RGB */
	switch (colorspace) {
	case V4L2_COLORSPACE_SMPTE240M:
		*r = transfer_srgb_to_rgb(*r);
		*g = transfer_srgb_to_rgb(*g);
		*b = transfer_srgb_to_rgb(*b);
		mult_matrix(r, g, b, rec709_to_240m);
		break;
	case V4L2_COLORSPACE_SMPTE170M:
		*r = transfer_srgb_to_rgb(*r);
		*g = transfer_srgb_to_rgb(*g);
		*b = transfer_srgb_to_rgb(*b);
		mult_matrix(r, g, b, rec709_to_170m);
		break;
	case V4L2_COLORSPACE_470_SYSTEM_BG:
		*r = transfer_srgb_to_rgb(*r);
		*g = transfer_srgb_to_rgb(*g);
		*b = transfer_srgb_to_rgb(*b);
		mult_matrix(r, g, b, rec709_to_ebu);
		break;
	case V4L2_COLORSPACE_470_SYSTEM_M:
		*r = transfer_srgb_to_rgb(*r);
		*g = transfer_srgb_to_rgb(*g);
		*b = transfer_srgb_to_rgb(*b);
		mult_matrix(r, g, b, rec709_to_ntsc1953);
		break;
	case V4L2_COLORSPACE_SRGB:
	case V4L2_COLORSPACE_REC709:
	default:
		break;
	}

	*r = ((*r) < 0) ? 0 : (((*r) > 1) ? 1 : (*r));
	*g = ((*g) < 0) ? 0 : (((*g) > 1) ? 1 : (*g));
	*b = ((*b) < 0) ? 0 : (((*b) > 1) ? 1 : (*b));

	/* Encode to gamma corrected colorspace */
	switch (colorspace) {
	case V4L2_COLORSPACE_SMPTE240M:
		*r = transfer_rgb_to_smpte240m(*r);
		*g = transfer_rgb_to_smpte240m(*g);
		*b = transfer_rgb_to_smpte240m(*b);
		break;
	case V4L2_COLORSPACE_SMPTE170M:
	case V4L2_COLORSPACE_470_SYSTEM_M:
	case V4L2_COLORSPACE_470_SYSTEM_BG:
		*r = transfer_rgb_to_rec709(*r);
		*g = transfer_rgb_to_rec709(*g);
		*b = transfer_rgb_to_rec709(*b);
		break;
	case V4L2_COLORSPACE_SRGB:
		break;
	case V4L2_COLORSPACE_REC709:
	default:
		*r = transfer_srgb_to_rec709(*r);
		*g = transfer_srgb_to_rec709(*g);
		*b = transfer_srgb_to_rec709(*b);
		break;
	}
}
Exemple #17
0
static void rot_conf(t_atoms *atoms, rvec x[], rvec v[], real trans, real angle,
                     rvec head, rvec tail, matrix box, int isize, atom_id index[],
                     rvec xout[], rvec vout[])
{
    rvec     arrow, center, xcm;
    real     theta, phi, arrow_len;
    mat4     Rx, Ry, Rz, Rinvy, Rinvz, Mtot, Tcm, Tinvcm, Tx;
    mat4     temp1, temp2, temp3, temp4, temp21, temp43;
    vec4     xv;
    int      i, j, ai;

    rvec_sub(tail, head, arrow);
    arrow_len = norm(arrow);
    if (debug)
    {
        fprintf(debug, "Arrow vector:   %10.4f  %10.4f  %10.4f\n",
                arrow[XX], arrow[YY], arrow[ZZ]);
        fprintf(debug, "Effective translation %g nm\n", trans);
    }
    if (arrow_len == 0.0)
    {
        gmx_fatal(FARGS, "Arrow vector not given");
    }

    /* Copy all aoms to output */
    for (i = 0; (i < atoms->nr); i++)
    {
        copy_rvec(x[i], xout[i]);
        copy_rvec(v[i], vout[i]);
    }

    /* Compute center of mass and move atoms there */
    clear_rvec(xcm);
    for (i = 0; (i < isize); i++)
    {
        rvec_inc(xcm, x[index[i]]);
    }
    for (i = 0; (i < DIM); i++)
    {
        xcm[i] /= isize;
    }
    if (debug)
    {
        fprintf(debug, "Center of mass: %10.4f  %10.4f  %10.4f\n",
                xcm[XX], xcm[YY], xcm[ZZ]);
    }
    for (i = 0; (i < isize); i++)
    {
        rvec_sub(x[index[i]], xcm, xout[index[i]]);
    }

    /* Compute theta and phi that describe the arrow */
    theta = acos(arrow[ZZ]/arrow_len);
    phi   = atan2(arrow[YY]/arrow_len, arrow[XX]/arrow_len);
    if (debug)
    {
        fprintf(debug, "Phi = %.1f, Theta = %.1f\n", RAD2DEG*phi, RAD2DEG*theta);
    }

    /* Now the total rotation matrix: */
    /* Rotate a couple of times */
    rotate(ZZ, -phi, Rz);
    rotate(YY, M_PI/2-theta, Ry);
    rotate(XX, angle*DEG2RAD, Rx);
    Rx[WW][XX] = trans;
    rotate(YY, theta-M_PI/2, Rinvy);
    rotate(ZZ, phi, Rinvz);

    mult_matrix(temp1, Ry, Rz);
    mult_matrix(temp2, Rinvy, Rx);
    mult_matrix(temp3, temp2, temp1);
    mult_matrix(Mtot, Rinvz, temp3);

    print_m4(debug, "Rz", Rz);
    print_m4(debug, "Ry", Ry);
    print_m4(debug, "Rx", Rx);
    print_m4(debug, "Rinvy", Rinvy);
    print_m4(debug, "Rinvz", Rinvz);
    print_m4(debug, "Mtot", Mtot);

    for (i = 0; (i < isize); i++)
    {
        ai = index[i];
        m4_op(Mtot, xout[ai], xv);
        rvec_add(xv, xcm, xout[ai]);
        m4_op(Mtot, v[ai], xv);
        copy_rvec(xv, vout[ai]);
    }
}
Exemple #18
0
void tform_matrix(struct vector3 *scale, struct vector3 *translate, struct vector3 *axis, double angle, double (*om)[4])
{
  double sc[4][4];
  double tm[4][4];
  double r1[4][4],r2[4][4],r3[4][4];
  double a,b,c,v;
  double rad;
  unsigned short l,m,n;

  init_matrix(om);

  sc[0][0]=scale->x;
  sc[0][1]=0;
  sc[0][2]=0;
  sc[0][3]=0;
  sc[1][0]=0;
  sc[1][1]=scale->y;
  sc[1][2]=0;
  sc[1][3]=0;
  sc[2][0]=0;
  sc[2][1]=0;
  sc[2][2]=scale->z;
  sc[2][3]=0;
  sc[3][0]=0;
  sc[3][1]=0;
  sc[3][2]=0;
  sc[3][3]=1;

  tm[0][0]=1;
  tm[0][1]=0;
  tm[0][2]=0;
  tm[0][3]=0;
  tm[1][0]=0;
  tm[1][1]=1;
  tm[1][2]=0;
  tm[1][3]=0;
  tm[2][0]=0;
  tm[2][1]=0;
  tm[2][2]=1;
  tm[2][3]=0;
  tm[3][0]=translate->x;
  tm[3][1]=translate->y;
  tm[3][2]=translate->z;
  tm[3][3]=1;

  normalize(axis);
  a=axis->x;
  b=axis->y;
  c=axis->z;
  v=sqrt(b*b+c*c);

  r1[0][0]=1;
  r1[0][1]=0;
  r1[0][2]=0;
  r1[0][3]=0;
  r1[1][0]=0;
  r1[1][1]=1;
  r1[1][2]=0;
  r1[1][3]=0;
  r1[2][0]=0;
  r1[2][1]=0;
  r1[2][2]=1;
  r1[2][3]=0;
  r1[3][0]=0;
  r1[3][1]=0;
  r1[3][2]=0;
  r1[3][3]=1;

  if (v!=0.0) {
    r1[1][1]=c/v;
    r1[1][2]=b/v;
    r1[2][1]=-b/v;
    r1[2][2]=c/v;
  }

  r2[0][0]=v;
  r2[0][1]=0;
  r2[0][2]=a;
  r2[0][3]=0;
  r2[1][0]=0;
  r2[1][1]=1;
  r2[1][2]=0;
  r2[1][3]=0;
  r2[2][0]=-a;
  r2[2][1]=0;
  r2[2][2]=v;
  r2[2][3]=0;
  r2[3][0]=0;
  r2[3][1]=0;
  r2[3][2]=0;
  r2[3][3]=1;

  rad=MY_PI/180.0;
  r3[0][0]=cos(angle*rad);
  r3[0][1]=sin(angle*rad);
  r3[0][2]=0;
  r3[0][3]=0;
  r3[1][0]=-sin(angle*rad);
  r3[1][1]=cos(angle*rad);
  r3[1][2]=0;
  r3[1][3]=0;
  r3[2][0]=0;
  r3[2][1]=0;
  r3[2][2]=1;
  r3[2][3]=0;
  r3[3][0]=0;
  r3[3][1]=0;
  r3[3][2]=0;
  r3[3][3]=1;

  l=4;
  m=4;
  n=4;
  mult_matrix(r1,r2,om,l,m,n);
  mult_matrix(om,r3,om,l,m,n);

  r2[0][2]=-a;
  r2[2][0]=a;

  if (v!=0.0) {
    r1[1][2]=-b/v;
    r1[2][1]=b/v;
  }

  mult_matrix(om,r2,om,l,m,n);
  mult_matrix(om,r1,om,l,m,n);
  mult_matrix(om,sc,om,l,m,n);
  mult_matrix(om,tm,om,l,m,n);
}
Exemple #19
0
// Performs matrix multiplication and returns a new matrix.
Matrix *mult_matrix_func(Matrix *A, Matrix *B) {
    Matrix *Ret = make_matrix(A->rows, B->cols);
    mult_matrix(A,B,Ret);
    return Ret;
}