2012-05-28 2 views
0

공간의 참조 점을 중심으로 규칙적으로 간격을 둔 문의 원을 만들어야합니다. 프로그램이 실행될 때마다 원안에 다른 수의 항목이 표시되므로 증가 된 항목 수를 수용하도록 자동으로 조정됩니다. 나는 이것이 프로그래밍 문제 라기보다 수학적 질문에 더 가깝다는 것을 알고 있지만, 나는 혼란 스럽다. 다음 코드는 내가 가진 것만 큼 가까이 있습니다 :점 주위를 원으로 객체 만들기

block->setPosition(core::vector3df(sin(segdeg*itemnumber)*radius+referencepoint.X, 
            0, 
            cos(segdeg*itemnumber)*radius+referencepoint.Z)); 

블록이 객체이며,이 코드는 각 항목에 대해 실행됩니다. segdeg는 360/항목 수입니다. 다시 말하면, SEGMENT DEGrees. 반지름은 중심점에서 얼마나 멀리 있어야하는지 나타냅니다. 항목 번호는 해당 항목의 색인입니다. 항목 번호는 어느 항목입니까?

이 코드는 각 문을 매우 가깝게하지만 여전히 약 10-15도 정도 떨어져 있습니다. (첫 번째 문은 항상 켜져 있습니다.) 항목은 모두 중심점에서 정확한 거리입니다. 나는 이것이 정말로 분명한 대답이 될 것이라 확신하지만, 몇 시간 동안 그것을 풀 수는 없었고 나는 내 엉덩이를 끈적 거리며 봤다.

누구든지 내 알고리즘을 수정할 수 있습니까?

답변

2

sin 및는 각도가 아닌 라디안 단위로 인수를 취합니다. segdeg = 360.0/the_number_of_items (SEGment DEGrees) 대신 segrad = 2 * pi/the_number_of_items (SEGment RADians)이 필요합니다.

귀하의 구현은 파이 값을 제공 할 수 있습니다,하지만 당신은 boost::math::constants::pi<double>()를 사용하거나에 자신을 넣어해야 할 수도 있습니다, 그래서 아무도 표준에 없다. 0은 어떠한 조치 0이기 때문에

첫 번째 항목이 올바른 것입니다.

+0

성공! 라디안 트릭이 작동했습니다. 그러나 "2 * 3.14/etc"를 넣는 것은 매우 이상하게 만들었지 만, segdeg를 0.0174532925 (segdeg를 라디안으로 변환)만큼 곱하면 모두 잘됩니다. 마 히어로 : 3 – Magicaxis

2
int doors = 5; 
double rotation = 2 * M_PI/doors; 
for(int door = 0; door < doors; ++door) 
{ 
    double door_rotation = door * rotation; 
    double door_x = reference_x + cos(door_rotation); 
    double door_y = reference_y + sin(door_rotation); 
}