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