""" Kachelung 11 10.09.2015 """ import c4d import math # Variablen und Konstanten N = 32 # Anzahl Punkte pro Kante r = 1.0 # Umkreisradius Sechseck a = 1.0 # Kantenlänge Fünfeck (Basislinie) b = 2*a*math.sqrt(1 - 0.5*math.sqrt(3.0)) # Basislinie Fünfeck h = a*math.sqrt(1 + 0.5*math.sqrt(3.0)) # Höhe Fünfeck h1 = math.sqrt(3.0) * a * 0.5 ris = 0.5 * math.sqrt(3.0) * b # Inkreisradius Sechseck Abstand_x = 2*h + b + 2*ris Abstand_y = b + 2*a + h Versatz_x = 0.5*b + h + ris NS = 7 # Anzahl Sechsecke von der Mitte in einer Richtung if NS%2 ==0: # nur ungerade NS zulassen NS = NS +1 Faktor = 1000 # Skalierungsfaktor Sexeck = [] Fuenfeck1 = [] Fuenfeck2 = [] Fuenfeck3 = [] Fuenfeck4 = [] Inversion = True #Inversion = False def Invers(z): return 1/z def CreateNullobjekt(): obj = c4d.BaseObject(c4d.Onull) # Nullobjekt erzeugen obj.SetName("Kachelung 11") 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) # Sechsecke ********************************************************************************* def CreateSplineObjectS(): # Splineobjekte erzeugen obj2 = c4d.BaseObject(c4d.Ospline) obj2.ResizeObject(N*6*(2*NS+1)*(2*NS+1)) dt= b/N # Unterteilung Kante zz = 0 # Zähler Punkte # Sechseckdaten erzeugen for i in range(0,N): z = complex(-0.5 * b + i * dt, -ris) Sexeck.append(z) for k in range(1,6): for j in range(0,N): z = Drehung(Sexeck[j], -60*k) Sexeck.append(z) for k in range(0,6*N): Sexeck[k] = Drehung(Sexeck[k], 30) #for k in range(0,1): 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,6*N): z = Sexeck[i] + complex(x0, y0) if Inversion: z = Invers(z) obj2.SetPoint(zz, c4d.Vector(z.real*Faktor, z.imag*Faktor, 0.0)) zz = zz + 1 obj2.MakeVariableTag(c4d.Tsegment, (2*NS+1)*(2*NS+1)) for i in range(0, (2*NS+1)*(2*NS+1)): obj2.SetSegment(i, 6*N, True) obj2[c4d.SPLINEOBJECT_CLOSED] = True obj2.SetName("Sechsecke") obj2.Message(c4d.MSG_UPDATE) return obj2 # Fünfecke 1 ************************************************************** def CreateSplineObjectF1(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) obj.ResizeObject(N*5*(2*NS+1)*(2*NS+1)*3) dta= a/N # Unterteilung Kante a dtb= b/N # Unterteilung Kante b zz = 0 # Zähler Punkte # Fünfeckdaten erzeugen for i in range(0,N): z = complex(-0.5 * b + i * dtb, 0) Fuenfeck1.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -60) + complex(0.5*b, 0) Fuenfeck1.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -150) + complex(0.5*b + 0.5*a, h1) Fuenfeck1.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 150) + complex(0, h) Fuenfeck1.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 60) + complex(-0.5*b - 0.5*a, h1) Fuenfeck1.append(z) # Fünfeck verschieben for i in range(0,5*N): Fuenfeck1[i] = Fuenfeck1[i] + complex(ris + h + 0.5*b, 0) # Fünfeck duplizieren und drehen for i in range(0,5*N): z = Drehung(Fuenfeck1[i], -60) Fuenfeck1.append(z) for i in range(0,5*N): z = Drehung(Fuenfeck1[i], -120) Fuenfeck1.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*3): z = Fuenfeck1[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)*3) for i in range(0, (2*NS+1)*(2*NS+1)*3): obj.SetSegment(i, 5*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Fünfecke 1") obj.Message(c4d.MSG_UPDATE) return obj # Fünfecke 2 *************************************************************** def CreateSplineObjectF2(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) obj.ResizeObject(N*5*(2*NS+1)*(2*NS+1)*3) dta= a/N # Unterteilung Kante a dtb= b/N # Unterteilung Kante b zz = 0 # Zähler Punkte # Fünfeckdaten erzeugen for i in range(0,N): z = complex(-0.5 * b + i * dtb, 0) Fuenfeck2.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -60) + complex(0.5*b, 0) Fuenfeck2.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -150) + complex(0.5*b + 0.5*a, h1) Fuenfeck2.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 150) + complex(0, h) Fuenfeck2.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 60) + complex(-0.5*b - 0.5*a, h1) Fuenfeck2.append(z) # Fünfeck spiegeln for i in range(0,5*N): Fuenfeck2[i] = -Fuenfeck2[i] # Fünfeck verschieben for i in range(0,5*N): Fuenfeck2[i] = Fuenfeck2[i] + complex(ris + h + 0.5*b, 0) # Fünfeck duplizieren und drehen for i in range(0,5*N): z = Drehung(Fuenfeck2[i], -60) Fuenfeck2.append(z) for i in range(0,5*N): z = Drehung(Fuenfeck2[i], -120) Fuenfeck2.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*3): z = Fuenfeck2[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)*3) for i in range(0, (2*NS+1)*(2*NS+1)*3): obj.SetSegment(i, 5*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Fünfecke 2") obj.Message(c4d.MSG_UPDATE) return obj # Fünfecke 3 *************************************************************** def CreateSplineObjectF3(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) obj.ResizeObject(N*5*(2*NS+1)*(2*NS+1)*3) dta= a/N # Unterteilung Kante a dtb= b/N # Unterteilung Kante b zz = 0 # Zähler Punkte # Fünfeckdaten erzeugen for i in range(0,N): z = complex(-0.5 * b + i * dtb, 0) Fuenfeck3.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -60) + complex(0.5*b, 0) Fuenfeck3.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -150) + complex(0.5*b + 0.5*a, h1) Fuenfeck3.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 150) + complex(0, h) Fuenfeck3.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 60) + complex(-0.5*b - 0.5*a, h1) Fuenfeck3.append(z) # Fünfeck positionieren for i in range(0,5*N): z = Drehung(Fuenfeck3[i], -90) + complex(b + 2*h + ris, 0) Fuenfeck3[i] = z # Fünfeck duplizieren und drehen for i in range(0,5*N): z = Drehung(Fuenfeck3[i], -60) Fuenfeck3.append(z) for i in range(0,5*N): z = Drehung(Fuenfeck3[i], -120) Fuenfeck3.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*3): z = Fuenfeck3[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)*3) for i in range(0, (2*NS+1)*(2*NS+1)*3): obj.SetSegment(i, 5*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Fünfecke 3") obj.Message(c4d.MSG_UPDATE) return obj # Fünfecke 4 *************************************************************** def CreateSplineObjectF4(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) obj.ResizeObject(N*5*(2*NS+1)*(2*NS+1)*3) dta= a/N # Unterteilung Kante a dtb= b/N # Unterteilung Kante b zz = 0 # Zähler Punkte # Fünfeckdaten erzeugen for i in range(0,N): z = complex(-0.5 * b + i * dtb, 0) Fuenfeck4.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -60) + complex(0.5*b, 0) Fuenfeck4.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, -150) + complex(0.5*b + 0.5*a, h1) Fuenfeck4.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 150) + complex(0, h) Fuenfeck4.append(z) for i in range(0,N): z = complex(i * dta, 0) z = Drehung(z, 60) + complex(-0.5*b - 0.5*a, h1) Fuenfeck4.append(z) # Fünfeck positionieren for i in range(0,5*N): z = Drehung(Fuenfeck4[i], 90) + complex(ris, 0) Fuenfeck4[i] = z # Fünfeck duplizieren und drehen for i in range(0,5*N): z = Drehung(Fuenfeck4[i], -60) Fuenfeck4.append(z) for i in range(0,5*N): z = Drehung(Fuenfeck4[i], -120) Fuenfeck4.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*3): z = Fuenfeck4[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)*3) for i in range(0, (2*NS+1)*(2*NS+1)*3): obj.SetSegment(i, 5*N, True) obj[c4d.SPLINEOBJECT_CLOSED] = True obj.SetName("Fünfecke 4") obj.Message(c4d.MSG_UPDATE) return obj def main(): nullobj = CreateNullobjekt() slinobj1 = CreateSplineObjectF1() slinobj2 = CreateSplineObjectF2() slinobj3 = CreateSplineObjectF3() slinobj4 = CreateSplineObjectF4() slinobj5 = CreateSplineObjectS() doc.InsertObject(nullobj, None, None, True) doc.InsertObject(slinobj4, nullobj, None, True) doc.InsertObject(slinobj3, nullobj, None, True) doc.InsertObject(slinobj2, nullobj, None, True) doc.InsertObject(slinobj1, nullobj, None, True) doc.InsertObject(slinobj5, nullobj, None, True) c4d.EventAdd() if __name__=='__main__': main()