ios - 在 Swift 中检查数组中的所有元素
问题描述
对于我的应用程序,我试图确定圆形视图数组中的元素是否相互重叠。我有一个 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
}
}
}
}
推荐阅读
- python - 尝试使用 Google 广告 API 时出现客户 ID 错误。输入客户 ID 需要什么?为什么我会收到此错误消息?
- java - 结果中的记录数导致 -> 对象引用未设置为对象的实例 - Azure Cosmos Db
- php - 设置当前页面处于活动状态并从 ID 数据库中获取页面数据
- hana - 尝试在 SAP HANA 上使用 UNION ALL 语法时出错
- typescript - BackboneJS 路由器不渲染视图
- bash - 在 SSH 终端中运行 VS Code 调试器
- linux - 保存 nvm、npm Linux 安装的问题
- python - 标记化:如何在用于 NLP 的 python 中不标记标点符号,如 `^*
- websphere - 升级了我的 web 应用程序以使用 OJDBC8.jar。但Websphere8.5引用旧版本ojdbc6并返回nosuchmethoderror
- sql - 在 oracle plsql 游标中使用 % 的like 运算符