我刚刚在Uni大学完成第二年的游戏类(class),这一直困扰着我数学与游戏编程之间的联系。到目前为止,我一直在游戏中使用VectorsMatricesQuaternions,我可以理解它们在游戏中的使用方式。

这是关于数学与实时图形编程之间关系的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;
    }
    

    它将按您期望的那样打印结果64。尝试其他功能f。一个不错的练习是尝试制定规则以允许减法,除法,触发函数等。

    10-06 10:25
    查看更多