不幸的是,我是一名新手程序员,但是一位经验丰富的数学家。
我想开发游戏,我想我已经掌握了一些像OpenGL这样的基本线性代数数学。不幸的是,我还没有技术诀窍来进行图形模拟。
作为一个基本练习,我想尝试模拟粒子在圆形路径中的连续运动。我使用了简单的参数化
double t=0;
double x = cos(t), y = sin(t);
根据微软的说法,我知道double的范围是 1.7E +/- 308 。那么我的问题是,“我怎样才能确保粒子最平滑连续的圆形环?”我认为可能发生的问题是,如果程序运行得足够长,随着 t 越来越大,我们就会达到 t 重置为最低值的程度这可能会导致粒子位置“跳跃”。
我已经考虑过了,我想知道是否有必要从[1.7E-308,1.7E + 308)→[0,2π]创建 t 的映射。这有助于防止任何位置“跳跃”吗?或者这样做是否有问题,我不是在想?我的计划是以预定的速度增加 t ,我还没有确定。但是我看到 t 增加的速率决定了 x 和 y 坐标变化的速度。
答案 0 :(得分:1)
你太担心了。或者至少是错误的事情。太阳会变成一个红色的巨人,并且在你通过增加一个小的增量超过一个双倍的最大值之前吞下地球。
一个稍微严重的问题是t
的绝对精度随着幅度的增加而减小。这是基于双精度相对于其大小的事实。即使这需要很长时间才能成为一个真正的问题,但它会在t
超过双倍范围之前发生。
另一个相关且更真实的问题是,对于较大的输入值,cos()
/ sin()
实现可能会变得不那么精确。您通常会在标准库或硬件中找到的高质量实现有望减少参数,因此这不应该是一个很大的问题。
所有这些都说,避免任何这些问题,尽管它们可能实际上是遥远的,但是很容易让你照顾它。只要在递增后超过2 * pi,您只需减少t
的值:
t += tInc;
if (t > 2.0 * M_PI)
{
t -= 2.0 * M_PI;
}
这样,该值将始终保持在0和2 * pi之间。
BTW:对于任何与图形相关的东西,你需要双精度才能非常罕见。除非你有一个非常不寻常的用例,否则使用float
类型的变量和常量就足够了。您将使用的图形库通常以float
精度运行,因此在您自己的代码中使用double
将只使用额外的内存,并导致大量的类型转换。