我刚刚在Uni大学完成第二年的游戏类(class),这一直困扰着我数学与游戏编程之间的联系。到目前为止,我一直在游戏中使用Vectors
,Matrices
和Quaternions
,我可以理解它们在游戏中的使用方式。
这是关于数学与实时图形编程之间关系的General Question
,我很好奇数学的动态性。是否所有的公式和导数都已预定义(半定义)?
实时计算导数/积分甚至可行吗?
这些是我不知道它们如何适合编程/数学的一些事情,例如。
MacLaurin/Talor Series
我可以看到这很有用,但是是必须通过函数及其派生类,还是可以将其传递给单个函数并为您计算出派生类呢?MacLaurin(sin(X)); or MacLaurin(sin(x), cos(x), -sin(x));
Derivatives /Integrals
这与第一点有关。计算在运行时动态完成的函数的y'
,或者这可能是通过set函数内部的变量静态完成的。f = derive(x); or f = derivedX;
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
}
现在可以编写一个C++函数来计算f对x的导数。这是一个完整的自包含程序,用于计算f的导数。这是精确的(对于机器精度),因为它没有使用诸如有限差分之类的不准确方法。我将在我编写的paper中解释其工作原理。它概括为更高的导数。请注意,许多工作都是由编译器静态完成的。如果您启动优化,并且编译器内联得体,则它应该与您为简单函数可以手工编写的任何东西一样快。 (有时更快!特别是,它在同时摊销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;
}
它将按您期望的那样打印结果
6
和4
。尝试其他功能f
。一个不错的练习是尝试制定规则以允许减法,除法,触发函数等。