""" Kachelung 36 10.09.2015 """ import c4d import math # Variablen und Konstanten N = 5 # Anzahl Punkte pro Kante r = 1.0 # Kantenlaenge ris = 0.5*r/math.tan(math.pi/7.0) # Inkreisradius Siebeneck rus = 0.5*r/math.sin(math.pi/7.0) # Umkreisradius Siebeneck a = 2*ris*math.cos(3*math.pi/7.0) b = 2*ris + 2*a - 2*rus ht = 2*ris*math.sin(3*math.pi/7.0) c = r*math.cos(math.pi - 6*math.pi/7.0) d = r*math.sin(math.pi - 6*math.pi/7.0) e = r*math.sin(0.5*math.pi - 2*math.pi/7.0) Abstand_x = ris + rus + b + rus + ris Abstand_y = ht Versatz_x = ris + rus + 0.5*b NS = 5 # Anzahl Wiederholungen in eine Richtung if NS%2 ==0: # nur ungerade NS zulassen NS = NS +1 Faktor = 1000 # Skalierungsfaktor Siebeneck = [] Fuenfeck = [] #Inversion = True Inversion = False def Invers(z): return 1/z def CreateNullobjekt(): obj = c4d.BaseObject(c4d.Onull) # Nullobjekt erzeugen obj.SetName("Kachelung 36") obj.Message(c4d.MSG_UPDATE) return obj def Drehung(z, Grad): Winkel = Grad * math.pi/180 x = z.real y = z.imag x1 = math.cos(Winkel) * x + math.sin(Winkel) * y y1 = -math.sin(Winkel) * x + math.cos(Winkel) * y return complex(x1, y1) # Siebenecke **************************************************************************** def CreateSplineObjectS(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) obj.ResizeObject(N*7*(2*NS+1)*(2*NS+1)*2) dt= r/N # Unterteilung Kante zz = 0 # Zaehler Punkte # Siebeneckdaten erzeugen for i in range(0,N): z = complex(-ris, -0.5 * r + i * dt) Siebeneck.append(z) for k in range(1,7): for j in range(0,N): z = Drehung(Siebeneck[j], 360*k/7.0) Siebeneck.append(z) # Siebeneck verschieben for i in range(0,7*N): Siebeneck[i] = Siebeneck[i] + complex(ris, 0) # Siebeneck spiegeln for i in range(0,7*N): z = complex(-Siebeneck[i].real, Siebeneck[i].imag) Siebeneck.append(z) for k in range(0,2*NS+1): y0 = -Abstand_y*NS + k*Abstand_y for j in range(0,2*NS+1): if k%2 == 0.0: x0 = -Abstand_x*NS + j*Abstand_x + Versatz_x else: x0 = -Abstand_x*NS + j*Abstand_x for i in range(0,7*N*2): z = Siebeneck[i] + complex(x0, y0) if Inversion: z = Invers(z) obj.SetPoint(zz, c4d.Vector(z.real*Faktor, z.imag*Faktor, 0.0)) zz = zz + 1 obj.MakeVariableTag(c4d.Tsegment, (2*NS+1)*(2*NS+1)*2) for i in range(0, (2*NS+1)*(2*NS+1)*2): obj.SetSegment(i, 7*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Siebenecke") obj.Message(c4d.MSG_UPDATE) return obj # Fuenfecke *************************************************************************** def CreateSplineObjectF(): obj = c4d.BaseObject(c4d.Ospline) # Splineobjekt erzeugen obj.ResizeObject(N*5*(2*NS+1)*(2*NS+1)*2) dt= r/N dtb= b/N zz = 0 # Zaehler Punkte # Fuenfecksdaten erzeugen for i in range(0,N): z = complex(ris + rus + i * dtb, 0) Fuenfeck.append(z) for i in range(0,N): z = complex(i * dt, 0) z = Drehung(z, 90 - 3*360/7.0) + complex(ris + rus + b, 0) Fuenfeck.append(z) for i in range(0,N): z = complex(i * dt, 0) z = Drehung(z, -90 - 360/7.0) + complex(ris + rus + b + d, c) Fuenfeck.append(z) for i in range(0,N): z = complex(i * dt, 0) z = Drehung(z, 90 + 360/7.0) + complex(ris + rus + 0.5*b, c + e) Fuenfeck.append(z) for i in range(0,N): z = complex(i * dt, 0) z = Drehung(z, 3*360/7.0 - 90) + complex(ris + rus - d, c) Fuenfeck.append(z) # Fuenfeck spiegeln for i in range(0,5*N): z = complex(Fuenfeck[i].real, -Fuenfeck[i].imag) Fuenfeck.append(z) for k in range(0,2*NS+1): y0 = -Abstand_y*NS + k*Abstand_y for j in range(0,2*NS+1): if k%2 == 0.0: x0 = -Abstand_x*NS + j*Abstand_x + Versatz_x else: x0 = -Abstand_x*NS + j*Abstand_x for i in range(0,5*N*2): z = Fuenfeck[i] + complex(x0, y0) if Inversion: z = Invers(z) obj.SetPoint(zz, c4d.Vector(z.real*Faktor, z.imag*Faktor, 0.0)) zz = zz + 1 obj.MakeVariableTag(c4d.Tsegment, (2*NS+1)*(2*NS+1)*2) for i in range(0, (2*NS+1)*(2*NS+1)*2): obj.SetSegment(i, 5*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Fuenfecke") obj.Message(c4d.MSG_UPDATE) return obj def main(): nullobj = CreateNullobjekt() slinobj1 = CreateSplineObjectS() slinobj2 = CreateSplineObjectF() doc.InsertObject(nullobj, None, None, True) doc.InsertObject(slinobj2, nullobj, None, True) doc.InsertObject(slinobj1, nullobj, None, True) c4d.EventAdd() if __name__=='__main__': main()