簡體   English   中英

在 Swift 中相互檢查數組中的所有元素

[英]Checking all elements in an array in Swift against each other

對於我的應用程序,我試圖確定圓形視圖數組中的元素是否相互重疊。 我有一個 for 循環,它遍歷數組中的圓元素,檢查元素是否與前一個元素重疊,如果是; 改變元素在視圖中的位置:

func drawCircles(){
    for c in circles {
        c.center =  getRandomPoint()
        let prev = circles.before(c)
                
        if let prevCircleCenter = prev?.center {
            let dist = distance(prevCircleCenter, c.center)
            //50 = width of each circle
            if dist <= 50 {
              
                var newCenter = c.center
                var centersVector = CGVector(dx: newCenter.x - prevCircleCenter.x, dy: newCenter.y - prevCircleCenter.y)

                centersVector.dx *= 51 / dist
                centersVector.dy *= 51 / dist
                newCenter.x = prevCircleCenter.x + centersVector.dx
                newCenter.y = prevCircleCenter.y + centersVector.dy
                c.center = newCenter
            }
        }
    }
    
    for c in circles {
        self.view.addSubview(c)
    }
}

這是我用來檢查前一個元素的方法:

extension BidirectionalCollection where Element: Equatable {
    func before(_ element: Element, loop: Bool = false) -> Element? {
        if element == first && loop { return last }
        guard let index = dropFirst().firstIndex(of: element) else {
            return nil
        }
        return self[self.index(before: index)]
    }
}

我曾嘗試添加一個內部 for 循環來重新檢查所有下一個元素和前一個元素是否重疊,但這似乎不起作用。

所以,我想我想弄清楚如何相互檢查數組中的每個 CircleView 元素,以確保它們沒有重疊的位置。

不確定圓的數組,但要相互檢查圓的數組的每個元素,您可以使用嵌套循環。 下面的代碼可能對你有幫助。

for i in 0..<circles.count{
circles[i].center = getRandomPoint()
for j in 0..<circles.count{
    if(i != j){
        let comparingCentre = circles[j].center
        let dist = distance(comparingCentre, circles[i].center)
        if dist <= 50 {
            
            var newCenter = circles[i].center
            var centersVector = CGVector(dx: newCenter.x - comparingCentre.x, dy: newCenter.y - comparingCentre.y)
            
            centersVector.dx *= 51 / dist
            centersVector.dy *= 51 / dist
            newCenter.x = comparingCentre.x + centersVector.dx
            newCenter.y = comparingCentre.y + centersVector.dy
            circles[i].center = newCenter
        }
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM