2016-11-17 4 views
1

Я пытаюсь собрать кучу круглых UIViews в гексагональном шаблоне. Все они имеют разные размеры.Как создать алгоритм упаковки кругов для кругов с неравными размерами в iOS?

Сначала я случайно генерировать UIViews и поместить их на экране, как показано ниже: enter image description here
Тогда у меня есть алгоритм, который организует точку в круговой схеме вокруг центра. Это алгоритм:

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

Вот мой результат после того, как я запускаю эту функцию:
enter image description here
Сейчас этот алгоритм для кругов (просмотров) с тем же размером. Вы видите, что они не лежат рядом друг с другом, как если бы все они имели одинаковый размер. Как показано здесь: enter image description here

Есть ли кто-то там, что имеет какую-либо форму подсказки относительно того, что я мог бы изменить в алгоритме, так что я могу упаковать взгляды с различными размерами?

Вот некоторые ссылки, которые я столкнулся во время моего исследования, но они не получили меня очень далеко, потому что математика не моя сильная сторона:
http://www.optimization-online.org/DB_FILE/2008/06/1999.pdf
Packing different sized circles into rectangle - d3.js
http://jsfiddle.net/TDzVE/


Благодарим вас заблаговременно и счастливое программирование!

ответ

0

В соответствии с необходимым результатом, я бы предпочел сначала нарисовать все 7 кругов в одном центре.

Пусть red colored center circle is of size (x, y, W, H)

затем

1st (Top left)   - (x-W/2, y-(H+H/2), W, H) 
2nd (Top right)  - (x+W/2, y-(H+H/2), W, H) 
3rd (Right)   - (x+W, y, W, H) 
4th (Bottom right)  - (x+W/2, y+(H+H/2), W, H) 
5th (Bottom left)  - (x-W/2, y+(H+H/2), W, H) 
6th (Left)    - (x-W, y, W, H) 

Это будет применяться во всех случаях гексагональной части, только Ш/В будет меняться для каждого круга, как

1st (Top left)   - (x-W/2, y-(H+H/2), W1, H1) 
2nd (Top right)  - (x+W/2, y-(H+H/2), W2, H2) 
3rd (Right)   - (x+W, y, W3, H3) 
4th (Bottom right)  - (x+W/2, y+(H+H/2), W4, H4) 
5th (Bottom left)  - (x-W/2, y+(H+H/2), W5, H5) 
6th (Left)    - (x-W, y, W6, H6) 
Смежные вопросы