""" Antiprismen 01.05.2021 www.3d-meier.de """ import c4d import math N = 8 # Anzahl Ecken Vieleck if N < 3: N=3 sec = 1/math.cos(math.pi/(2*N)) h = math.sqrt(1-(sec**2)/4) # Hoehe Antiprisma R = 1/(2*math.sin(math.pi/N)) w = 2*math.pi/N # Anzahl Polygone NP = N/2-1 Radius = 1.5 # Radius der Eckpunktkugeln Faktor = 100 # Punkte erzeugen Punkte = [] for i in xrange(N): Punkte.append(c4d.Vector(Faktor*R*math.cos(2*math.pi*i/N), h*Faktor/2.0, Faktor*R*math.sin(2*math.pi*i/N))) for i in xrange(N): Punkte.append(c4d.Vector(Faktor*R*math.cos(w/2+2*math.pi*i/N), -h*Faktor/2.0, Faktor*R*math.sin(w/2+2*math.pi*i/N))) #************************************************************************ def CreateNullobjekt1(): obj = c4d.BaseObject(c4d.Onull) obj.SetName("Antiprisma-"+str(N)) 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 #------------------------------------------------------------------------------------------------------ # Deckfläche # N ist gerade def CreatePolygonObjectDG(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(2*N, 2*NP) obj.SetName('Deckflächen') # Punkte uebergeben for i in xrange(2*N): obj.SetPoint(i,Punkte[i]) # Obere Deckfläche erzeugen zz = 0 obj.SetPolygon(zz, c4d.CPolygon(0, N-1, 2,1)) zz = zz + 1 for i in xrange(1, NP): obj.SetPolygon(zz, c4d.CPolygon(N-i, N-i-1, i+2, i+1)) zz = zz + 1 # Untere Deckfläche erzeugen obj.SetPolygon(zz, c4d.CPolygon(N+2, 2*N-1, N, N+1 )) zz = zz + 1 for i in xrange(1, NP): obj.SetPolygon(zz, c4d.CPolygon(N+i+1, N+i+2, 2*N-i-1, 2*N-i)) zz = zz + 1 obj.Message(c4d.MSG_UPDATE) return obj #------------------------------------------------------------------------------------------------------ # Seitenfläche def CreatePolygonObjectS(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(2*N, 2*N) obj.SetName('Seitenflächen') # Punkte uebergeben for i in xrange(2*N): obj.SetPoint(i,Punkte[i]) zz = 0 for i in xrange(0, N-1): obj.SetPolygon(zz, c4d.CPolygon(i, i+1, N+i, N+i)) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(N-1, 0, 2*N-1, 2*N-1)) # letztes Dreieck zz = zz + 1 for i in xrange(0, N-1): obj.SetPolygon(zz, c4d.CPolygon(N+i, i+1, N+i+1, N+i+1)) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(2*N-1, 0, N, N)) # letztes Dreieck obj.Message(c4d.MSG_UPDATE) return obj #------------------------------------------------------------------------------------------------------ # Deckfläche # N ist ungerade def CreatePolygonObjectDU(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(2*N, 2*NP+2) obj.SetName('Deckflächen') # Punkte uebergeben for i in xrange(2*N): obj.SetPoint(i,Punkte[i]) if N == 3: obj.SetPolygon(0, c4d.CPolygon(0, 1, 2, 2)) obj.SetPolygon(1, c4d.CPolygon(5, 4, 3, 3)) else: # Obere Deckfläche erzeugen zz = 0 obj.SetPolygon(zz, c4d.CPolygon(0, N-1, 2,1)) # erstes Viereck zz = zz + 1 for i in xrange(1, NP): obj.SetPolygon(zz, c4d.CPolygon(N-i, N-i-1, i+2, i+1)) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(N-NP, N-NP-1, N-NP-2, N-NP-2)) # letztes Dreieck zz = zz + 1 # Untere Deckfläche erzeugen obj.SetPolygon(zz, c4d.CPolygon(N+2, 2*N-1, N, N+1 )) zz = zz + 1 for i in xrange(1, NP): obj.SetPolygon(zz, c4d.CPolygon(N+i+1, N+i+2, 2*N-i-1, 2*N-i)) zz = zz + 1 obj.SetPolygon(zz, c4d.CPolygon(2*N-NP-2, 2*N-NP-1,2*N-NP,2*N-NP )) # letztes Dreieck zz = zz + 1 obj.Message(c4d.MSG_UPDATE) return obj #------------------------------------------------------------------------------------------------------ def CreateSplineObjectS(): # Splineobjekte erzeugen obj = c4d.BaseObject(c4d.Ospline) # Anzahl Punkte des Splines obj.ResizeObject(4*N+2) zz = 0 for i in xrange(N-2): obj.SetPoint(zz, Punkte[i+1]) zz = zz +1 obj.SetPoint(zz, Punkte[i+2]) zz = zz +1 obj.SetPoint(zz, Punkte[i+N+1]) zz = zz +1 obj.SetPoint(zz, Punkte[i+N+2]) zz = zz +1 obj.SetPoint(zz, Punkte[2*N-1]) zz = zz +1 obj.SetPoint(zz, Punkte[N-1]) zz = zz +1 obj.SetPoint(zz, Punkte[0]) zz = zz +1 obj.SetPoint(zz, Punkte[2*N-1]) zz = zz +1 obj.SetPoint(zz, Punkte[N]) zz = zz +1 obj.SetPoint(zz, Punkte[0]) zz = zz +1 obj.SetPoint(zz, Punkte[1]) zz = zz +1 obj.SetPoint(zz, Punkte[N]) zz = zz +1 obj.SetPoint(zz, Punkte[N+1]) zz = zz +1 obj.SetPoint(zz, Punkte[1]) obj.Message(c4d.MSG_UPDATE) return obj #------------------------------------------------------------------------------------------------------ def main(): nullobj1 = CreateNullobjekt1() nullobj2 = CreateNullobjekt2() # Ecken nullobj3 = CreateNullobjekt3() # Kanten nullobj4 = CreateNullobjekt4() # Polygone doc.InsertObject(nullobj1, None, None, True) doc.InsertObject(nullobj4, nullobj1, None, True) doc.InsertObject(nullobj3, nullobj1, None, True) doc.InsertObject(nullobj2, nullobj1, None, True) if N % 2 == 0: # N ist gerade plyobj1 = CreatePolygonObjectDG() else: # N ist ungerade plyobj1 = CreatePolygonObjectDU() plyobj2 = CreatePolygonObjectS() splobj = CreateSplineObjectS() doc.InsertObject(plyobj2, nullobj4, None, True) doc.InsertObject(plyobj1, nullobj4, None, True) doc.InsertObject(splobj, nullobj3, None, True) # Kugeln auf Eckpunkte setzen for i in range(0, 2*N): 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, y, z)) doc.InsertObject(obj, nullobj2, None, True) c4d.EventAdd() if __name__=='__main__': main()