Call recursive_growth() Sub recursive_growth Dim arrCrvs arrCrvs = Rhino.GetObjects("pick crvs", 4) Dim MaxGenerations MaxGenerations = 2 'defines a number of max generations Dim gen gen = 0 Call Rhino.enableredraw(False) Call recursion_random (arrCrvs, MaxGenerations, gen) 'calls the 1st function Call Rhino.enableredraw(True) End Sub Function recursion_random (arrObjects, MaxGenerations, gen) If gen > MaxGenerations Then Exit Function maxAngle = 45 For Each strObject In arrObjects ArrPtStart = Rhino.curveStartPoint(strObject) ArrPtEnd = Rhino.curveEndPoint(strObject) 'defines an imaginary cone ArrVector = Rhino.vectorCreate (arrPtEnd,arrPtStart) MinDistance = Rhino.vectorlength(ArrVector) * 2/3 ' defines the cone´s length MaxDistance = Rhino.vectorlength(ArrVector) * 2 'creates a new vector and resizes it to be somewhere between min and max distance ArrVectorNew1 = Rhino.VectorUnitize(ArrVector) ArrVectorNew1 = Rhino.VectorScale(ArrVectorNew1, MinDistance + Rnd * (MaxDistance-MinDistance)) ArrVectorNew2 = Rhino.VectorUnitize(ArrVector) ArrVectorNew2 = Rhino.VectorScale(ArrVectorNew2, MinDistance + Rnd * (MaxDistance-MinDistance)) ArrVectorNew3 = Rhino.VectorUnitize(ArrVector) ArrVectorNew3 = Rhino.VectorScale(ArrVectorNew3, MinDistance + Rnd * (MaxDistance-MinDistance)) strMutationPlane = Rhino.PlaneFromNormal(Array(0,0,0),ArrVectorNew1) 'creates a rotation plane for vector ArrVectorNew1 = Rhino.VectorRotate(ArrVectorNew1, Rnd * maxAngle, strMutationPlane(1)) ArrVectorNew1 = Rhino.vectorRotate(arrVectorNew1, Rnd * 360, ArrVector) ArrVectorNew2 = Rhino.VectorRotate(ArrVectorNew2, Rnd * maxAngle, strMutationPlane(1)) ArrVectorNew2 = Rhino.vectorRotate(arrVectorNew2, Rnd * 360, ArrVector) ArrVectorNew3 = Rhino.VectorRotate(ArrVectorNew3, Rnd * maxAngle, strMutationPlane(1)) ArrVectorNew3 = Rhino.vectorRotate(arrVectorNew3, Rnd * 360, ArrVector) 'adds a new vector within the imaginary cone arrPtNew1 = Rhino.vectoradd(ArrPtEnd, ArrVectorNew1) arrPtNew2 = Rhino.vectoradd(ArrPtEnd, ArrVectorNew2) arrPtNew3 = Rhino.vectoradd(ArrPtEnd, ArrVectorNew3) 'adds a line starting from ptEnd to the new vector within the cone strObject1 = Rhino.AddLine(ArrPtEnd, arrPtNew1) strObject2 = Rhino.AddLine(ArrPtEnd, arrPtNew2) strObject3 = Rhino.AddLine(ArrPtEnd, arrPtNew3) Dim aCrvsResult1, aCrvsResult2, aCrvsResult3 aCrvsResult1 = subDiv(strObject1, 3) 'calls the 2nd function Call recursion_random (aCrvsResult1, MaxGenerations, gen + 1) aCrvsResult2 = subDiv(strObject2, 3) Call recursion_random (aCrvsResult2, MaxGenerations, gen + 1) aCrvsResult3 = subDiv(strObject3, 3) Call recursion_random (aCrvsResult3, MaxGenerations, gen + 1) Next End Function Function subDiv(sCrv, iNumber) 'function that defines which objects to subdivide and in how many divisions ReDim aCrvs(iNumber-1) Dim aPts apts = Rhino.dividecurve(sCrv, iNumber) Dim j For j = 1 To UBound(aPts) aCrvs(j-1) = Rhino.addline(aPts(j-1), aPts(j)) Next Call Rhino.deleteobject(sCrv) subDiv = aCrvs End Function