""" Great cubicuboctahedron 04.06.2021 www.3d-meier.de """ import c4d import math # Variablen und Konstanten Titel = 'Great cubicuboctahedron' # Name NP = 24 # Anzahl Punkte N3 = 8 # Anzahl Dreiecke N4 = 6 # Anzahl Vierecke N8O = 6 # Anzahl Oktagramme Radius = 2 # Radius der Eckpunktkugeln a = math.sqrt(2)-1 Punkte = [( a, 1.0, 1.0), ( 1.0, 1.0, a), ( 1.0, a, 1.0), ( a, 1.0, -1.0), ( 1.0, -1.0, a), (-1.0, a, 1.0), ( a, -1.0, 1.0), (-1.0, 1.0, a), ( 1.0, a, -1.0), ( a, -1.0, -1.0), (-1.0, -1.0, a), (-1.0, a, -1.0), ( -a, 1.0, 1.0), ( 1.0, 1.0, -a), ( 1.0, -a, 1.0), ( -a, 1.0, -1.0), ( 1.0, -1.0, -a), (-1.0, -a, 1.0), ( -a, -1.0, 1.0), (-1.0, 1.0, -a), ( 1.0, -a, -1.0), ( -a, -1.0, -1.0), (-1.0, -1.0, -a), (-1.0, -a, -1.0)] Dreiecke = [(13, 12, 14, 14), ( 0, 19, 17, 17), ( 7, 3, 23, 23), (15, 1, 20, 20), (18, 16, 2, 2), ( 4, 21, 8, 8), ( 9, 10, 11, 11), (22, 6, 5, 5)] Vierecke = [( 5, 2, 8, 11), (20, 14, 17, 23), ( 3, 0, 6, 9), (21, 18, 12, 15), (19, 13, 16, 22), ( 1, 7, 10, 4)] Oktagramme = [( 0, 1, 13, 3, 15, 19, 7, 12), ( 19, 11, 23, 22, 10, 17, 5, 7), ( 22, 21, 9, 16, 4, 6, 18, 10), ( 16, 20, 8, 13, 1, 2, 14, 4), ( 6, 14, 2, 0, 12, 5, 17, 18), ( 3, 8, 20, 9, 21, 23, 11, 15)] Faktor = 100 # Skalierungsfaktor k = 0.5 # Korrekturfaktor fuer Kantenlaenge 1 #************************************************************************ # Geradengleichung def Gerade(a, b, r): c = b-a d = a + r*c return d #************************************************************************ def CreateNullobjekt1(): obj = c4d.BaseObject(c4d.Onull) obj.SetName(Titel) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateNullobjekt2(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Ecken') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateNullobjekt3(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Kanten') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateNullobjekt4(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Polygone') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateDreiecke(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP,N3) obj.SetName('Dreiecke') # Punkte uebergeben for i in xrange(NP): obj.SetPoint(i, c4d.Vector(Punkte[i][0]*Faktor*k, Punkte[i][1]*Faktor*k, Punkte[i][2]*Faktor*k)) # Dreiecke setzen for i in xrange(N3): obj.SetPolygon( i, c4d.CPolygon(Dreiecke[i][0], Dreiecke[i][1], Dreiecke[i][2], Dreiecke[i][3])) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateVierecke(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP, N4) obj.SetName('Vierecke') # Punkte uebergeben for i in xrange(NP): obj.SetPoint(i, c4d.Vector(Punkte[i][0]*Faktor*k, Punkte[i][1]*Faktor*k, Punkte[i][2]*Faktor*k)) # Vierecke setzen for i in xrange(N4): obj.SetPolygon(i, c4d.CPolygon(Vierecke[i][0], Vierecke[i][1], Vierecke[i][2], Vierecke[i][3])) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateOktagramme(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP + N8O*16, N8O*19) obj.SetName('Oktagramme') r1 = (2-math.sqrt(2))/2 r2 = math.sqrt(2)-1 r3 = 2-math.sqrt(2) r4 = math.sqrt(2)/2 # Punkte uebergeben for i in xrange(NP): obj.SetPoint(i, c4d.Vector(Punkte[i][0]*Faktor*k, Punkte[i][1]*Faktor*k, Punkte[i][2]*Faktor*k)) for i in xrange(N8O): # Eckpunkte des Pentagramms in Vektoren umwandeln P0 = c4d.Vector(Punkte[Oktagramme[i][0]][0], Punkte[Oktagramme[i][0]][1], Punkte[Oktagramme[i][0]][2]) P1 = c4d.Vector(Punkte[Oktagramme[i][1]][0], Punkte[Oktagramme[i][1]][1], Punkte[Oktagramme[i][1]][2]) P2 = c4d.Vector(Punkte[Oktagramme[i][2]][0], Punkte[Oktagramme[i][2]][1], Punkte[Oktagramme[i][2]][2]) P3 = c4d.Vector(Punkte[Oktagramme[i][3]][0], Punkte[Oktagramme[i][3]][1], Punkte[Oktagramme[i][3]][2]) P4 = c4d.Vector(Punkte[Oktagramme[i][4]][0], Punkte[Oktagramme[i][4]][1], Punkte[Oktagramme[i][4]][2]) P5 = c4d.Vector(Punkte[Oktagramme[i][5]][0], Punkte[Oktagramme[i][5]][1], Punkte[Oktagramme[i][5]][2]) P6 = c4d.Vector(Punkte[Oktagramme[i][6]][0], Punkte[Oktagramme[i][6]][1], Punkte[Oktagramme[i][6]][2]) P7 = c4d.Vector(Punkte[Oktagramme[i][7]][0], Punkte[Oktagramme[i][7]][1], Punkte[Oktagramme[i][7]][2]) # Neue Punkte P8 = Gerade(P0, P3, r1) P9 = Gerade(P1, P4, r1) P10 = Gerade(P2, P5, r1) P11 = Gerade(P3, P6, r1) P12 = Gerade(P4, P7, r1) P13 = Gerade(P5, P0, r1) P14 = Gerade(P6, P1, r1) P15 = Gerade(P7, P2, r1) P16 = Gerade(P7, P2, r2) P17 = Gerade(P7, P2, r3) P18 = Gerade(P1, P4, r2) P19 = Gerade(P1, P4, r3) P20 = Gerade(P3, P6, r2) P21 = Gerade(P3, P6, r3) P22 = Gerade(P5, P0, r2) P23 = Gerade(P5, P0, r3) # Neue Punkte an Polygonobjekt uebergeben obj.SetPoint(16*i+NP, P8*Faktor*k) obj.SetPoint(16*i+NP+1, P9*Faktor*k) obj.SetPoint(16*i+NP+2, P10*Faktor*k) obj.SetPoint(16*i+NP+3, P11*Faktor*k) obj.SetPoint(16*i+NP+4, P12*Faktor*k) obj.SetPoint(16*i+NP+5, P13*Faktor*k) obj.SetPoint(16*i+NP+6, P14*Faktor*k) obj.SetPoint(16*i+NP+7, P15*Faktor*k) obj.SetPoint(16*i+NP+8, P16*Faktor*k) obj.SetPoint(16*i+NP+9, P17*Faktor*k) obj.SetPoint(16*i+NP+10, P18*Faktor*k) obj.SetPoint(16*i+NP+11, P19*Faktor*k) obj.SetPoint(16*i+NP+12, P20*Faktor*k) obj.SetPoint(16*i+NP+13, P21*Faktor*k) obj.SetPoint(16*i+NP+14, P22*Faktor*k) obj.SetPoint(16*i+NP+15, P23*Faktor*k) # Polygone setzen obj.SetPolygon(19*i+0, c4d.CPolygon(Oktagramme[i][0], 16*i+NP , 16*i+NP+8, 16*i+NP+7)) obj.SetPolygon(19*i+1, c4d.CPolygon(Oktagramme[i][1], 16*i+NP+1, 16*i+NP+9, 16*i+NP )) obj.SetPolygon(19*i+2, c4d.CPolygon(Oktagramme[i][2], 16*i+NP+2, 16*i+NP+10, 16*i+NP+1)) obj.SetPolygon(19*i+3, c4d.CPolygon(Oktagramme[i][3], 16*i+NP+3, 16*i+NP+11, 16*i+NP+2)) obj.SetPolygon(19*i+4, c4d.CPolygon(Oktagramme[i][4], 16*i+NP+4, 16*i+NP+12, 16*i+NP+3)) obj.SetPolygon(19*i+5, c4d.CPolygon(Oktagramme[i][5], 16*i+NP+5, 16*i+NP+13, 16*i+NP+4)) obj.SetPolygon(19*i+6, c4d.CPolygon(Oktagramme[i][6], 16*i+NP+6, 16*i+NP+14, 16*i+NP+5)) obj.SetPolygon(19*i+7, c4d.CPolygon(Oktagramme[i][7], 16*i+NP+7, 16*i+NP+15, 16*i+NP+6)) obj.SetPolygon(19*i+8, c4d.CPolygon(16*i+NP, 16*i+NP+9, 16*i+NP+8, 16*i+NP+8)) obj.SetPolygon(19*i+9, c4d.CPolygon(16*i+NP+1, 16*i+NP+10, 16*i+NP+9, 16*i+NP+9)) obj.SetPolygon(19*i+10, c4d.CPolygon(16*i+NP+2, 16*i+NP+11, 16*i+NP+10, 16*i+NP+10)) obj.SetPolygon(19*i+11, c4d.CPolygon(16*i+NP+3, 16*i+NP+12, 16*i+NP+11, 16*i+NP+11)) obj.SetPolygon(19*i+12, c4d.CPolygon(16*i+NP+4, 16*i+NP+13, 16*i+NP+12, 16*i+NP+12)) obj.SetPolygon(19*i+13, c4d.CPolygon(16*i+NP+5, 16*i+NP+14, 16*i+NP+13, 16*i+NP+13)) obj.SetPolygon(19*i+14, c4d.CPolygon(16*i+NP+6, 16*i+NP+15, 16*i+NP+14, 16*i+NP+14)) obj.SetPolygon(19*i+15, c4d.CPolygon(16*i+NP+7, 16*i+NP+8, 16*i+NP+15, 16*i+NP+15)) obj.SetPolygon(19*i+16, c4d.CPolygon(16*i+NP+12, 16*i+NP+13, 16*i+NP+14, 16*i+NP+11)) obj.SetPolygon(19*i+17, c4d.CPolygon(16*i+NP+11, 16*i+NP+14, 16*i+NP+15, 16*i+NP+10)) obj.SetPolygon(19*i+18, c4d.CPolygon(16*i+NP+10, 16*i+NP+15, 16*i+NP+8, 16*i+NP+9)) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineDreiecke(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Dreiecke") obj.ResizeObject(N3*3) zz = 0 for i in xrange(N3): for j in xrange(3): x = Punkte[Dreiecke[i][j]][0] y = Punkte[Dreiecke[i][j]][1] z = Punkte[Dreiecke[i][j]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, N3) for i in range(0, N3): obj.SetSegment(i, 3, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineVierecke(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Vierecke") obj.ResizeObject(N4*4) zz = 0 for i in xrange(N4): for j in xrange(4): x = Punkte[Vierecke[i][j]][0] y = Punkte[Vierecke[i][j]][1] z = Punkte[Vierecke[i][j]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, N4) for i in range(0, N4): obj.SetSegment(i, 4, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineOktagramme(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Oktagramme") obj.ResizeObject(N8O*8) zz = 0 for i in xrange(N8O): x = Punkte[Oktagramme[i][0]][0] y = Punkte[Oktagramme[i][0]][1] z = Punkte[Oktagramme[i][0]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][3]][0] y = Punkte[Oktagramme[i][3]][1] z = Punkte[Oktagramme[i][3]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][6]][0] y = Punkte[Oktagramme[i][6]][1] z = Punkte[Oktagramme[i][6]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][1]][0] y = Punkte[Oktagramme[i][1]][1] z = Punkte[Oktagramme[i][1]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][4]][0] y = Punkte[Oktagramme[i][4]][1] z = Punkte[Oktagramme[i][4]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][7]][0] y = Punkte[Oktagramme[i][7]][1] z = Punkte[Oktagramme[i][7]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][2]][0] y = Punkte[Oktagramme[i][2]][1] z = Punkte[Oktagramme[i][2]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Oktagramme[i][5]][0] y = Punkte[Oktagramme[i][5]][1] z = Punkte[Oktagramme[i][5]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, N8O) for i in range(0, N8O): obj.SetSegment(i, 8, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def main(): nullobj1 = CreateNullobjekt1() nullobj2 = CreateNullobjekt2() # Ecken nullobj3 = CreateNullobjekt3() # Kanten nullobj4 = CreateNullobjekt4() # Polygone plyobj1 = CreateDreiecke() plyobj2 = CreateVierecke() plyobj3 = CreateOktagramme() splobj1 = CreateSplineDreiecke() splobj2 = CreateSplineVierecke() splobj3 = CreateSplineOktagramme() doc.InsertObject(nullobj1, None, None, True) doc.InsertObject(nullobj4, nullobj1, None, True) doc.InsertObject(nullobj3, nullobj1, None, True) doc.InsertObject(nullobj2, nullobj1, None, True) doc.InsertObject(splobj3, nullobj3, None, True) doc.InsertObject(splobj2, nullobj3, None, True) doc.InsertObject(splobj1, nullobj3, None, True) doc.InsertObject(plyobj3, nullobj4, None, True) doc.InsertObject(plyobj2, nullobj4, None, True) doc.InsertObject(plyobj1, nullobj4, None, True) # Kugeln auf Eckpunkte setzen for i in range(0, NP): obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_RAD] = Radius obj.SetName(str(i)) x = Punkte[i][0] y = Punkte[i][1] z = Punkte[i][2] obj.SetAbsPos(c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) doc.InsertObject(obj, nullobj2, None, True) c4d.EventAdd() if __name__=='__main__': main()