【问题标题】:Combining two methods together将两种方法结合在一起
【发布时间】:2015-01-13 02:47:01
【问题描述】:

以下两个函数计算 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);
}

【问题讨论】:

  • combine 是什么意思?如果需要,您可以在第一个函数循环本身中使用内部函数代码,但您的查询到底是什么?
  • 将两个函数的主体放在一个函数体中
  • 有什么理由不能cut-paste 循环内的代码,正如我之前的评论中提到的那样?
  • 该函数在第一个函数中被调用了两次,所以如果我复制并粘贴第二个函数两次,我会尝试不这样做。

标签: c++ c function opengl


【解决方案1】:
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];

您如何确定标量积?为什么里面有三个变量? 此外,了解正在解决的问题可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多