[HW] Mesh Rotation

Date:     Updated:

카테고리:

태그:

📜문제

Input.obj 파일은 공을 들고 있는 남자인데 이것을 원하는 각도만큼 회전 시킬 수 있게 하는 프로그램을 작성하는 것이다. [.obj 파일 설명]

image

🔎접근

🌞코드

#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;
}

결과

맨 위로 이동하기

IAC 카테고리 내 다른 글 보러가기

댓글남기기