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个碰撞
(这很糟糕)。您可以通过尽可能减少比较次数来提高此瓶颈的效率。例如,由于对象沿公共路径移动,因此只能将停止的元素与其前一个元素进行比较。您可以确保一个有序的元素集合来实现这一点
由于所有元素都遵循公共路径(一次发生一次碰撞):
- 当第一个元素停止时启动计时器。并将其设置为引用元素
- 将所有必需元素与参考元素进行比较
- 当被碰撞的图元发生碰撞时,更改参照图元