Circle Packing

Bookmark and Share

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 ! –

3 Comments

  • 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?

Leave a Reply