""" Großes Rhombenikosidodekaeder 07.01.2021 www.3d-meier.de """ import c4d import math # Variablen und Konstanten Titel = 'Großes Rhombenikosidodekaeder' # Name NP = 120 # Anzahl Punkte N4 = 30 # Anzahl Vierecke N6 = 20 # Anzahl Sechsecke N10 = 12 # Anzahl Zehnecke Radius = 3 # Radius der Eckpunktkugeln phi = (1 + math.sqrt(5))/2.0 # Goldener Schnitt a = 1/phi b = phi+3 c = 2/phi d = phi e = 2*phi+1 f = phi*phi g = 3*phi-1 h = 2*phi-1 m = phi+2 n = 2*phi Punkte = [( a, a, b), ( a, a, -b), ( a, -a, b), ( a, -a, -b), (-a, a, b), (-a, a, -b), (-a, -a, b), (-a, -a, -b), ( c, d, e), ( c, d, -e), ( c, -d, e), ( c, -d, -e), (-c, d, e), (-c, d, -e), (-c, -d, e), (-c, -d, -e), ( a, f, g), ( a, f, -g), ( a, -f, g), ( a, -f, -g), (-a, f, g), (-a, f, -g), (-a, -f, g), (-a, -f, -g), ( h, 2, m), ( h, 2, -m), ( h, -2, m), ( h, -2, -m), (-h, 2, m), (-h, 2, -m), (-h, -2, m), (-h, -2, -m), ( d, 3, n), ( d, 3, -n), ( d, -3, n), ( d, -3, -n), (-d, 3, n), (-d, 3, -n), (-d, -3, n), (-d, -3, -n), ( a, b, a), ( a, -b, a), (-a, b, a), (-a, -b, a), ( a, b, -a), ( a, -b, -a), (-a, b, -a), (-a, -b, -a), ( d, e, c), ( d, -e, c), (-d, e, c), (-d, -e, c), ( d, e, -c), ( d, -e, -c), (-d, e, -c), (-d, -e, -c), ( f, g, a), ( f, -g, a), (-f, g, a), (-f, -g, a), ( f, g, -a), ( f, -g, -a), (-f, g, -a), (-f, -g, -a), ( 2, m, h), ( 2, -m, h), (-2, m, h), (-2, -m, h), ( 2, m, -h), ( 2, -m, -h), (-2, m, -h), (-2, -m, -h), ( 3, n, d), ( 3, -n, d), (-3, n, d), (-3, -n, d), ( 3, n, -d), ( 3, -n, -d), (-3, n, -d), (-3, -n, -d), ( b, a, a), (-b, a, a), ( b, a, -a), (-b, a, -a), ( b, -a, a), (-b, -a, a), ( b, -a, -a), (-b, -a, -a), ( e, c, d), (-e, c, d), ( e, c, -d), (-e, c, -d), ( e, -c, d), (-e, -c, d), ( e, -c, -d), (-e, -c, -d), ( g, a, f), (-g, a, f), ( g, a, -f), (-g, a, -f), ( g, -a, f), (-g, -a, f), ( g, -a, -f), (-g, -a, -f), ( m, h, 2), (-m, h, 2), ( m, h, -2), (-m, h, -2), ( m, -h, 2), (-m, -h, 2), ( m, -h, -2), (-m, -h, -2), ( n, d, 3), (-n, d, 3), ( n, d, -3), (-n, d, -3), ( n, -d, 3), (-n, -d, 3), ( n, -d, -3), (-n, -d, -3)] Vierecke = [( 17, 33, 25, 9), ( 52, 60, 76, 68), ( 46, 42, 40, 44), ( 48, 64, 72, 56), ( 32, 16, 8, 24), ( 20, 36, 28, 12), (113, 105, 89, 97), ( 81, 83, 87, 85), (107, 115, 99, 91), ( 5, 1, 3, 7), ( 31, 15, 23, 39), ( 11, 27, 35, 19), ( 69, 77, 61, 53), (118, 102, 94, 110), ( 82, 80, 84, 86), (114, 106, 90, 98), (104, 112, 96, 88), ( 92, 100, 116, 108), ( 26, 10, 18, 34), ( 0, 4, 6, 2), ( 22, 14, 30, 38), ( 95, 103, 119, 111), (117, 101, 93, 109), ( 62, 54, 70, 78), ( 66, 50, 58, 74), ( 37, 21, 13, 29), ( 63, 79, 71, 55), ( 67, 75, 59, 51), ( 41, 43, 47, 45), ( 65, 49, 57, 73)] Sechsecke = [( 25, 33, 68, 76, 106, 114), ( 52, 44, 40, 48, 56, 60), (104, 72, 64, 32, 24, 112), ( 8, 16, 20, 12, 4, 0), ( 36, 66, 74, 105, 113, 28), ( 50, 42, 46, 54, 62, 58), ( 78, 70, 37, 29, 115, 107), ( 21, 17, 9, 1, 5, 13), ( 7, 3, 11, 19, 23, 15), (118, 110, 77, 69, 35, 27), ( 80, 88, 96, 100, 92, 84), ( 98, 90, 82, 86, 94, 102), (116, 26, 34, 65, 73, 108), ( 2, 6, 14, 22, 18, 10), (117, 109, 75, 67, 38, 30), ( 89, 81, 85, 93, 101, 97), ( 83, 91, 99, 103, 95, 87), ( 51, 59, 63, 55, 47, 43), (111, 119, 31, 39, 71, 79), ( 45, 53, 61, 57, 49, 41)] Zehnecke = [( 45, 47, 55, 71, 39, 23, 19, 35, 69, 53), ( 18, 22, 38, 67, 51, 43, 41, 49, 65, 34), ( 28, 113, 97, 101, 117, 30, 14, 6, 4, 12), ( 40, 42, 50, 66, 36, 20, 16, 32, 64, 48), ( 17, 21, 37, 70, 54, 46, 44, 52, 68, 33), (118, 27, 11, 3, 1, 9, 25, 114, 98, 102), ( 73, 57, 61, 77, 110, 94, 86, 84, 92, 108), ( 2, 10, 26, 116, 100, 96, 112, 24, 8, 0), ( 7, 15, 31, 119, 103, 99, 115, 29, 13, 5), ( 91, 83, 81, 89, 105, 74, 58, 62, 78, 107), ( 79, 63, 59, 75, 109, 93, 85, 87, 95, 111), ( 88, 80, 82, 90, 106, 76, 60, 56, 72, 104)] Faktor = 100 # Skalierungsfaktor k = 1/(2*phi-2) # Korrekturfaktor fuer Kantenlaenge 1 #************************************************************************ 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 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 CreateSechsecke(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP, N6*2) obj.SetName('Sechsecke') # 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 zz = 0 # Zaehler fuer Polygone zuruecksetzen for i in xrange(N6): obj.SetPolygon(zz, c4d.CPolygon(Sechsecke[i][0], Sechsecke[i][1], Sechsecke[i][2], Sechsecke[i][5])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Sechsecke[i][2], Sechsecke[i][3], Sechsecke[i][4], Sechsecke[i][5])) zz = zz + 1 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateZehnecke(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP, N10*5) obj.SetName('Zehnecke') # 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)) zz = 0 # Zähler für Polygone zurücksetzen for i in xrange(N10): obj.SetPolygon(zz, c4d.CPolygon(Zehnecke[i][0], Zehnecke[i][1], Zehnecke[i][9], Zehnecke[i][9])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Zehnecke[i][1], Zehnecke[i][2], Zehnecke[i][8], Zehnecke[i][9])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Zehnecke[i][2], Zehnecke[i][3], Zehnecke[i][7], Zehnecke[i][8])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Zehnecke[i][3], Zehnecke[i][4], Zehnecke[i][6], Zehnecke[i][7])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Zehnecke[i][4], Zehnecke[i][5], Zehnecke[i][6], Zehnecke[i][6])) zz = zz + 1 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 CreateSplineSechsecke(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Sechsecke") obj.ResizeObject(N6*6) zz = 0 for i in xrange(N6): for j in xrange(6): x = Punkte[Sechsecke[i][j]][0] y = Punkte[Sechsecke[i][j]][1] z = Punkte[Sechsecke[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, N6) for i in range(0, N6): obj.SetSegment(i, 6, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineZehnecke(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Zehnecke") obj.ResizeObject(N10*10) zz = 0 for i in xrange(N10): for j in xrange(10): x = Punkte[Zehnecke[i][j]][0] y = Punkte[Zehnecke[i][j]][1] z = Punkte[Zehnecke[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, N10) for i in range(0, N10): obj.SetSegment(i, 10, 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 = CreateVierecke() plyobj2 = CreateSechsecke() plyobj3 = CreateZehnecke() splobj1 = CreateSplineVierecke() splobj2 = CreateSplineSechsecke() splobj3 = CreateSplineZehnecke() 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()