# A Ring

This is an assignment of computational design course. A sketchy design of a ring.

Basically I played with surface domain: sub-divide the surface and create circles on each surface domain. Size and thickness of the circle changes according to the divided surface.

code in rhinoscript:

`import rhinoscriptsyntax as rs rs.EnableRedraw(False)#Creat Rail 1Crv1Pts=[(-40,0,6),(0,40,3),(40,0,20),(0,-40,3),(-40,0,6)]Crv1 = rs.AddCurve(Crv1Pts,3)#Creat Rail 2Crv2Pts=[(-40,0,-6),(0,40,-3),(40,0,-20),(0,-40,-3),(-40,0,-6)]Crv2 = rs.AddCurve(Crv2Pts,3)#Creat Ringsrs.AddPipe(Crv1,[0,1,2,3],[1,3,6,3])#Creat profileStartPt1 = rs.CurveStartPoint(Crv1)StartPt2 = rs.CurveStartPoint(Crv2)strProfile = rs.AddInterpCurve([StartPt1,(0,29,0),StartPt2])#Creat SurfacestrSrf = rs.AddSweep2([Crv1,Crv2],[strProfile])rs.RebuildSurface(strSrf,(3,3),(30,8))#Get Surface DomainDomainU = rs.SurfaceDomain(strSrf,0)DomainV = rs.SurfaceDomain(strSrf,1)#get circles on each unit of surfacearrCir = []arrPt = []for i in range(1,int(DomainU)+1):    for j in range(1,int(DomainV)+1):        pt1 = rs.EvaluateSurface(strSrf,i-1,j-1)        pt2 = rs.EvaluateSurface(strSrf,i-1,j)        pt3 = rs.EvaluateSurface(strSrf,i,j)        pt4 = rs.EvaluateSurface(strSrf,i,j-1)        crv = rs.AddCurve([pt1,pt2,pt3,pt4,pt1],3)        ptcenter = (pt1+pt2+pt3+pt4)/4        crv = rs.ScaleObject(crv,ptcenter,[0.7,0.7,0.7])        pullcrv = rs.PullCurve(strSrf,crv,True)        if len(pullcrv)>1:            joinedcrv = rs.JoinCurves(pullcrv,True)        else:            joinedcrv = pullcrv        arrCir.append(joinedcrv)        arrPt.append(ptcenter) #get length range of circlesarrLength = [rs.CurveLength(i) for i in arrCir]SortLength = arrLength[:]SortLength.sort()Lenmin = SortLengthLenmax = SortLength[-1] #define a mapping tooldef translate(OldValue, OldMin, OldMax, NewMin, NewMax):    OldRange = (OldMax - OldMin)    if (OldRange == 0):        NewValue = NewMin    else:        NewRange = (NewMax - NewMin)          NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin    return NewValue for i in range(len(arrCir)):    #move circle through normal    PtUV = rs.SurfaceClosestPoint(strSrf,arrPt[i])    Pt = rs.EvaluateSurface(strSrf,PtUV,PtUV)    Normal = rs.SurfaceNormal(strSrf,PtUV)    UnitNormal = rs.VectorUnitize(Normal)    Distance = translate(arrLength[i],Lenmin,Lenmax,0.5,3)    Vector = rs.VectorScale(UnitNormal,Distance)    #scale circle accordingly    scale = translate(arrLength[i],Lenmin,Lenmax,1.3,1.6)    cir = rs.ScaleObject(arrCir[i],Pt,[scale,scale,scale],True)    ForwardCircle = rs.CopyObject(cir,Vector)    # vec to back side    Vec = rs.VectorScale(UnitNormal,0.3)    ReversedVec = rs.VectorReverse(Vec)    BackCircle = rs.MoveObject(cir,ReversedVec)    # add loft surface    UnitSrf = rs.AddLoftSrf([      ForwardCircle,      arrCir[i],      BackCircle],      None,      None,0,0,0,True)    rs.DeleteObject(ForwardCircle)    rs.DeleteObject(BackCircle)`