C# WPF动画,是否检查重叠?

C# WPF动画,是否检查重叠?,c#,wpf,animation,C#,Wpf,Animation,注意:请务必阅读“让我们在聊天室中继续此讨论”以获取背景说明 我在这里看到了一些帖子和教程,用于检查控件是否重叠,但在动画中检查这一点的最佳方法是什么 我正在制作一个模拟软件,其中包括让一些元素沿着一条路径设置动画。目前,我有20个项目遵循这条路径,它工作得很好 为此,我只需创建一个20的循环,在循环内部,我创建UIElement、storyboard等,然后开始。我等待大约100毫秒,然后重复。这在元素之间提供了一个很好的间隙 无论如何,上面的工作应该是这样的。现在是下一位。在sim卡的任何

注意:请务必阅读“让我们在聊天室中继续此讨论”以获取背景说明


我在这里看到了一些帖子和教程,用于检查控件是否重叠,但在动画中检查这一点的最佳方法是什么

我正在制作一个模拟软件,其中包括让一些元素沿着一条路径设置动画。目前,我有20个项目遵循这条路径,它工作得很好

为此,我只需创建一个20的循环,在循环内部,我创建UIElement、storyboard等,然后开始。我等待大约100毫秒,然后重复。这在元素之间提供了一个很好的间隙

无论如何,上面的工作应该是这样的。现在是下一位。在sim卡的任何一点上,UIElement都可以停在它所在的位置。现在,当这种情况发生时,我希望其他UIElement继续运行,直到它们碰到停止的元素,然后一个接一个地堆积在它后面


因此,知道如何检查重叠/交叉/碰撞,我如何在元素动画期间进行检查。

碰撞检测本质上需要一个不断检查的计时器。因为WPF中没有冲突事件

您可以检查两个
Rect
对象与
rect1.IntersectsWith(rect2)

取自

可以使用以下命令查找元素相对于其父元素的
Rect

public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}
取自

问题是一次有多少个元素落入计时器的瓶颈,如果碰撞检测总是涉及一个停止的元素,那么该元素负责碰撞检测。否则,您将需要检查n^2个碰撞 (这很糟糕)。您可以通过尽可能减少比较次数来提高此瓶颈的效率。例如,由于对象沿公共路径移动,因此只能将停止的元素与其前一个元素进行比较。您可以确保一个有序的元素集合来实现这一点

由于所有元素都遵循公共路径(一次发生一次碰撞):

  • 当第一个元素停止时启动计时器。并将其设置为引用元素
  • 将所有必需元素与参考元素进行比较
    • 当被碰撞的图元发生碰撞时,更改参照图元

“这只是一个简单的例子,创建一个计时器,每100毫秒响一次,然后循环所有UIElement以查看它们是否重叠?”-也许。你试过了吗?有代码显示吗。好luck@MickyD不,我现在正在试。但即使它有效,我也在努力理解什么是最好的方法。如果计时器是最好的方式,那么有人可以说是的,这是唯一的方式,这很好,但其他人可能会说“不,不,你不想这样做,因为准确性会很差,你应该这样做”。当某个元素停止时,您需要检查是否与所有移动元素发生碰撞,我认为该元素超出了动画范围。@MickyD我不认为询问最佳方式一定是离题的。只问基于意见的问题是错误的。@MickyD,碰撞检测本身就是一个重复的问题,而不断移动的物体的碰撞检测似乎是一个重复的问题,需要更多的澄清。在问了几个问题后,我对这个问题变得相当清楚。对于像我这样的Unity开发人员来说,这是一个非常常见的问题,没有直接的解决方案,只有提示和技巧。如果OP想要一个复杂形状的元素,他会马上问,但是我们认为它是一个简单的形状。我个人认为这个问题和答案可以帮助未来的读者。这回答了我的问题,谢谢Bijan的帮助。@MickyD,我特别说过在我的答案中的一次更新过程中不要检查所有元素是否有冲突。@MickyD,你是对的,我忘了在我的答案中包括聊天中的一些重要评论。尽量简单,没问题,好先生。我会提前投票。祝你健康快乐,团结:)@ASh-“偷来的”是一个自嘲的笑话。没有任何措词是在没有署名的情况下复制的,他们提供了一个适当的引证,说明他们在回答中从何处提取代码。我处理(并删除)很多剽窃行为,但这不符合条件。