我在C++中编写光线跟踪器,需要能够检查场景中每个对象的交集(稍后会进行优化),为此,我需要保留一个正在运行的类实例列表。创建新实例时更新的指针列表将不起作用,因为据我所知在初始化后无法增加数组的大小。如果有的话,我真的很喜欢内置的(到C++)解决方案。如何保留一个类的实例列表?
回答
我在C++编写光线跟踪,需要能够检查交叉与场景中的每个对象[...]
的标准方法是空间图形。最常用的是八叉树,因为它们可以在三维空间中表示位置。平凡,空间树将是这个样子:
struct SpatialNode {
SpatialNode * children[8];
std::vector<object*> objects;
};
每个节点都有一个(隐性或显性)的位置和大小。当一个新对象被添加到世界场景中时,树会穿过儿童(占据由xy,yz和zx平面分割的八分区:上面4个,下面4个;左边4个,右边4个;后面4个,前面4个),并且只将对象添加到可以完全包含它的最小节点。 (很明显,你需要能够计算你的对象的尺寸以及他们是否可以在给定区域内完全包含。)
这具有相当快的(树的只有部分的好处,被检查实际上是相关的),无论是在填充它还是在搜索它。有几篇文章可以在维基百科,GameDev.net和其他地方阅读。
我接受了这个答案,因为它向我展示了为什么我应该使用优化结构开始。谢谢! – 2010-07-09 19:14:48
当我喜欢销毁我得到的对象时:警告C4150:删除指向不完整类型'MyClass'的指针;没有调用析构函数 – hfrmobile 2014-02-06 10:26:03
A std::vector
应该没问题(而且它的是是C++标准的一部分)。
由于每个对象的内存位置都是唯一的(因为每个对象都是独立创建的),所以只需要在向量中存储一个指向每个对象的指针,这使得事情变得更简单。 – fluffels 2010-08-13 17:49:05
创建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;
您可以使用任意数量的STL容器。
- 1. 的iOS:保留一个共享实例
- 2. 保留子类的中心列表,但避免静态实例
- 3. 如何保留一个ArrayList的单个子类的所有实例
- 4. 在C#中保留一个WebDriver实例
- 5. 如何实例化一个未知类型的通用列表?
- 6. C#如何将一个类的实例存储在列表中
- 7. 实例化一个列表
- 8. 如何为使用它的所有类/实例保留唯一的数据?
- 9. 跨单元会话会保留一个php单例类实例吗?
- 10. 如何从使用API的AWS账户获得列表保留实例(预先保留)使用API
- 11. aws修改保留实例
- 12. 如何确保只有一个View Model Base类的实例?
- 13. 如何从Actionscript 3.0中的另一个类实例引用一个类实例?
- 14. 如何删除一个类的实例?
- 15. 如何返回一个类的实例?
- 16. 将类实例保存在python列表中并迭代每个实例
- 17. 实例化一个类对象并初始化一个列表
- 18. 如何为Google App Engine保留一个正在运行的实例
- 19. 如何在另一个类中创建一个类的实例
- 20. 一个类实例
- 21. 实例化一个对象的列表
- 22. Mootools - 如何摧毁一个类实例
- 23. 如何实例化一个通用类
- 24. 如何“拒绝”实例化一个类
- 25. 如何从另一个列表中删除列表的每个实例?
- 26. 如何初始化包含另一个类的实例的列表?
- 27. 删除重复但保留第一个实例VBA宏
- 28. 扩展ec2保留实例的使用
- 29. 管理保留的Amazon EC2实例
- 30. 带有保留实例的AWS Auto Scaling
也许看看我对这个问题的回答[C++将对象存储到该对象的构造函数内的对象数组中](http://stackoverflow.com/questions/25838551),这是尝试使用更多现代指针。 – NGI 2016-08-21 21:47:44