recursive aggregation using triangular prism base geometry with rotation every second aggregation

 

iterations: 1

objects: 5

 

iterations: 2

objects: 9

iterations: 3

objects: 13

iterations: 4

objects: 21

iterations: 5

objects: 29

iterations: 6

objects: 45

iterations: 7

objects: 61

iterations: 8

objects: 93

iterations: 9

objects: 125

iterations: 10

objects: 198

iterations: 11

objects: 253

iterations: 12

objects: 381

iterations: 13

objects: 509

iterations: 14

objects: 765

code still in work:

import rhinoscriptsyntax as rs
def allpts(srf) :
    border = rs.DuplicateSurfaceBorder (srf)
    lines = rs.ExplodeCurves (border)
    center = rs.SurfaceAreaCentroid (srf)
    allpts = []
    allpts.append (center[0])
    for line in lines:
        pt = rs.CurveEndPoint (line)
        allpts.append (pt)
    return allpts
def aggregate(obj, pointList, count):
    source = [pointList[0], pointList[1], pointList[2]]
    target1 = [pointList[0], pointList[2], pointList[1]]
    target2 = [pointList[0], pointList[3], pointList[2]]
    if (count % 3 == 0):
        newObject = rs.OrientObject (obj, source, target1, 1)
    else:
        newObject = rs.OrientObject(obj, source, target2, 1)
    return newObject
def checkifduplicate(srf, newsrf):
    points = allpts(srf)
    newpoints = allpts(newsrf)
    print points
    print newpoints
    print “———“
    donno = 0
    for newpoint in newpoints:
        for point in points:
            #if points[0][0]>=newpoints[0][0]-0.05 and points[0][0]<=newpoints[0][0]+0.05 and points[0][1]>=newpoints[0][1]-0.05 and points[0][1]<=newpoints[0][1]+0.05 and points[0][2]>=newpoints[0][2]-0.05 and points[0][2]<=newpoints[0][2]+0.05:
            if point[0]>=newpoint[0]-0.05 and point[0]<=newpoint[0]+0.05 and point[1]>=newpoint[1]-0.05 and point[1]<=newpoint[1]+0.05 and point[2]>=newpoint[2]-0.05 and point[2]<=newpoint[2]+0.05:
                print point
                print newpoint
                donno = donno+1
    if donno == 5 or donno == 2 or donno == 1:
        print “alpapalfla”
        return True
    return False
def checkifimhere(newObj, newObjlist):
        for obj in newObjlist:
            allsrf = rs.ExplodePolysurfaces(obj)
            allsrfnew = rs.ExplodePolysurfaces(newObj)
            for i in range(3):
                for j in range(3):
                    for curve in rs.ExplodeCurves(rs.DuplicateSurfaceBorder(allsrfnew[i])):
                        if rs.CurveSurfaceIntersection(curve,allsrf[j]):
                            if not checkifduplicate(allsrf[j],allsrfnew[i]):
                                return True
        return False
def recursiveAggregation(obj, gens, objList, count):
    if not objList:
        objList.append (obj)
    allsrf = rs.ExplodePolysurfaces(obj)
    pointSet1 = allpts(allsrf[0])
    pointSet2 = allpts(allsrf[1])
    pointSet3 = allpts(allsrf[2])
    if (count % 2 == 0 and gens != 0):
        newObject = aggregate(obj, pointSet1, count)
        newObject2 = aggregate(obj, pointSet3, count)
        objectFail = True
        object2Fail = True
        if (not checkifimhere(newObject,objList)):
            objList.append(newObject)
            objectFail = False
        if (not checkifimhere(newObject2,objList)):
            objList.append(newObject2)
            object2Fail = False
        if (gens > 0):
            if not objectFail:
                recursiveAggregation(newObject, gens-1, objList, count+1)
            if not object2Fail:
                recursiveAggregation(newObject2, gens-1, objList, count+1)
    elif (gens != 0) :
        newObject = aggregate(obj, pointSet2, count)
        copy = rs. CopyObject(newObject)
        objectFail = True
        if (not checkifimhere(copy,objList)):
            objList.append(copy)
            objectFail = False
        if (gens > 0):
            if not objectFail:
                recursiveAggregation(newObject, gens-1, objList, count+1)
    return objList
allNewObjs = []
count = 0
a = recursiveAggregation(brep, iterations, allNewObjs, count)

 

 

My exploration in recursive aggregation with python gh began from Jose Sanchez of plethora project’s logic and further explored collision detection and variants in terms of geometrical input.

 

Student: Jean-Nicolas Alois Dackiw
Guest Lecturer: Long Nguyen
MRAC Faculty: Eugenio Bettucchi