c# - WPF动画,检查重叠?
问题描述
注意: 请务必阅读让我们在聊天中继续讨论以获取背景说明
我在这里看到了一些帖子和检查控件是否重叠的教程,但是在动画期间检查这个的最佳方法是什么?
我正在制作一个模拟软件,其中涉及让一些 UIElements 沿着路径动画。目前我有 20 个项目遵循这条路径,它工作正常。
为此,我只需创建一个 20 的循环,在循环内,我正在创建 UIElement、情节提要等,然后开始。我等待大约 100 毫秒然后重复。这在元素之间提供了一个很好的间隙。
无论如何,上述工作正常。现在下一点。在 sim 的任何位置,UIElement 都可以停止在它所在的位置。现在,当这种情况发生时,我希望其他 UIElements 继续运行,直到它们碰到停止的元素,并且它们 1 x 1 堆积在它后面。
因此,知道如何检查重叠/相交/碰撞,如何在元素动画期间进行检查。
解决方案
就其本质而言,碰撞检测需要一个不断检查的计时器。因为 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 次碰撞(这很糟糕)。您可以通过尽可能减少比较次数来提高此瓶颈的效率。例如,由于对象沿公共路径移动,您可以仅将停止的元素与其前一个元素进行比较。您可以确保元素的排序集合来实现这一点。
由于所有元素都遵循共同的路径(一次发生一次冲突):
- 当第一个元素停止时启动计时器。并将其设置为参考元素
- 将所有必需元素与参考元素进行比较
- 当被碰撞的元素发生碰撞时改变参考元素
推荐阅读
- java - 等到 ActionListener 完成执行以收集数据
- c# - 声明一个引用属性 Non-Nullable?
- html - 完成学位项目的地理定位实时无人机
- nativescript - 通过 nativescript tns 命令发布 iOS 时出错
- python - Spyder 不会从 Anaconda 2019.10 Navigator 启动
- node.js - 在单个页面上存储用户访问的会话
- angular - 角垫按钮:悬停背景颜色有效,如果我使用白色以外的颜色
- database - Electron - 如何在不同的应用程序安装之间保持离线数据和同步
- android - 按钮、Edittexts、Textview 等视图组件是否应该是静态的(Android Studio)
- c# - c# 从另一个方法引用标签