2015-01-13 83 views
-1

以下两个函数计算obj类型对象的体力。第一个函数调用第二个函数两次,是否有任何方法将这些方法结合在一起?将两种方法组合在一起

void calculateBodyForcesForEach(obj *pBody, obj *pHead, sys *sys) { 
    float fTotalForce[4] = {0.0f}; 

    calculateBodyForces(pBody, sys->m_pSun, fTotalForce, sys); 


    for (obj *pOtherBody = pHead; pOtherBody;) {  
     if (pBody != pOtherBody) { 
      calculateBodyForces(pBody, pOtherBody, fTotalForce, sys); 
     } 
     pOtherBody = pOtherBody->m_pNext; 
    } 

    vecCopy(fTotalForce, pBody->m_fForce); 
} 

void calculateBodyForces(obj *pBody, obj *pOtherBody, 
         float *fTotalForce, solarSystem *sys) 
{ 
    pBody->m_fForce[0] = 0.0f; 
    pBody->m_fForce[1] = 0.0f; 
    pBody->m_fForce[2] = 0.0f; 

    float fCalculatedForce[3] = {0.0f}; 

    float fCalculatedMass = pBody->m_fMass * pOtherBody->m_fMass; 

    float fDistanceBetweenPos[3] = {0.0f}; 
    vecSub(pOtherBody->m_fPosition, pBody->m_fPosition, fDistanceBetweenPos); 

    float fDistanceSquared = (fDistanceBetweenPos[0] * fDistanceBetweenPos[0]) + (fDistanceBetweenPos[1] * fDistanceBetweenPos[1]) + (fDistanceBetweenPos[2] * fDistanceBetweenPos[2]);   

    float fUnitVector[3] = {0.0f}; 
    vecSub(pOtherBody->m_fPosition, pBody->m_fPosition, fUnitVector); 
    vecNormalise(fUnitVector, fUnitVector); 

    float fGravitationalForce = sys->m_fGravitationalConstant * (fCalculatedMass/fDistanceSquared); 

    vecScalarProduct(fUnitVector, fGravitationalForce, fCalculatedForce); 

    vecAdd(fTotalForce, fCalculatedForce, fTotalForce); 
} 

//////我的解决方案,到目前为止,但仍其不工作

void calculateVelocityAndPosition(planet *pElement, solarSystem *pSystem) { //completly modified 

    float fStartPosition[4] = {0.0f,0.0f,0.0f,0.0f}; 
    float fAccelerationTime[3] = {0.0f,0.0f,0.0f}; 
    float fVelocityInterval[3] = {0.0f,0.0f,0.0f}; 
    float fTotalCalculated[3] = {0.0f,0.0f,0.0f}; 
    vecCopy(pElement->m_fPosition, fStartPosition); 
    vecScalarProduct(pElement->m_fAcceleration, pSystem->m_fTimeStep * pSystem->m_fTimeStep, fAccelerationTime); 
    vecScalarProduct(fAccelerationTime, 0.5f, fAccelerationTime); 
    vecScalarProduct(pElement->m_fVelocity, pSystem->m_fTimeStep, fVelocityInterval); 
    vecAdd(fVelocityInterval, fAccelerationTime, fTotalCalculated); 
    vecAdd(fStartPosition, fTotalCalculated, pElement->m_fPosition); 
    fori(3){ 
    pElement->m_fVelocity[i] = (pElement->m_fPosition[i] - fStartPosition[i])/pSystem->m_fTimeStep; 
    } 
    fori(3) 
    if (pElement->m_fVelocity[i] > pSystem->m_fMaxVelocity) 
    pElement->m_fVelocity[i] = pSystem->m_fMaxVelocity; 
    else if (pElement->m_fVelocity[i] < pSystem->m_fMaxNegativeVelocity) 
    pElement->m_fVelocity[i] = pSystem->m_fMaxNegativeVelocity; 
    vecScalarProduct(pElement->m_fVelocity, pSystem->m_fDragCoefficient, pElement->m_fVelocity); 
} 
+0

'combine'是什么意思?如果需要,您可以在第一个函数循环中使用内部函数代码,但是您的查询究竟是什么? –

+0

使两个函数的主体在一个函数体中 –

+0

任何你不能'剪切粘贴'循环内的代码的原因,正如我在前面的评论中提到的那样? –

回答

0
fori(3) 

是什么意思?

这个总和:

float fDistanceSquared = (fDistanceBetweenPos[0] * fDistanceBetweenPos[0]) + (fDistanceBetweenPos[1] * fDistanceBetweenPos[1]) + (fDistanceBetweenPos[2] * fDistanceBetweenPos[2]); 

最好做一个循环出来的:

float fDistanceSquared = 0.0f 
for (int i = 0; i<3; i++) 
fDistanceSquared += fDistanceBetweenPos[i] * fDistanceBetweenPos[i]; 

如何确定标产品?为什么它有三个变量? 此外,可能有助于了解正在解决的问题。

相关问题