c++로 다이렉트 X 공부를 하는데 궁금한점이 있습니다.

    ///육각형 만들기
    CUSTOMVERTEX vertices[18];
    for (int i = 0; i < 6; i++) {
        vertices[i * 3 + 0] = { 0,0,0,0xffff0000 };
        vertices[i * 3 + 1] = { 100 * cosf((i * 60) / 180.0 * 3.14),
                                100 * sinf(i * 60 / 180 * 3.14) ,0,0xffff0000 };
        vertices[i * 3 + 2] = { 100 * cosf((i * 60 + 60) / 180.0 * 3.14),
                                100 * sinf((i * 60 + 60) / 180 * 3.14),0,0xffff0000 };
    }

다이렉트 X에서 간단하게 육각형을 그리는 연습을 하고있었습니다.

근데 빈 공간에 아무런 도형도 그려지지 않아 이상해서 여기저기 손을 봤는데

메모리 할당도 문제도 없고 버퍼도 문제가 없어서

대체 어디가 문제인가 했더니

100 * sinf((i * 60 + 60) / 180 * 3.14)

이 코드가 문제였더군요 180으로 나누는게 아니라 180.0으로 나눠야

도형이 그려지기 시작했습니다.

여기서 한가지 의문점이 들었는데 초반에 그냥 sin과 cos 함수를 쓰려고 하니

vertex 구조체에서 너무 범위가 크다고 하여 sinf 와 cosf 즉 float 형 함수를 써서

적용하는데 성공했습니다. 다만 제가 알기론 sinf와 cosf 함수들은

sin cos 함수의 계산 결과물을 float 형으로 바꾸는 함수로 아는데

왜 180으로 나누면 도형이 그려지지 않고 180.0으로 나눠야만 도형이 그려지는지 궁금합니다

결국엔 자료형 변환을 통해 float으로 바뀌는건데 정수를 곱하는것과 실수를 곱하는게

문제가 되나요? 거기에 결국 마지막에 라디안으로 치환하기 위해 3.14를 곱하는데

그럼 결국 실수형이 되서 문제가 없을것 같거든요 저의 얄팍한 지식으론

대체 이유가 뭘까요?

저의 얄팍한 지식으로는 아마 곱셈 순서가 순서대로 되는데 int 형으로 되면서 육각형 그리는데 중요한 소수점 부분들이 날라간거 같습니다.
이미 날라간건 소수점으로 바꾼다고 해도 변하질 않으니깐요…

1 Like

(i * 60 + 60) 은 int고, 180도 int죠.

이 두개의 나눗셈 결과는 int이기 때문에 소숫점 이하가 전부 버려집니다.

따라서 원하는 결과를 얻을 수 없게 되겠죠.

180.0은 double 형으로 취급되기 때문에 int / double 이 되어 double 의 결과값이 나오는거구요.

윗분들께서 잘 설명해주셨는데 간단한 예를 들면 int형끼리의 나눗셈은 이렇게 됩니다.

1 / 3 == 0

인거죠

1 / 3.0 == 0.33333

이고요

감사합니다 말씀하신게 맞았어요 180을 먼저 곱해버려서 소숫점이 버려진게 문제였습니다. 순서를 바꿔서 3.14를 먼저 곱하고 180을 나누니 잘되네요!!

감사합니다 말씀하신게 맞았어요 180을 먼저 곱해버려서 소숫점이 버려진게 문제였습니다. 순서를 바꿔서 3.14를 먼저 곱하고 180을 나누니 잘되네요!!!

감사합니다! 말씀하신게 맞았어요 180을 먼저 곱해버려서 소숫점이 버려진게 문제였습니다. 순서를 바꿔서 3.14를 먼저 곱하고 180을 나누니 잘되네요!!

네 나눗셈을 할때 본인이 원하는게 몫을 구하는건지 아니면 근사값을 계산하고 싶은건지 꼭 확인하여
올바르게 코드로 구현하시기 바랍니다.