Archive for August, 2008

Sphere Packing

Thursday, August 28th, 2008

A couple of minutes took me switch the circles with spheres. This time when I saw the script few day after, I found a lot of bugs to slow down the whole process, so I decide to make the changes to get more speed.

here the images:

Circle Packing Images

Thursday, August 21st, 2008

The first image has almost 10,000 iterations and the max radius was 500, the other ones are about 4,000 iterations and their radius about 50-100.

Circle Packing

Wednesday, August 20th, 2008

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

This is my little contribuition (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

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

Sensitive Analisys, Prato Italy

Wednesday, August 6th, 2008

I was invited to paticipate in a contest to the Comune di Prato in Italy. I have to say thank you to this cool group of architects from Lisboa: Duarte Cardoso Ferreira, Nuno Lobo Guerra, Ricardo Boaventura, Rita Frias Silva from ADOC architects and all the team of 4ARQ encharged of the 3D images.

I was encharge to develope by programming the plans and the general features of the school. We start working identify every tree in the ground and the area of the differents rooms for the school. Every tree was identify by a point and a minum area of influence (in the fisrt step of the algorithm) and each area of the room of the school was enter in to the algorithm to know the best performance of the build with out touch any tree.

Then the algorithm calculate a voronoi diagram (only with the trees) and inform the resultant areas and we could see where can “grow” our building. the next step was develope a second algorithm to generate pseudo-random points, between the trees and responding obviously to the influence area of them.

Then the process consist basicaly in create generations and test the results, if the dispositions of points allow build the school (first and more important test), if the result produce nice spaces, if we like it, if the algorithm respect entrance determined by us, etc. etc. after every generation, we pass again this second algorithm to produce in some points a random movement to explore new configurations and results.

I take this idea from Mutsuro Sasaki, he use an strategy based in the approach in successive steps to get the best result moving the points in pseudo random way.