[英]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.