我在设计处理几何的应用程序部分时遇到问题。特别是,我希望有一个层次结构的类和交叉的单独方法。
问题
层次结构将是这样的:
- 几何学
- 网
- 参数
- 盒子
- 领域
相交方法类似于:
namespace intersections
{
bool intersection( const Box &, const Box &);
bool intersection( const Box &, const Sphere &);
}
这很简单。现在问题出现了,当我想将所有几何图形一起存储在一个结构中时,例如一个std::vector
(或 KD-Tree,或其他)。
为此,我需要使用std::vector<Geometry*>
. 但是,从这个向量中读取会得到Geometry*
对象,因此我无法调用适当的交集函数。
问题示例:
std::vector<Geometry*> arrGeometry;
// add the elements
arrGeometry.push( new Box() );
arrGeometry.push( new Sphere() );
// ... some more code
// try to intersect them?
Geometry* g1 = arrGeometry[0];
Geometry* g2 = arrGeometry[1];
bool intersecting = intersections::intersection( g1, g2 ); //< As expected, this does
// not work
如果我在几何对象中实现算法,问题可以通过访问者和一些非常奇怪的函数调用弹跳来解决。
但是,我想将交集算法保留在几何类之外。原因是:
避免决定哪个应该拥有所有权(例如,你在哪里实现盒子和球体之间的交集,在
Box
还是在Sphere
?)为了避免使几何对象混乱,可以对几何做所有的事情,这是相当多的(仅举几例:体素化它,计算交叉点,应用构造几何运算符......)。因此,在这里将逻辑与数据分离是非常可取的。
另一方面,我需要有一个层次结构而不是模板,因为对于某些事情,可以抽象出特定的几何图形......(例如,将其存储在 astd::vector
或 KD-Tree 或......)。
你会如何解决这个问题?有没有适合这个的设计模式?我尝试查看一些库,但最终我更加困惑,我已经...
最简单的方法(有时使用)是使用 RTTI(或伪造它)和向下转换,但这并不完全可维护......(添加新几何意味着通过所有代码更改大量 switch 语句)。
有什么想法吗?
非常感谢你提前。