ОК, значит, вам нужно трехмерное декартово пространство с положительными и отрицательными координатами. Вы можете написать класс для реализации этого:
class Space {
public:
Space(int len) : _vox(len*len*len), _len(len) {}
Vox& operator()(int x, int y, int z);
private:
std::vector<Vox> _vox;
int _len;
};
Это создает объекты len ^ 3 Vox, но в одном векторе, который безопаснее и эффективнее, чем массив указателей в стиле C в стиле указателей.
operator()
- это функция индексации, которую можно использовать следующим образом:
Space space(51); // 3D: 51x51x51, valid indexes [-25..25]
Vox& vox = space(10, -5, 0);
// ... do things with the Vox at those coordinates
Я использую ()
вместо []
, поскольку operator[]
может принимать только один аргумент и мы бы предпочли три аргумента для более естественной трехмерной индексации. Реализуйте оператор индексирования следующим образом:
Vox& Space::operator()(int x, int y, int z)
{
// shift the "natural" input coordinates into "storage" coordinates
x += _len / 2; // 10 becomes 35
y += _len / 2; // -5 becomes 20
z += _len / 2; // 0 becomes 25
return _vox.at(x + y*_len + z*_len*_len); // index linear storage as 3D
}
Я использовал at()
вместо []
, потому что он проверяет диапазон и выдает исключение, если вы превышаете диапазон.