""" Dodekaederstumpf 07.01.2021 www.3d-meier.de """ import c4d import math # Variablen und Konstanten Titel = 'Dodekaederstumpf' # Name NP = 60 # Anzahl Punkte N3 = 20 # Anzahl Dreiecke N10 = 12 # Anzahl Zehnecke Radius = 3 # Radius der Eckpunktkugeln phi = (1 + math.sqrt(5))/2.0 # Goldener Schnitt a = 1.0/phi b = 2.0+phi c = phi d = 2.0*phi e = 1.0+phi Punkte = [( 0, a, b), ( 0, a, -b), ( 0, -a, b), ( 0, -a, -b), ( a, c, d), ( a, c, -d), ( a, -c, d), ( a, -c, -d), (-a, c, d), (-a, c, -d), (-a, -c, d), (-a, -c, -d), ( c, 2, e), ( c, 2, -e), ( c, -2, e), ( c, -2, -e), (-c, 2, e), (-c, 2, -e), (-c, -2, e), (-c, -2, -e), ( a, b, 0), ( a, -b, 0), (-a, b, 0), (-a, -b, 0), ( c, d, a), ( c, -d, a), (-c, d, a), (-c, -d, a), ( c, d, -a), ( c, -d, -a), (-c, d, -a), (-c, -d, -a), ( 2, e, c), ( 2, -e, c), (-2, e, c), (-2, -e, c), ( 2, e, -c), ( 2, -e, -c), (-2, e, -c), (-2, -e, -c), ( b, 0, a), (-b, 0, a), ( b, 0, -a), (-b, 0, -a), ( d, a, c), (-d, a, c), ( d, a, -c), (-d, a, -c), ( d, -a, c), (-d, -a, c), ( d, -a, -c), (-d, -a, -c), ( e, c, 2), (-e, c, 2), ( e, c, -2), (-e, c, -2), ( e, -c, 2), (-e, -c, 2), ( e, -c, -2), (-e, -c, -2)] Dreiecke = [(28, 20, 24, 24), (30, 26, 22, 22), (43, 47, 51, 51), (41, 49, 45, 45), (18, 57, 35, 35), (31, 23, 27, 27), (25, 21, 29, 29), (48, 40, 44, 44), (46, 42, 50, 50), ( 7, 11, 3, 3), ( 1, 9, 5, 5), (10, 6, 2, 2), ( 0, 4, 8, 8), (14, 33, 56, 56), (12, 52, 32, 32), (53, 16, 34, 34), (37, 15, 58, 58), (17, 55, 38, 38), (54, 13, 36, 36), (19, 39, 59, 59)] Zehnecke = [(30, 22, 20, 28, 36, 13, 5, 9, 17, 38), (54, 36, 28, 24, 32, 52, 44, 40, 42, 46), (48, 44, 52, 12, 4, 0, 2, 6, 14, 56), (12, 32, 24, 20, 22, 26, 34, 16, 8, 4), (53, 34, 26, 30, 38, 55, 47, 43, 41, 45), (51, 47, 55, 17, 9, 1, 3, 11, 19, 59), ( 7, 3, 1, 5, 13, 54, 46, 50, 58, 15), (37, 58, 50, 42, 40, 48, 56, 33, 25, 29), (21, 25, 33, 14, 6, 10, 18, 35, 27, 23), (31, 27, 35, 57, 49, 41, 43, 51, 59, 39), (15, 37, 29, 21, 23, 31, 39, 19, 11, 7), (45, 49, 57, 18, 10, 2, 0, 8, 16, 53)] 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 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 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 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 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 main(): nullobj1 = CreateNullobjekt1() nullobj2 = CreateNullobjekt2() # Ecken nullobj3 = CreateNullobjekt3() # Kanten nullobj4 = CreateNullobjekt4() # Polygone plyobj1 = CreateDreiecke() plyobj2 = CreateZehnecke() splobj1 = CreateSplineDreiecke() splobj2 = 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(plyobj2, nullobj4, None, True) doc.InsertObject(plyobj1, nullobj4, None, True) doc.InsertObject(splobj2, nullobj3, None, True) doc.InsertObject(splobj1, nullobj3, 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()