5 c++ math video-game-consoles
我刚刚在Uni做了第二年的游戏课程,这总是让我觉得数学和游戏编程是如何相关的.到现在为止,我一直在使用Vectors,Matrices以及Quaternions在游戏中,我可以在待机如何将这些融入游戏.
这是General Question关于数学和实时图形编程之间的关系,我很好奇数学是多么动态.是否所有公式和衍生物都是预定义的(半定义)?
是否可以实时计算衍生物/积分?
这些是我看不出它们如何适合编程/数学的一些事情作为一个例子.
MacLaurin/Talor Series 我可以看到这是有用的,但是你必须通过你的函数及其衍生物,或者你能将它传递给一个函数并让它为你找出衍生物吗?
MacLaurin(sin(X)); or MacLaurin(sin(x), cos(x), -sin(x));
Run Code Online (Sandbox Code Playgroud)Derivatives /Integrals这与第一点有关.计算y'在运行时动态完成的函数,或者这是静态完成的事情,也许是在set函数内部的变量.
f = derive(x); or f = derivedX;
Run Code Online (Sandbox Code Playgroud)Bilnear Patches我们了解到这是一种可能在小块中生成景观的方法,可以"拼凑"在一起,这是游戏中发生的事情吗?我从来没有听说过(授权我的知识非常有限)与程序方法或其他方式一起使用.到目前为止我所做的涉及处理顶点信息的数组.
对不起,如果这是偏离主题,但这里的社区似乎有点,在这种事情上.
谢谢.
从字面上看,Skizz的答案是正确的,但只需要进行一些小改动就可以计算出C++函数的导数.我们将skizz的功能修改f为
template<class Float> f (Float x)
{
return x * x + Float(4.0f) * x + Float(6.0f); // f(x) = x^2 + 4x + 6
}
Run Code Online (Sandbox Code Playgroud)
现在可以编写一个C++函数来计算f相对于x的导数.这是一个完整的自包含程序来计算f的导数.它是精确的(机器精度),因为它没有使用像有限差分这样的不准确方法.我在我写的一篇论文中解释它是如何工作的.它推广到更高的衍生品.请注意,大部分工作都是由编译器静态完成的.如果你打开优化,并且你的编译器很好地内联,那么它应该和你为简单函数手动编写的任何东西一样快.(有时候更快!特别是,它在分析计算f和f'的成本方面非常擅长,因为它使编译器发现的公共子表达式消除比为f和f'编写单独的函数更容易.)
using namespace std;
template<class Float>
Float f(Float x)
{
return x * x + Float(4.0f) * x + Float(6.0f);
}
struct D
{
D(float x0, float dx0 = 0) : x(x0), dx(dx0) { }
float x, dx;
};
D operator+(const D &a, const D &b)
{
// The rule for the sum of two functions.
return D(a.x+b.x, a.dx+b.dx);
}
D operator*(const D &a, const D &b)
{
// The usual Leibniz product rule.
return D(a.x*b.x, a.x*b.dx+a.dx*b.x);
}
// Here's the function skizz said you couldn't write.
float d(D (*f)(D), float x) {
return f(D(x, 1.0f)).dx;
}
int main()
{
cout << f(0) << endl;
// We can't just take the address of f. We need to say which instance of the
// template we need. In this case, f<D>.
cout << d(&f<D>, 0.0f) << endl;
}
Run Code Online (Sandbox Code Playgroud)
它打印结果,6并 4按照您的预期.尝试其他功能f.一个很好的练习是尝试制定规则以允许减法,除法,三角函数等.