gpt4 book ai didi

c++ - 在物理计算中表示无穷大

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:37 26 4
gpt4 key购买 nike

我目前正在编写一些函数来处理 C++ 中的弹性碰撞。在处理移动物体与不动物体碰撞时,我遇到了一个绊脚石,因为计算要求不动物体具有无限大的质量。

我知道 std::numeric_limits提供 infinity()但我不确定它在这种情况下是否完全有用,因为据我所知,这只是浮点表示中可能的最大数量。在下面的代码中,如果 aabb_obj质量等于 std::numeric_limits<double>::max()似乎每个使用它的计算都将导致 std::numeric_limits<double>::max()0 .

double t;
if (intersect_moving_circle_aabb(circle_obj, aabb_obj, t))
{
circle_obj->position += circle_obj->velocity * t;

vec2 closest_point;
closest_pt_point_aabb(circle_obj->position, aabb_obj, closest_point);

vec2 n = (closest_point - circle_obj->position).normalized();

double a = dot_product(circle_obj->velocity, n);

double p = (2.0 * a) / (circle_obj->mass + aabb_obj->mass);

circle_obj->velocity = circle_obj->velocity - p * aabb_obj->mass * n;
}

这是针对游戏的,因此结果不需要 100% 物理准确,只需“足够好”即可。在此类计算中表示无穷大的推荐方法是什么?我只是选择一个任意高的数字吗?

最佳答案

对于 IEEE float ,硬件已经对两个无穷大以及非数字值 (NAN) 进行了特殊处理。他们遵守正常的数学规则:

1/0 = +inf
+inf + x = +inf
-inf + +inf = NAN
x/+inf = 0
0*+inf = NAN
...

现在您可以检查您的代码,看看如果您为质量之一插入 +inf 会发生什么:这将产生一个值 p = 0,并且如果 aabb_obj->mass 是有限的,则 p * aabb_obj->mass 将产生 0,或者 NAN 如果它是无限的。后一种情况是您需要避免的,因为 NAN 将通过其他操作传播,产生 circle_obj->velocity = NAN

关于c++ - 在物理计算中表示无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com