### Circle Packing

I’ve been working yesterday in a Circle Packing, and I started with matsys pseudo-code. I founded a lot of gaps. Finally I decided to make a mixture between his algorithm and mine. Circle Packing can be a very useful algorithm and I think until now we have not seen their real power applied to architecture.

This is my little contribution (pseudo_Code)

1_ Input: maxradius, boundary, iterations (not necessary the number of circles)

2_Add in a random position within the boundary a circle with maximum radius

3_Add a Random Point

4_If this Point is inside of the Circle just created, add another one and delete the old one

5_Add Line to this point (out of the circle) to the center of the circle, (here I use the same idea of matsys) *“If the distance is greated than the maximum radius add a circle at that point with the maximum radius. If the distance is less than the maximum radius, add a circle at that point with the measured distance.”*

6_ add another point and test if this point is within of any circle and add a line to every center circle to find the closest circle (step _5)

7_ repeat the steps 5 to 6 the number of the iterations

soon more images.

share, modify and send me an Image

best

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | Option Explicit 'Script written by <Carlos de la Barrera> 'Script copyrighted by <Carlos de la Barrera> Call Main() Sub Main() Dim Pt, R Pt = Array(rnd * 100, rnd * 100, 0) R = FuncCir(Pt, 10) Call Pack(R) End Sub Function Pack(R) Dim Pt, i, count count = Rhino.GetInteger(" number of circles ", 50, 2, 1000) If IsNull (count) Then Exit Function Dim ArrData() For i = 0 To count ReDim Preserve ArrData(i) ArrData(i) = R Pt = Array(Rnd * 100, rnd * 100, 0) Dim j Dim t: t = 0 For j = 0 To UBound(ArrData) If Rhino.IsPointOnSurface(ArrData(j)(1)(0), Pt)Then Call Rhino.print ("point in surface") t = t + 1 End If Next If (t = 0) Then ReDim ArrLine(UBound(ArrData)) Dim k, line For K = 0 To UBound(ArrData) line = Rhino.AddLine(Pt, Rhino.CircleCenterPoint(ArrData(k)(0))) ArrLine(k) = Line Next Dim d, d2, l d = funcDist(Pt, ArrData(0)(0), ArrLine(0)) For l = 0 To UBound(ArrLine) d2 = funcDist(Pt, ArrData(l)(0), ArrLine(l)) If d < d2 Then 'Call Rhino.Print ("nothing") Else d = d2 End If Next R = FuncCir(Pt, d) Call Rhino.DeleteObjects (ArrLine) End If Next End Function Function FuncCir(p, D) If D >= 10 Then D = 10 End If Dim plane Dim R(1) plane = Rhino.PlaneFromFrame(p, Array(1.0,0.0,0.0), Array(0.0,1.0,0.0)) R(0) = Rhino.AddCircle(plane, D) R(1) = Rhino.AddPlanarSrf(Array(R(0))) FuncCir = R End Function Function funcDist(Pt, circleP, Line) Dim Ap, j, d Ap = Rhino.CurveCurveIntersection (circleP, Line) For j = 0 To UBound(Ap) d = Rhino.Distance(Pt, Ap(j, 1)) Next funcDist = d End Function |

the other day I listen: – talk it’s easy, ¡ show me the code ! –

## designEmergente - Rhinoscript, Basic circle packing May 4, 2015, 17:06

[…] of circles specified in the code is approximate. For further information please refer to this post and this […]

## Mark Jan 23, 2016, 0:04

Are you still trying to work on the random circle packing problem?

## carlos delab Jan 24, 2016, 11:22

Hi Mark,

no I haven’t work again in random circle parking.

why you ask?