[HW] Mesh Rotation
카테고리: IAC
📜문제
Input.obj 파일은 공을 들고 있는 남자
인데 이것을 원하는 각도만큼 회전 시킬 수 있게 하는 프로그램을 작성하는 것이다. [.obj 파일 설명]
🔎접근
🌞코드
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int cal_X(int X, int Y, int Z, int Gamma, int Beta, int Alpha)
{
X = (int)(cos(Alpha) * cos(Beta) * X);
Y = (int)((cos(Alpha) * sin(Beta) * sin(Gamma) - sin(Alpha) * cos(Gamma)) * Y);
Z = (int)((cos(Alpha) * sin(Beta) * cos(Gamma) + sin(Alpha) * sin(Gamma)) * Z);
return X + Y + Z;
}
int cal_Y(int X, int Y, int Z, int Gamma, int Beta, int Alpha)
{
int a,b,c;
X = (int)(sin(Alpha) * cos(Beta) * X);
Y = (int)((sin(Alpha) * sin(Beta) * sin(Gamma) + cos(Alpha) * cos(Gamma)) * Y);
Z = (int)((sin(Alpha) * sin(Beta) * cos(Gamma) - cos(Alpha) * sin(Gamma)) * Z);
return X + Y + Z;
}
int cal_Z(int X, int Y, int Z, int Gamma, int Beta, int Alpha)
{
int a,b,c;
X = (int)(-sin(Beta) * X);
Y = (int)(cos(Beta) * sin(Gamma) * Y);
Z = (int)(cos(Beta) * cos(Gamma) * Z);
return X + Y + Z;
}
int main()
{
const double PI = 3.1415926;
char buf[100];
char buf2[100];
int input_X, input_Y, input_Z;
int output_X, output_Y, output_Z;
bool flag = false;
// angle ( 0 ~ 360 )
int Alpha;
int Beta;
int Gamma;
FILE* input = fopen("input.obj", "r");
FILE* output = fopen("output.obj", "w");
if(input == 0) // file empty
{
cout << "file open error\n";
return 0;
}
cout << "X축 회전 (0 < θ < 360) : ";
cin >> Gamma;
cout << "Y축 회전 (0 < θ < 360) : ";
cin >> Beta;
cout << "Z축 회전 (0 < θ < 360) : ";
cin >> Alpha;
Gamma = Gamma * (PI / 180);
Beta = Beta * (PI / 180);
Alpha = Alpha * (PI / 180);
while(!feof(input))
{
fgets(buf, sizeof(buf), input);
strcpy(buf2, buf);
if(flag == false)
{
flag = true;
}
else
{
char *ptr = strtok(buf, " ");
if (strcmp(ptr, "v") == 0)
{
ptr = strtok(NULL, " ");
input_X = atoi(ptr);
ptr = strtok(NULL, " ");
input_Y = atoi(ptr);
ptr = strtok(NULL, " ");
input_Z = atoi(ptr);
output_X = cal_X(input_X, input_Y, input_Z, Gamma, Beta, Alpha);
output_Y = cal_Y(input_X, input_Y, input_Z, Gamma, Beta, Alpha);
output_Z = cal_Z(input_X, input_Y, input_Z, Gamma, Beta, Alpha);
sprintf(buf, "v %d %d %d\n", output_X, output_Y, output_Z);
}
else
{
strcpy(buf, buf2);
}
}
fputs(buf, output);
}
// file close
fclose(output);
fclose(input);
return 0;
}
댓글남기기