【问题标题】:Checking all elements in an array in Swift against each other在 Swift 中检查数组中的所有元素
【发布时间】:2021-01-13 13:55:28
【问题描述】:

对于我的应用,我试图确定圆形视图数组中的元素是否相互重叠。我有一个 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 元素,以确保它们没有重叠的位置。

【问题讨论】:

    标签: ios arrays swift for-loop


    【解决方案1】:

    不确定圆的数组,但要检查圆数组的每个元素,您可以使用嵌套循环。下面的代码可能会对您有所帮助。

    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
            }
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多