2013-06-01 6 views
2

특정 시점에 객체의 현재 높이를 출력하는 간단한 C++ 프로그램을 작성하려고합니다. 성취하고자하는 대상은 중력이 가해진 임의의 속도에서 벗어난 다양한 위치에서 시작하는 대상을 가지고 있다는 것입니다. 공이 벽이나 다른 물체와 충돌하면 에너지 손실없이 뒤로 움직여야하지만 중력 때문에 계속 떨어집니다. 공이 특정 높이에 도달하면 해당 값을 출력하십시오.C++ Logic Issue

지금 내 노력은 내 공이 너비 경계를 벗어 났는지 확인하는 것입니다. 그러나 저의 삶에 대해 왜 저의 마지막 if 문이 부르지 않는지 알 수 없습니다.

나는 정말/어리석은 것을하고 있습니까? 거리가 폭을 넘어 간 경우

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    float velocity; 
    float height, targetHeight; 
    float gravity; 
    float time; 
    float angle; 
    float width; 
    float move; 
    float distance; 

    gravity = 9.80f; 
    time = 0; 
    distance = 0; 

    cout << "Set Height\n"; 
    cin >> height; 

    cout << "Set target height\n"; 
    cin >> targetHeight; 

    cout << "Set Angle (0 - 90): \n"; 
    cin >> angle; 
    angle *= 3.14 * 180; // convert to radians 

    cout << "Set velocity (0 - 100): \n"; 
    cin >> velocity; 

    cout << "Set Play field Width: \n"; 
    cin >> width; 


    while(height >= target ) 
    { 
     time++; 
     distance += velocity * cos(angle) * time; 
     height += (velocity * sin(angle) * time) - (gravity * pow(time, 2))/2; 
    } 

    if(distance == width) 
    { 
      cout << "You've hit the wall\n"; 
    } 

    return 0; 
} 
+1

'while'에서'target' 대신'targetHeight'을 사용해야합니까? – ChiefTwoPencils

+2

거리가 다른 벽에 부딪 치는 지 확인하기 위해 거리 == 0인지 확인해야합니까? 또한 볼이 벽을 통과 할만큼 충분히 빠르게 움직이는 경우 어떻게해야합니까? 당신은 아마 (거리> = 너비 또는 거리 <= 0)를 확인해야합니다 – Chachmu

+0

'float' 평등 테스트를 만나면 항상 놀라게됩니다! – xtofl

답변

3

귀하의 최종 ifif(distance == width)는 테스트하지 않습니다. 아마도 if(distance >= width)을 원할 것입니다. 이동 루프 내에서 이동 거리를 테스트 한 것으로 보이지 않으므로 거리가 너비보다 쉽게 ​​커질 수 있으므로 if가 참이 아닙니다.

1

같은 속도로 뒤로 이동 : velocity = -velocity;. 물론 뒤쪽으로 움직이는 경우 다른 벽에 부딪 힐 수 있으므로 distance == 0;도 확인하고 싶을 것입니다. (부동 소수점이므로 정확한 비교 대신 >=<=을 사용하거나 벽이 1 마이크로 미터 였고 태양이 닿을 때까지 계속되거나 수학이 소진 될 때까지 계속 볼 수 있습니다. 네가 영원히 계속 간다면 다른 일이 생길거야.)

공이 튀는 "방"의 너비와 너비가 필요하다는 것을 더 알았습니다. 따라서 총계에서 볼의 X, Y 및 Z 좌표가 필요합니다.

1

참고 : 시간이 갈수록 늘어나므로 키와 거리에 대한 직접 수식 (즉, distance = f(time);)이 포함되어 있지만 누적됩니다.

그래서 아마 당신은 할당 대신 distanceheight 변수 증가 의 원하는 :

그에게
distance = velocity * cos(angle) * time; 
    height = (velocity * sin(angle) * time) - (gravity * pow(time, 2))/2; 

다음, 당신은 아마도 여행 distance받는 사람의 거리를 초과하는지 여부를 확인하려면 벽 (float의 평등은 매우 가능성이없고 부정확합니다).

일부 문체에 대한 조언 :이 방정식을 독자적인 기능으로 표현하십시오.