""" 5-Eck Prismen Ring 29.04.2021 www.3d-meier.de """ import c4d import math # Variablen und Konstanten Titel = '5-Eck Prismen Ring' # Name NP = 60 # Anzahl Punkte N4 = 30 # Anzahl Vierecke N5 = 20 # Anzahl Fuenfecke Radius = 3 # Radius der Eckpunktkugeln Ru = math.sqrt(50 + 10*math.sqrt(5))/10 # Umkreisradius Fuenfeck Ri = math.sqrt(25 + 10*math.sqrt(5))/10 # Inkreisradius Fuenfeck cos72 = (math.sqrt(5)-1)/4 # 0,3090 sin72 = math.sqrt(10+2*math.sqrt(5))/4 # 0,9511 cos144 = -(1+math.sqrt(5))/4 # -0,8090 b = 1/(2*math.tan(math.pi/10)) # Berechnung der ersten 3 Punkte Punkte = [( b+Ri+Ru, -0.5, 0), ( b+Ri+Ru*cos72, -0.5, -Ru*sin72), (b+Ri+Ru*cos144, -0.5, -0.5)] # Berechnung der restlichen Punkte N = 10 for i in range(1, N): for j in range(3): Punkte.append(c4d.Vector(Punkte[j][0]*math.cos(2*math.pi*i/N)-Punkte[j][2]*math.sin(2*math.pi*i/N), -0.5, Punkte[j][0]*math.sin(2*math.pi*i/N)+Punkte[j][2]*math.cos(2*math.pi*i/N))) for i in range(30): Punkte.append(c4d.Vector(Punkte[i][0], Punkte[i][1], Punkte[i][2])+ c4d.Vector(0, 1, 0)) Vierecke = [( 2, 5, 35, 32), ( 3+2, 3+5, 3+35, 3+32), ( 6+2, 6+5, 6+35, 6+32), ( 9+2, 9+5, 9+35, 9+32), (12+2, 12+5, 12+35, 12+32), (15+2, 15+5, 15+35, 15+32), (18+2, 18+5, 18+35, 18+32), (21+2, 21+5, 21+35, 21+32), (24+2, 24+5, 24+35, 24+32), (27+2, 2, 32, 27+32), ( 30, 0, 4, 34), ( 34, 4, 3, 33), ( 33, 3, 7, 37), ( 37, 7, 6, 36), ( 36, 6, 10, 40), ( 40, 10, 9, 39), ( 39, 9, 13, 43), ( 43, 13, 12, 42), ( 42, 12, 16, 46), ( 46, 16, 15, 45), ( 45, 15, 19, 49), ( 49, 19, 18, 48), ( 48, 18, 22, 52), ( 52, 22, 21, 51), ( 51, 21, 25, 55), ( 55, 25, 24, 54), ( 54, 24, 28, 58), ( 58, 28, 27, 57), ( 57, 27, 1, 31), ( 31, 1, 0, 30)] Fuenfecke = [( 2, 1, 0, 4, 5), ( 3+2, 3+1, 3+0, 3+4, 3+5), ( 6+2, 6+1, 6+0, 6+4, 6+5), ( 9+2, 9+1, 9+0, 9+4, 9+5), ( 12+2, 12+1, 12+0, 12+4, 12+5), ( 15+2, 15+1, 15+0, 15+4, 15+5), ( 18+2, 18+1, 18+0, 18+4, 18+5), ( 21+2, 21+1, 21+0, 21+4, 21+5), ( 24+2, 24+1, 24+0, 24+4, 24+5), ( 27+2, 27+1, 27+0, 1, 2), ( 30, 31, 32, 35, 34), ( 3+30, 3+31, 3+32, 3+35, 3+34), ( 6+30, 6+31, 6+32, 6+35, 6+34), ( 9+30, 9+31, 9+32, 9+35, 9+34), (12+30, 12+31, 12+32, 12+35, 12+34), (15+30, 15+31, 15+32, 15+35, 15+34), (18+30, 18+31, 18+32, 18+35, 18+34), (21+30, 21+31, 21+32, 21+35, 21+34), (24+30, 24+31, 24+32, 24+35, 24+34), (27+30, 27+31, 27+32, 32, 31)] Faktor = 100 # Skalierungsfaktor k = 1 # Korrekturfaktor #************************************************************************ 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 CreateFuenfecke(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP, N5*2) obj.SetName('Fünfecke') # 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 # Zaehler fuer Polygone zuruecksetzen for i in xrange(N5): obj.SetPolygon(zz, c4d.CPolygon(Fuenfecke[i][0], Fuenfecke[i][1], Fuenfecke[i][2], Fuenfecke[i][4])) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(Fuenfecke[i][2], Fuenfecke[i][3], Fuenfecke[i][4], Fuenfecke[i][4])) 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 CreateSplineFuenfecke(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Fünfecke") obj.ResizeObject(N5*5) zz = 0 for i in xrange(N5): for j in xrange(5): x = Punkte[Fuenfecke[i][j]][0] y = Punkte[Fuenfecke[i][j]][1] z = Punkte[Fuenfecke[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, N5) for i in range(0, N5): 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 plyobj1 = CreateVierecke() plyobj2 = CreateFuenfecke() splobj1 = CreateSplineVierecke() splobj2 = CreateSplineFuenfecke() 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(splobj2, nullobj3, None, True) doc.InsertObject(splobj1, nullobj3, 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 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()