#include <stdio.h>
#include <math.h>

#define PI 3.14159


void rotacao(float a1, float a2, float a3, float *xin, float *xout){

  int i,j, k;
  float rotx[3][3], roty[3][3], rotz[3][3], aux[3][3], rot[3][3];  /* matrizes de rotacao */

  /* converte os angulos de graus para radianos */
  a1 *= PI/180.;
  a2 *= PI/180.;
  a3 *= PI/180.;

  /* matriz de rotacao em torno do eixo x */
  rotx[0][0] = 1.;
  rotx[0][1] = 0.;
  rotx[0][2] = 0.;
  rotx[1][0] = 0.;
  rotx[1][1] = cos(a1);
  rotx[1][2] = -sin(a1);
  rotx[2][0] = 0.;
  rotx[2][1] = sin(a1);
  rotx[2][2] = cos(a1);

  /* matriz de rotacao em torno do eixo y */
  roty[0][0] = cos(a2);
  roty[0][1] = 0.;
  roty[0][2] = sin(a2);
  roty[1][0] = 0.;
  roty[1][1] = 1.;
  roty[1][2] = 0.;
  roty[2][0] = -sin(a2);
  roty[2][1] = 0.;
  roty[2][2] = cos(a2);

  /* matriz de rotacao em torno do eixo z */
  rotz[0][0] = cos(a3);
  rotz[0][1] = -sin(a3);
  rotz[0][2] = 0.;
  rotz[1][0] = sin(a3);
  rotz[1][1] = cos(a3);
  rotz[1][2] = 0.;
  rotz[2][0] = 0.;
  rotz[2][1] = 0.;
  rotz[2][2] = 1.;



  /* primeiro, multiplica-se roty por rotz ... */
  for (i=0; i<3;i++){
    for (j=0; j<3;j++){
      aux[i][j] = 0.;
      for (k=0; k<3;k++){
	aux[i][j] += roty[i][k]*rotz[k][j];
      }
    }
  }

  /* ... e o resultado e multiplicado por rotx.*/
  for (i=0; i<3;i++){
    for (j=0; j<3;j++){
      rot[i][j] = 0.;
      for (k=0; k<3;k++){
	rot[i][j] += rotx[i][k]*aux[k][j];
      }
    }
  }



  /* Usa a matriz rot para fazer uma rotacao nos vetores x1 e x2 */
  for (i=0; i<3; i++){
    printf("xinp[i] %f \n",xin[i]);
    xout[i] = 0;
    for (j=0; j<3; j++) {
      xout[i] += rot[i][j]*xin[j];
      printf("xout[i] %f \n",xout[i]);
    }
    
  }
 
  
}

int main(){

  FILE *entrada, *saida; /* arquivos de entrada e saida */
  int siga; /* decide se devemos continuar tentando ler um arquivo */
  float x1[3], x2[3];  /* arrays com as coordenadas cartesianas de entrada */
  float x3[3], x4[3];  /* arrays com as coordenadas cartesianas de saida   */
  float angx, angy, angz;
  int i, k;

  entrada = fopen("cubo.dat","r"); /* abre o arquivo de entrada */

  saida = fopen("cubo_out.dat","w");  /* abre o arquivo de saida   */

  printf("Entre com 3 angulos de rotacao:");
  scanf("%f %f %f",&angx, &angy, &angz);

  siga = 1;
  while (siga) {

    /* laco for para ler os 3 primeiros valores de coordenadas */
    for (i=0; i<3; i++){
      k = fscanf (entrada, "%f", &x1[i]);
      printf("%f  ",x1[i]);
    }

    /* laco for para ler os 3 ultimos valores de coordenadas */
    for (i=0; i<3; i++){
      k = fscanf (entrada, "%f", &x2[i]);
      printf("%f  ",x2[i]);
    }
    printf("\n");

    /* Rotaciona cada um dos vetores */
    rotacao(angx, angy, angz, x1, x3);
    rotacao(angx, angy, angz, x2, x4);

    /* imprime os novos vetores no arquivo de saida */
    for (i=0; i<3; i++)
      fprintf(saida," %f",x3[i]);

    for (i=0; i<3; i++)
      fprintf(saida," %f",x4[i]);

    fprintf(saida,"\n");

    /* verifica final de arquivo */
    if (k != 1)
      siga = 0;

  }

  fclose(entrada);
  fclose(saida);

  return 0;

}
