Перед тем, как описывать поведение системы, нам понадобится математическая библиотека. Поскольку координаты тел, их скорости и действующие силы являются векторными величинами, то прежде всего нужен класс, описывающий векторные операции в трехмерном пространстве. Многочисленные реализации такого класса описаны в литературе, в частности, в:

  1. Millington I. Game Physics Engine Development (все издания).
  2. Монтенбрюк О., Пфлегер Т. Астрономия на персональном компьютере. — С.-Пб: Питер, 2002. — 322 с.
  3. Shapira Y. Mathematical Tools in C++. — Chapman & Hall/CRC, 2009. — 600 p.
  4. Press W. H., Teukolsky S. A., Wettrling W. T., Flannery B. P. Numerical Recipies. The Art of Scientific Computing. — 3rd Edition. — Cambridge University Press, 2007. — 1262 p.

Мы взяли за основу класс Vector3 из книги [1]. Вот его наиболее существенные поля и методы:

class Vector3
{
public:

    double x;
    double y;
    double z;

    ...

public:

    Vector3() : x(0), y(0), z(0) {}
    Vector3(const double x, const double y, const double z)
        : x(x), y(y), z(z) {}

    double operator[](unsigned i) const
    {
        if (i == 0) return x;
        if (i == 1) return y;
        return z;
    }

    double& operator[](unsigned i)
    {
        if (i == 0) return x;
        if (i == 1) return y;
        return z;
    }

    ...

    Vector3 vectorProduct(const Vector3 &vector) const
    {
        return Vector3(y*vector.z-z*vector.y,
                       z*vector.x-x*vector.z,
                       x*vector.y-y*vector.x);
    }

    double scalarProduct(const Vector3 &vector) const
    {
        return x*vector.x + y*vector.y + z*vector.z;
    }

    void addScaledVector(const Vector3& vector, double scale)
    {
        x += vector.x * scale;
        y += vector.y * scale;
        z += vector.z * scale;
    }

    double magnitude() const
    {
        return sqrt(x*x+y*y+z*z);
    }

    ...

};

Этот класс мы поместим в файл mathcore.h. Позже, по необходимости, библиотека может пополнится классами, отвечающими за другие математические объекты: матрицы, кватернионы и т. п.

Код полностью



Комментарии

comments powered by Disqus