""" Small Snub Icosicosidodecahedron 25.05.2021 www.3d-meier.de http://dmccooey.com/polyhedra/SmallSnubIcosicosidodecahedron.html """ import c4d import math # Variablen und Konstanten Titel = 'Small Snub Icosicosidodecahedron' # Name NP = 60 # Anzahl Punkte N3a = 60 # Anzahl Dreiecke N3b = 40 # Anzahl Dreiecke N5P = 12 # Anzahl Pentagramme Radius = 1 # Radius der Eckpunktkugeln C0 = (1 - math.sqrt(5) + math.sqrt(2*(3*math.sqrt(5)-1)))/8 C1 = (math.sqrt(5) - 1) / 4 C2 = (math.sqrt(5) - 1 + math.sqrt(2*(3*math.sqrt(5)-1)))/8 C3 = (1 + math.sqrt(3 + 2 * math.sqrt(5))) / 4 C4 = (3 + math.sqrt(5) + math.sqrt(2*(3*math.sqrt(5)-1)))/8 C5 = (math.sqrt(5) + math.sqrt(3 + 2 * math.sqrt(5))) / 4 C6 = (3 + math.sqrt(3 + 2 * math.sqrt(5))) / 4 Punkte = [( C0, 0.0, C6), ( C0, 0.0, -C6), ( -C0, 0.0, C6), ( -C0, 0.0, -C6), ( C6, C0, 0.0), ( C6, -C0, 0.0), ( -C6, C0, 0.0), ( -C6, -C0, 0.0), ( 0.0, C6, C0), ( 0.0, C6, -C0), ( 0.0, -C6, C0), ( 0.0, -C6, -C0), ( C2, 0.5, C5), ( C2, 0.5, -C5), ( C2, -0.5, C5), ( C2, -0.5, -C5), ( -C2, 0.5, C5), ( -C2, 0.5, -C5), ( -C2, -0.5, C5), ( -C2, -0.5, -C5), ( C5, C2, 0.5), ( C5, C2, -0.5), ( C5, -C2, 0.5), ( C5, -C2, -0.5), ( -C5, C2, 0.5), ( -C5, C2, -0.5), ( -C5, -C2, 0.5), ( -C5, -C2, -0.5), ( 0.5, C5, C2), ( 0.5, C5, -C2), ( 0.5, -C5, C2), ( 0.5, -C5, -C2), (-0.5, C5, C2), (-0.5, C5, -C2), (-0.5, -C5, C2), (-0.5, -C5, -C2), ( C1, C3, C4), ( C1, C3, -C4), ( C1, -C3, C4), ( C1, -C3, -C4), ( -C1, C3, C4), ( -C1, C3, -C4), ( -C1, -C3, C4), ( -C1, -C3, -C4), ( C4, C1, C3), ( C4, C1, -C3), ( C4, -C1, C3), ( C4, -C1, -C3), ( -C4, C1, C3), ( -C4, C1, -C3), ( -C4, -C1, C3), ( -C4, -C1, -C3), ( C3, C4, C1), ( C3, C4, -C1), ( C3, -C4, C1), ( C3, -C4, -C1), ( -C3, C4, C1), ( -C3, C4, -C1), ( -C3, -C4, C1), ( -C3, -C4, -C1)] Pentagramme = [( 0, 14, 46, 44, 12 ), ( 1, 13, 45, 47, 15 ), ( 2, 16, 48, 50, 18 ), ( 3, 19, 51, 49, 17 ), ( 4, 21, 53, 52, 20 ), ( 5, 22, 54, 55, 23 ), ( 6, 24, 56, 57, 25 ), ( 7, 27, 59, 58, 26 ), ( 8, 32, 40, 36, 28 ), ( 9, 29, 37, 41, 33 ), ( 10, 30, 38, 42, 34 ), ( 11, 35, 43, 39, 31 )] Dreiecke1 = [( 0, 16, 18, 18 ), ( 1, 19, 17, 17 ), ( 2, 14, 12, 12 ), ( 3, 13, 15, 15 ), ( 4, 22, 23, 23 ), ( 5, 21, 20, 20 ), ( 6, 27, 26, 26 ), ( 7, 24, 25, 25 ), ( 8, 29, 33, 33 ), ( 9, 32, 28, 28 ), ( 10, 35, 31, 31 ), ( 11, 30, 34, 34 ), ( 12, 28, 40, 40 ), ( 13, 41, 29, 29 ), ( 14, 42, 30, 30 ), ( 15, 31, 43, 43 ), ( 16, 36, 32, 32 ), ( 17, 33, 37, 37 ), ( 18, 34, 38, 38 ), ( 19, 39, 35, 35 ), ( 20, 12, 46, 46 ), ( 21, 47, 13, 13 ), ( 22, 44, 14, 14 ), ( 23, 15, 45, 45 ), ( 24, 50, 16, 16 ), ( 25, 17, 51, 51 ), ( 26, 18, 48, 48 ), ( 27, 49, 19, 19 ), ( 28, 20, 53, 53 ), ( 29, 52, 21, 21 ), ( 30, 55, 22, 22 ), ( 31, 23, 54, 54 ), ( 32, 57, 24, 24 ), ( 33, 25, 56, 56 ), ( 34, 26, 59, 59 ), ( 35, 58, 27, 27 ), ( 36, 0, 44, 44 ), ( 37, 45, 1, 1 ), ( 38, 46, 0, 0 ), ( 39, 1, 47, 47 ), ( 40, 48, 2, 2 ), ( 41, 3, 49, 49 ), ( 42, 2, 50, 50 ), ( 43, 51, 3, 3 ), ( 44, 4, 52, 52 ), ( 45, 53, 4, 4 ), ( 46, 54, 5, 5 ), ( 47, 5, 55, 55 ), ( 48, 56, 6, 6 ), ( 49, 6, 57, 57 ), ( 50, 7, 58, 58 ), ( 51, 59, 7, 7 ), ( 52, 8, 36, 36 ), ( 53, 37, 9, 9 ), ( 54, 38, 10, 10 ), ( 55, 11, 39, 39 ), ( 56, 40, 8, 8 ), ( 57, 9, 41, 41 ), ( 58, 10, 42, 42 ), ( 59, 43, 11, 11 )] Dreiecke2 = [( 0, 18, 38, 38 ), ( 0, 36, 16, 16 ), ( 1, 17, 37, 37 ), ( 1, 39, 19, 19 ), ( 2, 12, 40, 40 ), ( 2, 42, 14, 14 ), ( 3, 15, 43, 43 ), ( 3, 41, 13, 13 ), ( 21, 5, 47, 47 ), ( 21, 13, 29, 29 ), ( 22, 4, 44, 44 ), ( 22, 14, 30, 30 ), ( 25, 33, 17, 17 ), ( 25, 51, 7, 7 ), ( 26, 34, 18, 18 ), ( 26, 48, 6, 6 ), ( 28, 12, 20, 20 ), ( 28, 53, 9, 9 ), ( 31, 15, 23, 23 ), ( 31, 54, 10, 10 ), ( 32, 9, 57, 57 ), ( 32, 24, 16, 16 ), ( 35, 10, 58, 58 ), ( 35, 27, 19, 19 ), ( 45, 4, 23, 23 ), ( 45, 37, 53, 53 ), ( 46, 5, 20, 20 ), ( 46, 38, 54, 54 ), ( 49, 27, 6, 6 ), ( 49, 57, 41, 41 ), ( 50, 24, 7, 7 ), ( 50, 58, 42, 42 ), ( 52, 29, 8, 8 ), ( 52, 36, 44, 44 ), ( 55, 30, 11, 11 ), ( 55, 39, 47, 47 ), ( 56, 8, 33, 33 ), ( 56, 48, 40, 40 ), ( 59, 11, 34, 34 ), ( 59, 51, 43, 43 )] Faktor = 100 # Skalierungsfaktor k = 1 # Korrekturfaktor fuer Kantenlaenge ku = 256 # Unterteilung der Kugeln ru = math.sqrt(13+3*math.sqrt(5)+math.sqrt(2*(51+23*math.sqrt(5))))/4 # Umkugelradius rk = math.sqrt(9+3*math.sqrt(5)+math.sqrt(2*(51+23*math.sqrt(5))))/4 # Kantenkugelradius r3 = math.sqrt(3*(23+9*math.sqrt(5)+3*math.sqrt(2*(51+23*math.sqrt(5)))))/12 # Mittelpunkt Dreiecke r5 = math.sqrt(5*(25+23*math.sqrt(5)+5*math.sqrt(2*(51+23*math.sqrt(5)))))/20 # Mittelpunkt Pentagramme #************************************************************************ # 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 CreateNullobjekt5(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Kugeln') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateDreiecke1(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP,N3a) obj.SetName('Dreiecke 1') # 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(N3a): obj.SetPolygon( i, c4d.CPolygon(Dreiecke1[i][0], Dreiecke1[i][1], Dreiecke1[i][2], Dreiecke1[i][3])) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateDreiecke2(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP,N3b) obj.SetName('Dreiecke 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)) # Dreiecke setzen for i in xrange(N3b): obj.SetPolygon( i, c4d.CPolygon(Dreiecke2[i][0], Dreiecke2[i][1], Dreiecke2[i][2], Dreiecke2[i][3])) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePentagramme(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP + N5P*5, N5P*7) obj.SetName('Pentagramme') phi = (1 + math.sqrt(5))/2.0 # Goldener Schnitt r1 = phi/(2*phi + 1) r2 = (phi + 1)/(2*phi + 1) # 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(N5P): # Eckpunkte des Pentagramms in Vektoren umwandeln P0 = c4d.Vector(Punkte[Pentagramme[i][0]][0], Punkte[Pentagramme[i][0]][1], Punkte[Pentagramme[i][0]][2]) P1 = c4d.Vector(Punkte[Pentagramme[i][1]][0], Punkte[Pentagramme[i][1]][1], Punkte[Pentagramme[i][1]][2]) P2 = c4d.Vector(Punkte[Pentagramme[i][2]][0], Punkte[Pentagramme[i][2]][1], Punkte[Pentagramme[i][2]][2]) P3 = c4d.Vector(Punkte[Pentagramme[i][3]][0], Punkte[Pentagramme[i][3]][1], Punkte[Pentagramme[i][3]][2]) P4 = c4d.Vector(Punkte[Pentagramme[i][4]][0], Punkte[Pentagramme[i][4]][1], Punkte[Pentagramme[i][4]][2]) # Neue Punkte P5 = Gerade(P0, P2, r1) P6 = Gerade(P0, P2, r2) P7 = Gerade(P1, P3, r2) P8 = Gerade(P3, P0, r1) P9 = Gerade(P3, P0, r2) # Neue Punkte an Polygonobjekt uebergeben obj.SetPoint(5*i+NP, P5*Faktor*k) obj.SetPoint(5*i+NP+1, P6*Faktor*k) obj.SetPoint(5*i+NP+2, P7*Faktor*k) obj.SetPoint(5*i+NP+3, P8*Faktor*k) obj.SetPoint(5*i+NP+4, P9*Faktor*k) # Polygone setzen obj.SetPolygon(7*i+0, c4d.CPolygon(Pentagramme[i][0], 5*i+NP , 5*i+NP+4, 5*i+NP+4)) obj.SetPolygon(7*i+1, c4d.CPolygon(Pentagramme[i][1], 5*i+NP+1, 5*i+NP , 5*i+NP )) obj.SetPolygon(7*i+2, c4d.CPolygon(Pentagramme[i][2], 5*i+NP+2, 5*i+NP+1, 5*i+NP+1)) obj.SetPolygon(7*i+3, c4d.CPolygon(Pentagramme[i][3], 5*i+NP+3, 5*i+NP+2, 5*i+NP+2)) obj.SetPolygon(7*i+4, c4d.CPolygon(Pentagramme[i][4], 5*i+NP+4, 5*i+NP+3, 5*i+NP+3)) obj.SetPolygon(7*i+5, c4d.CPolygon(5*i+NP , 5*i+NP+1, 5*i+NP+2, 5*i+NP+3)) obj.SetPolygon(7*i+6, c4d.CPolygon(5*i+NP+3 , 5*i+NP+4, 5*i+NP , 5*i+NP )) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineDreiecke1(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Dreiecke 1") obj.ResizeObject(N3a*3) zz = 0 for i in xrange(N3a): for j in xrange(3): x = Punkte[Dreiecke1[i][j]][0] y = Punkte[Dreiecke1[i][j]][1] z = Punkte[Dreiecke1[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, N3a) for i in range(0, N3a): obj.SetSegment(i, 3, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineDreiecke2(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Dreiecke 2") obj.ResizeObject(N3b*3) zz = 0 for i in xrange(N3b): for j in xrange(3): x = Punkte[Dreiecke2[i][j]][0] y = Punkte[Dreiecke2[i][j]][1] z = Punkte[Dreiecke2[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, N3b) for i in range(0, N3b): obj.SetSegment(i, 3, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplinePentagramme(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Pentagramme") obj.ResizeObject(N5P*5) zz = 0 for i in xrange(N5P): x = Punkte[Pentagramme[i][0]][0] y = Punkte[Pentagramme[i][0]][1] z = Punkte[Pentagramme[i][0]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Pentagramme[i][2]][0] y = Punkte[Pentagramme[i][2]][1] z = Punkte[Pentagramme[i][2]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Pentagramme[i][4]][0] y = Punkte[Pentagramme[i][4]][1] z = Punkte[Pentagramme[i][4]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Pentagramme[i][1]][0] y = Punkte[Pentagramme[i][1]][1] z = Punkte[Pentagramme[i][1]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 x = Punkte[Pentagramme[i][3]][0] y = Punkte[Pentagramme[i][3]][1] z = Punkte[Pentagramme[i][3]][2] obj.SetPoint(zz, c4d.Vector(x*Faktor*k, y*Faktor*k, z*Faktor*k)) zz = zz + 1 # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, N5P) for i in range(0, N5P): obj.SetSegment(i, 5, 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 nullobj5 = CreateNullobjekt5() # Umkugel, etc. plyobj1 = CreateDreiecke1() plyobj2 = CreateDreiecke2() plyobj3 = CreatePentagramme() splobj1 = CreateSplineDreiecke1() splobj2 = CreateSplineDreiecke2() splobj3 = CreateSplinePentagramme() doc.InsertObject(nullobj1, None, None, True) doc.InsertObject(nullobj5, nullobj1, 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) # Inkugel Pentagramme erzeugen obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_SUB] = ku obj[c4d.PRIM_SPHERE_RAD] = r5*Faktor*k obj.SetName('Inkugel Pentagramme') obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 doc.InsertObject(obj, nullobj5, None, True) # Inkugel Dreiecke erzeugen obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_SUB] = ku obj[c4d.PRIM_SPHERE_RAD] = r3*Faktor*k obj.SetName('Inkugel Dreiecke') obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 doc.InsertObject(obj, nullobj5, None, True) # Kantenkugel erzeugen obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_SUB] = ku obj[c4d.PRIM_SPHERE_RAD] = rk*Faktor*k obj.SetName('Kantenkugel') obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 doc.InsertObject(obj, nullobj5, None, True) # Umkugel erzeugen obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_SUB] = ku obj[c4d.PRIM_SPHERE_RAD] = ru*Faktor*k obj.SetName('Umkugel') obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 doc.InsertObject(obj, nullobj5, None, True) c4d.EventAdd() if __name__=='__main__': main()