注意::请务必阅读让我们继续聊天中的讨论以获取背景说明
我在这里看到了一些帖子以及用于检查控件是否重叠的教程,但是在动画过程中检查控件的最佳方法是什么?
我正在制作一个仿真软件,其中涉及使一些UIElement沿路径动画。目前,我遵循此路径有20条,效果很好。
为此,我只创建了一个20的循环,并在循环内部创建了UIElement,情节提要等,然后开始。我等待约100毫秒,然后重复。这样可以在元素之间留出很大的空隙。
无论如何,以上都可以正常工作。现在下一位。在Sim的任何时候,UIElement都可以停在原处。现在,当发生这种情况时,我希望其他UIElement继续前进,直到它们撞到停止的元素为止,并以1比1的方式堆叠在其后面。
因此,知道如何检查重叠/交叉/碰撞时,如何在元素动画期间进行检查。
答案 0 :(得分:1)
从本质上讲,碰撞检测需要一个不断检查的计时器。因为WPF中没有碰撞事件。
您可以检查两个Rect
对象与rect1.IntersectsWith(rect2)
的碰撞情况
取自here
您可以使用
找到元素相对于其父元素的Rect
public static Rect BoundsRelativeTo(this FrameworkElement element,
Visual relativeTo)
{
return
element.TransformToVisual(relativeTo)
.TransformBounds(LayoutInformation.GetLayoutSlot(element));
}
取自here
问题是一次将多少个元素放入计时器的瓶颈中,如果冲突检测始终涉及停止的元素,则该元素负责冲突检测。否则,您将需要检查n ^ 2个冲突 (不好)。您可以通过尽可能减少比较次数来解决此瓶颈的问题。例如,由于对象沿公共路径移动,因此只能将停止的元素与其先前的元素进行比较。您可以确保元素的排序集合来实现。
由于所有元素都遵循相同的路径(一次发生一次碰撞):