(n)certainties – Columbia – Fall 2008

cv_sphere packing tower

Option Explicit
‘Script written by <valla>
‘Script copyrighted by <insert company name>
‘Script version Tuesday, October 07, 2008 9:20:25 PM

Call Colonize()
Sub Colonize()
 
 Dim FrstPt : FrstPt = Rhino.GetPointCoordinates (“first center pt”)
 If IsNull (FrstPt) Then Exit Sub 
 
 Dim count : count = Rhino.GetInteger(“number of units”, 15, 2, 1000)
 If IsNull (count) Then Exit Sub
 
 Dim o : o = Rhino.GetInteger(“points to generate”, 500, 0, 1000)
 If IsNull (o) Then Exit Sub
 
 Call Rhino.AddLayer (“trajectory”, RGB(255,0,0))
 Call Rhino.AddLayer (“textDot”, RGB(255,0,255))
 Call Rhino.AddLayer (“tree”, RGB(0,0,255))
 Call Rhino.AddLayer (“spheres”)
 
 ReDim CPts(count) : CPts(0) = FrstPt(0)  ’array of array of coordinates (center points)
 Dim RPts()      ’array of numbers (radius)
 Dim SPts()      ’array of objects (spheres)
 Dim trajec()      ’array of objects (curves)
 
 Dim i
 
 
 For i=0 To 0  
  
  ReDim Preserve RPts(i)
  ReDim Preserve SPts(i)
  
  ’DRAW FIRST SPHERE
  RPts(i) = random(15,35)
  
  Call Rhino.CurrentLayer (“spheres”)
  SPts(i) = Rhino.AddSphere (CPts(i), RPts(i))
  Call Rhino.CurrentLayer (“Default”)
  
  Call funcEllipsoid(CPts,RPts,i,o)
  
 Next
 

 For i=1 To count
  
  ReDim Preserve RPts(i)
  ReDim Preserve SPts(i)
  ReDim Preserve trajec(i-1)
  
  
  ’ADD NEW POINT
  Dim v
  v = i-1
  CPts(i) = Rhino.PointAdd(CPts(v), funcVector(CPts,v))
  trajec(v) = Rhino.AddLine (CPts(v), CPts(i))  
  
  
  ’FIND NEAREST SURFACE WITH CONNECTING VECTOR
  Dim D, D2, dis, dis2, k
  ReDim Vec(0), Vec2(0)
  ’D is the distance from new point to the surface of all existing spheres 
  dis = Rhino.Distance(CPts(i), CPts(v))
  D = dis – RPts(v)
  Vec(0) = Rhino.VectorCreate(CPts(k), CPts(i))
  ’find smallest distance D (compare all distances and keep smallest one)
  For k = 0 To i-1
   ReDim Preserve Vec(0), Vec2(0)
   dis2 = Rhino.Distance(CPts(i), CPts(k))
   D2 = dis2 – RPts(k)
   Vec2(0) = Rhino.VectorCreate(CPts(k), CPts(i))
   If D2<>D And D2<D Then
    D = D2
    Vec(0) = Vec2(0)
   End If 
  Next
  
  
  ’DRAW SPHERE
  Dim t : t=0
  ’if new point is in an existing sphere then skip’
  If D<0 Then
   t=t+1
  End If
  ’if new point is not in an existing sphere then add new shere’
  If t=0 Then
   Call Rhino.CurrentLayer (“spheres”)
   RPts(i) = D
   SPts(i) = Rhino.AddSphere (CPts(i), RPts(i))
   Call Rhino.CurrentLayer (“Default”)
   
   Call funcEllipsoid(CPts,RPts,i,o)
   
   Call Rhino.CurrentLayer (“tree”)
   Dim tempPt, tree
   tempPt = Rhino.PointAdd(CPts(i), Vec(0))
   tree = Rhino.AddLine (CPts(i), tempPt)
   Call Rhino.CurrentLayer (“Default”)
   
   Call Rhino.CurrentLayer (“textDot”)
   Call Rhino.AddTextDot (i, CPts(i))
   Call Rhino.CurrentLayer (“Default”)   
  End If
  
 Next
 
 Call Rhino.CurrentLayer (“trajectory”)
 Dim trajectory : trajectory = Rhino.JoinCurves (trajec,True)
 Call Rhino.CurrentLayer (“Default”)
 
End Sub
Function funcEllipsoid(CPts,RPts,i,o)
 ’FUNCTION WILL CREAT AN ARRAY OF POINTS IN SHAPE OF ELLIPSOID 
  
 Call Rhino.AddLayer (“PointCloud”)
 Call Rhino.CurrentLayer (“PointCloud”)
  
 Dim minRx, maxRx, minRy, maxRy, minRz, maxRz
 Dim beta, landa
 Dim x, y, z
 
 ReDim arrPoints(o-1)
 Dim p
 
 Randomize
 minRx = RPts(i)
 maxRx = minRx + 6
 minRy = RPts(i)
 maxRy = minRy + 6
 minRz = RPts(i)
 maxRz = minRz + 6
 
 Call rhino.enableRedraw(False)
 
 For p = 0 To o-1
  beta = random(-90,90)   ’latitude
  landa = random(-180,180)  ’longitude
  x = CPts(i)(0) + random (minRx,maxRx)*Cos(beta)*Cos(landa)
  y = CPts(i)(1) + random (minRy,maxRy)*Cos(beta)*Sin(landa)
  z = CPts(i)(2) + random (minRz,maxRz)*Sin(beta)
  arrPoints(p) = Rhino.AddPoint(Array(x,y,z))
 Next
 
 Call rhino.enableRedraw(True)
 
 Call Rhino.objectcolor (arrPoints, RGB(150*Rnd, 0, 150*Rnd))
 Call Rhino.CurrentLayer (“Default”)
 
End Function

 

Function funcVector(CPts,v)
 
 Dim x, y, z
 
 If CPts(v)(0) > 0 Then
  x = random(-80,-30)
 Else
  x = random(80,30)
 End If
  
 If CPts(v)(1) > 0 Then
  y = random(-30,-80)
 Else
  y = random(80,30)
 End If 
 
 z = random(-10,30)
 
 funcVector = Array(x, y, z)

End Function

 

Function random(min,max)
 Randomize
 random = ((max-min) * Rnd + min)
End Function

Leave a Comment

0 responses so far ↓

  • There are no comments yet...Kick things off by filling out the form below.

Leave a Comment