首页 > 解决方案 > WPF动画,检查重叠?

问题描述

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


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

我正在制作一个模拟软件,其中涉及让一些 UIElements 沿着路径动画。目前我有 20 个项目遵循这条路径,它工作正常。

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

无论如何,上述工作正常。现在下一点。在 sim 的任何位置,UIElement 都可以停止在它所在的位置。现在,当这种情况发生时,我希望其他 UIElements 继续运行,直到它们碰到停止的元素,并且它们 1 x 1 堆积在它后面。

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

标签: c#wpfanimation

解决方案


就其本质而言,碰撞检测需要一个不断检查的计时器。因为 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 次碰撞(这很糟糕)。您可以通过尽可能减少比较次数来提高此瓶颈的效率。例如,由于对象沿公共路径移动,您可以仅将停止的元素与其前一个元素进行比较。您可以确保元素的排序集合来实现这一点。

由于所有元素都遵循共同的路径(一次发生一次冲突):

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

推荐阅读