我甚至无法在标题中描述我的问题。所以我现在试着解释一下。
我们假设我有这些课程:
class Circle:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
class Square:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
class Line:IInteractable
{
bool Intersects(Line line)...
bool Intersects(Square line)...
bool Intersects(Circle line)...
}
所以,你可以看到我想制作交叉函数的笛卡尔乘积来捕捉所有可能性。
我想将Circles,Squares和Lines放入一个数据结构中。所以,我决定创建界面:
interface IInteractable
{
bool Intersects(Line line);
bool Intersects(Square line);
bool Intersects(Circle line);
}
现在,例如,我创建了一些IInteractable对象的列表:
List<IInteractable> bodies = new List<IInteractable>();
bodies.Add(new Circle());
bodies.Add(new Line());
bodies.Add(new Circle());
bodies.Add(new Square());
bodies.Add(new Line());
我需要找出一些物体是否相交。所以,我将要做...
foreach ( IInteractablea in bodies)
foreach ( IInteractable b in bodies)
if( a != b)
if(a.Intersects(b))
// And here is the issue, because I have Intersects function for
// all object implementing IInteractable, but now i dont
// know with what type I am dealing with in parameter.
{
...
}
所以,向界面添加流动功能似乎是个好主意:
bool Intersects(IInteractable obj);
我在每个类实现IInteractable中都有所有函数Intersects()。因此,在每个班级中都可以轻松实现上述功能。但是,我必须以某种方式找出我正在处理的类型,调用适当的函数。这意味着,我需要根据类型进行切换,但是切换不允许这样做。所以我仍然可以使用if ... else if else ...但它非常可怕。
我的问题是:有没有更好的方法来解决我的问题?
编辑: 我的解决方案:
我是盲人和愚蠢的。现在,我看到了解决方案,不知道它是否是最优的,但肯定比前一个更好。在界面中:
bool Intersects(IInteractable obj);
并在每个班级
public virtual bool Intersects(IInteractable obj)
{
return obj.Intersects(this);
}
不需要演员:)
答案 0 :(得分:0)
这是一个类似于视频游戏中的碰撞检测的计算问题。如果是我,我的界面上会有一个Intersects方法。在内部,你可以通过让对象问对方是否在自己的空间内有任何点来天真地开始。您可以通过为每个项目设置一个矩形边界框来优化这一点,这使得计算变得容易,因为所有内容都是根据框的四个角来计算的。然后,非矩形的形状可以仅对已知位于边界框内的潜在交叉进行更细粒度的测试。至少在内部暴露由形状边界占据的有序点阵列以帮助进行该检查以及如果形状是开放的(线,弧)或闭合(圈,正方形)