2010-07-09 52 views
2

我在C++中编写光线跟踪器,需要能够检查场景中每个对象的交集(稍后会进行优化),为此,我需要保留一个正在运行的类实例列表。创建新实例时更新的指针列表将不起作用,因为据我所知在初始化后无法增加数组的大小。如果有的话,我真的很喜欢内置的(到C++)解决方案。如何保留一个类的实例列表?

+0

也许看看我对这个问题的回答[C++将对象存储到该对象的构造函数内的对象数组中](http://stackoverflow.com/questions/25838551),这是尝试使用更多现代指针。 – NGI 2016-08-21 21:47:44

回答

3

我在C++编写光线跟踪,需要能够检查交叉与场景中的每个对象[...]

的标准方法是空间图形。最常用的是八叉树,因为它们可以在三维空间中表示位置。平凡,空间树将是这个样子:

struct SpatialNode { 
    SpatialNode * children[8]; 
    std::vector<object*> objects; 
}; 

每个节点都有一个(隐性或显性)的位置和大小。当一个新对象被添加到世界场景中时,树会穿过儿童(占据由xy,yz和zx平面分割的八分区:上面4个,下面4个;左边4个,右边4个;后面4个,前面4个),并且只将对象添加到可以完全包含它的最小节点。 (很明显,你需要能够计算你的对象的尺寸以及他们是否可以在给定区域内完全包含。)

这具有相当快的(树的只有部分的好处,被检查实际上是相关的),无论是在填充它还是在搜索它。有几篇文章可以在维基百科,GameDev.net和其他地方阅读。

+0

我接受了这个答案,因为它向我展示了为什么我应该使用优化结构开始。谢谢! – 2010-07-09 19:14:48

+0

当我喜欢销毁我得到的对象时:警告C4150:删除指向不完整类型'MyClass'的指针;没有调用析构函数 – hfrmobile 2014-02-06 10:26:03

3

A std::vector应该没问题(而且它的是C++标准的一部分)。

+0

由于每个对象的内存位置都是唯一的(因为每个对象都是独立创建的),所以只需要在向量中存储一个指向每个对象的指针,这使得事情变得更简单。 – fluffels 2010-08-13 17:49:05

4

创建vector(或set)指针在场景中的对象为一类的静态成员,并把所有的构建函数插入this到集合,和dtor从集合中删除this

// really pseudo-code -- not intended to compile as-is, but I hope it helps 
// convey the general idea. 
// 
class scene_object { 
    static std::set<scene_object const *> instances; 
public: 

    scene_object() : { instances.insert(this); } 
    scene_object(scene_object const &other) { instances.insert(this); } 
    // probably more ctors here... 

    ~scene_object() { instances.delete(this); } 
}; 

std::set<scene_object> scene_object::instances;