繁体   English   中英

WPF 动画,检查重叠?

[英]WPF animation, check for overlapping?

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


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

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

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

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

所以知道如何检查重叠/交叉/碰撞,我如何在元素动画期间检查。

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

您可以使用rect1.IntersectsWith(rect2)检查两个Rect对象的碰撞

取自这里

您可以使用以下方法找到元素相对于其父元素的Rect

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

取自这里

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM