Я пытаюсь собрать кучу круглых UIViews в гексагональном шаблоне. Все они имеют разные размеры.Как создать алгоритм упаковки кругов для кругов с неравными размерами в iOS?
Сначала я случайно генерировать UIViews и поместить их на экране, как показано ниже:
Тогда у меня есть алгоритм, который организует точку в круговой схеме вокруг центра. Это алгоритм:
func arrangeViews()
{
let viewCenter = self.view.center
let radius: Double = 50?? <- What do I put here? All the views has different radius?
var currentDistFromCenter: Double = (radius * 2)
var numMoved = 0
let amountOfViews = views.count
numMoved += 1
while numMoved < amountOfViews {
var numberToFit = Double(M_PI/asin(radius/currentDistFromCenter))
if numberToFit > Double(amountOfViews - numMoved) {
numberToFit = Double(amountOfViews - numMoved)
}
for i in 0 ..< Int(numberToFit) {
let currentView = views[numMoved]
let angle = Double(M_PI * 2.0 * Double(i)/numberToFit)
let x = Double(viewCenter.x) + cos(angle) * currentDistFromCenter
let y = Double(viewCenter.y) + sin(angle) * currentDistFromCenter
var newPoint = CGPoint(x: CGFloat(x), y: CGFloat(y))
views.first?.center = self.view.center
if newPoint.x != currentView.frame.origin.x || newPoint.y != currentView.frame.origin.y {
UIView.animate(withDuration: 0.3, animations: {
currentView.center = newPoint
})
numMoved += 1
}
}
currentDistFromCenter += radius * 2
}
}
Вот мой результат после того, как я запускаю эту функцию:
Сейчас этот алгоритм для кругов (просмотров) с тем же размером. Вы видите, что они не лежат рядом друг с другом, как если бы все они имели одинаковый размер. Как показано здесь:
Есть ли кто-то там, что имеет какую-либо форму подсказки относительно того, что я мог бы изменить в алгоритме, так что я могу упаковать взгляды с различными размерами?
Вот некоторые ссылки, которые я столкнулся во время моего исследования, но они не получили меня очень далеко, потому что математика не моя сильная сторона:
http://www.optimization-online.org/DB_FILE/2008/06/1999.pdf
Packing different sized circles into rectangle - d3.js
http://jsfiddle.net/TDzVE/
Благодарим вас заблаговременно и счастливое программирование!