首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算行星间的引力方向

计算行星间的引力方向
EN

Stack Overflow用户
提问于 2016-01-09 03:26:06
回答 1查看 259关注 0票数 5

我试图用C语言在opengl中建立一个太阳系的模拟。我似乎不知道如何编写计算另一颗行星所受力方向的代码。这就是我到目前为止所拥有的:

代码语言:javascript
运行
复制
void attraction(planet self, planet other, float *direction)
{
   float d = vecDistance(self.p, other.p);

   //calc the force of attraction
   float f = G * ((self.mass * other.mass) / (pow(d, 2)));

   //calc the direction of the force
   float vectorDist[3];
   vecSub(self.p, other.p, vectorDist);

   direction[0] = f*vectorDist[0] / d;
   direction[1] = f*vectorDist[1] / d;
   direction[2] = f*vectorDist[2] / d;
}



float vecDistance( float *pV1, float *pV2 )
{
    float fLen=0.0f;

    if(pV1 && pV2)
    {
        float av[3];

        vecSub(pV2, pV1, av);
        fLen=vecLength(av);
    }

    return fLen;
}


void vecSub( float *pV0, float *pV1, float *pVRes )
{
    if(pV0 && pV1 && pVRes)
    {
        pVRes[0]=pV0[0]-pV1[0];
        pVRes[1]=pV0[1]-pV1[1];
        pVRes[2]=pV0[2]-pV1[2];
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-09 07:22:32

如果没有输入数据,很难知道,但我猜您正遇到浮点溢出,因为您操作的值太大了。

例如,如果您的单元位于SI单元系统中,那么:

代码语言:javascript
运行
复制
venus.mass = 4.87e+24;    // kg
earth.mass = 5.98e+24;    // kg

你方程式中的分子变成:

代码语言:javascript
运行
复制
self.mass * other.mass == 2.91047e+49;

单精度floating-point numbers不能大于3.4e+38,因此质量乘积被视为无穷大.

当然,高指数在某种程度上相互抵消,因为距离也很大(按1e+10的顺序),引力常数也很小,但是如果上面的积是一个内在的结果,那么所有相关的结果都是错误的。( -1.0#IND的意思是不确定的,对应于NaN,而不是数字,一个无效的浮点数。)

有几种方法可以解决这个问题:

  • 使用可以在浮点系统中安全地平方的值。例如,如果你用地球的质量来规范质量,你会得到大约1.0的数字,这应该是安全的计算。同样,距离的一个好单位可能是astronomical unit
  • 重新排列表达式,以避免中间表达式溢出。例如,不要使用(m1 * m2) / (d*d),而是编写(m1 / d) * (m2 / d)
  • 使用double而不是浮点。最大可表示的double大约是。1.8e+308。请注意,duoble并没有解决这个问题,它只是给了您更大的操作空间。不过,以你为例,你应该做得很好。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34689392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档