加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 服用1.0f或-1.0f的acos是否合法?

发布时间:2020-12-16 10:50:54 所属栏目:百科 来源:网络整理
导读:我的代码有问题,代理商四处走动突然消失了.这似乎是因为它们的位置在x和y轴上突然变为1.#INF000.我做了一点研究,有人说如果一个值分别超过或低于1和-1,这可能会发生在acos上,但接着说如果值也很接近就会发生这种情况.我添加了一个if语句来检查我是否曾经使用
我的代码有问题,代理商四处走动突然消失了.这似乎是因为它们的位置在x和y轴上突然变为1.#INF000.我做了一点研究,有人说如果一个值分别超过或低于1和-1,这可能会发生在acos上,但接着说如果值也很接近就会发生这种情况.我添加了一个if语句来检查我是否曾经使用1或-1的acos并且它确实在它们消失之前评估为1个帧周期,但是我真的不明白能够修复它的问题.任何人都能对这件事情有所了解吗?

D3DXVECTOR3 D3DXVECTOR3Helper::RotToTarget2DPlane(D3DXVECTOR3 position,D3DXVECTOR3 target)//XY PLANE
{
    //Create std::vector to target
    D3DXVECTOR3 vectorToTarget = target - position;

    D3DXVec3Normalize(&vectorToTarget,&vectorToTarget);

    //creates a displacement std::vector of relative 0,0
    D3DXVECTOR3 neutralDirectionalVector = D3DXVECTOR3(1,0);//set this to whatever direction your models are loaded facing   

    //Create the angle between them

    if(D3DXVec3Dot(&vectorToTarget,&neutralDirectionalVector) >= 1.0f ||D3DXVec3Dot(&vectorToTarget,&neutralDirectionalVector) <= -1.0f)
    {
        float i = D3DXVec3Dot(&vectorToTarget,&neutralDirectionalVector);
        float j = 0; //ADDED THIS IF STATEMENT
    }

    float angle = acos(D3DXVec3Dot(&vectorToTarget,&neutralDirectionalVector));

    if (target.y > position.y)
    {
        return D3DXVECTOR3(0,angle);
    }
    else
    {
        return D3DXVECTOR3(0,-angle);
    }
}//end VecRotateToTarget2DPlane()

解决方法

在可能正好/1.0的值上调用acos是危险的,因为舍入错误可能导致计算值超出此范围.

但它很容易修复 – 使用此功能:

double SafeAcos (double x)
  {
  if (x < -1.0) x = -1.0 ;
  else if (x > 1.0) x = 1.0 ;
  return acos (x) ;
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读