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.

Image:Aggregation.jpg

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

Views