RhinoScript recursive aggregation
From KokkugiaWiki
recursive branching
this simple recursive algorithm builds branching structures
Option Explicit
'Script written by roland snooks | kokkugia.com | 2008
Call recursiveBranch()
Sub recursiveBranch()
Dim line, ang, scale
line = Rhino.GetObject("select a starting line", 4)
ang = Rhino.GetReal("angle of branches", 15)
scale = Rhino.GetReal("scale amount", 0.9)
Rhino.EnableRedraw False
branch line, ang, scale
Rhino.EnableRedraw True
End Sub
Function branch(line, ang, scale)
Dim endPt, startPt, vec, line1, line2, branchLength
branchLength = Rhino.CurveLength(line)
If branchLength > 1 Then
' get vector
endPt = Rhino.CurveEndPoint(line)
startPt = Rhino.CurveStartPoint(line)
vec = Rhino.VectorCreate(endPt, startPt)
' draw new lines
line1 = Rhino.AddLine(endPt, Rhino.VectorAdd(endPt, Rhino.VectorScale(Rhino.VectorRotate(vec, ang, Array(0,0,1)), scale)))
line2 = Rhino.AddLine(endPt, Rhino.VectorAdd(endPt, Rhino.VectorScale(Rhino.VectorRotate(vec, -ang, Array(0,0,1)), scale)))
' call recursive function
branch line1, ang, scale
branch line2, ang, scale
End If
End Function
recursive aggregation
this recursive algorithm aggregates an object using the orient method.
Option Explicit
'Script written by roland snooks | kokkugia.com | 2008
Call recursiveAggregation()
Sub recursiveAggregation()
Dim objArr(9), gens
gens = Rhino.GetReal("how many generations", 5)
objArr(0) = Rhino.GetObject("select a starting object")
objArr(1) = Rhino.GetObject("select base reference point 1", 1)
objArr(2) = Rhino.GetObject("select base reference point 2", 1)
objArr(3) = Rhino.GetObject("select base reference point 3", 1)
objArr(4) = Rhino.GetObject("select target 1 reference point 1", 1)
objArr(5) = Rhino.GetObject("select target 1 reference point 2", 1)
objArr(6) = Rhino.GetObject("select target 1 reference point 3", 1)
objArr(7) = Rhino.GetObject("select target 2 reference point 1", 1)
objArr(8) = Rhino.GetObject("select target 2 reference point 2", 1)
objArr(9) = Rhino.GetObject("select target 2 reference point 3", 1)
'Rhino.EnableRedraw False
aggregate objArr, gens
'Rhino.EnableRedraw True
End Sub
Function aggregate(objArr, gens)
Dim count, i, baseArrPts(), tarArrPts1(), tarArrPts2(), objArr1, objArr2
If gens > 0 Then
' get locations of base points
count = 0
For i = 1 To 3
ReDim Preserve baseArrPts(count)
baseArrPts(count) = Rhino.PointCoordinates(objArr(i))
count = count +1
Next
' get locations of target1 points
count = 0
For i = 4 To 6
ReDim Preserve tarArrPts1(count)
tarArrPts1(count) = Rhino.PointCoordinates(objArr(i))
count = count +1
Next
' get locations of target2 points
count = 0
For i = 7 To 9
ReDim Preserve tarArrPts2(count)
tarArrPts2(count) = Rhino.PointCoordinates(objArr(i))
count = count +1
Next
' orient objects
objArr1 = Rhino.OrientObjects(objArr, baseArrPts, tarArrPts1, 1)
objArr2 = Rhino.OrientObjects(objArr, baseArrPts, tarArrPts2, 1)
' call recursive function
aggregate objArr1, gens - 1
aggregate objArr2, gens - 1
End If
End Function

