Das Python Skript (für Cinema 4D [12]) ist sicher nicht besonders elegant geschrieben, mit der Bezeichnung der Variablen bin ich auch eher kreativ.
Aber ich versuche mal den Code zu erklären.
Im ersten Schritt müssen wir ein Vieleck mit N Seiten erzeugen [5].
Punkte = []
N = 4 # Anzahl Seiten des Polygons
a = 1 # Seitenlänge des Polygons
Faktor = 100 # Skalierungsfaktor
R = a/(2*math.sin(math.pi/N)) # Umkreisradius Polygon
O = 1 # Orientierung der Spirale (O = 1 oder O = -1)
for i in range(N):
Punkte.append(c4d.Vector(Faktor*R*math.cos(O*2*math.pi*i/N), 0, Faktor*R*math.sin(O*2*math.pi*i/N)))
Die weiteren Polygone (Gesamtzahl N1) werden mit Hilfe der Funktion "Gerade" berechnet.
def Gerade(a, b, r):
c = b-a
d = a + r*c
return d
Dazu benötigen wir zwei Schleifen.
for i in range(0, N1):
for k in range(0, N-1):
Punkte.append(Gerade(c4d.Vector(Punkte[i*N+k]), c4d.Vector(Punkte[i*N+k+1]), r) + c4d.Vector(0, Faktor*h, 0))
Punkte.append(Gerade(c4d.Vector(Punkte[i*N+N-1]), c4d.Vector(Punkte[i*N+0]), r) + c4d.Vector(0, Faktor*h, 0))
Für das Beispiel N=4 und N1=3 gilt.
i=2 8 9 10 11
i=1 4 5 6 7
i=0 0 1 2 3
k=0 k=1 k=2
Spline-Spirale 1
Jetzt müssen wir nur noch die Punkte auf ein Spline übertragen.
for i in xrange(NP):
obj.SetPoint(i, c4d.Vector(Punkte[i]))
# Segmente erzeugen
obj.MakeVariableTag(c4d.Tsegment, N1)
for i in range(0, N1):
obj.SetSegment(i, N, True)
# Spline schliessen
obj[c4d.SPLINEOBJECT_CLOSED] = True
Spline-Spirale 2
Für die zweite Variante der Spirale müssen wir die Punkte anders sortieren.
zz = 0 # Zaehler
for i in xrange(N):
for k in xrange(N1):
obj.SetPoint(zz, c4d.Vector(Punkte[i+k*N]))
zz = zz +1
# Segmente erzeugen
obj.MakeVariableTag(c4d.Tsegment, N)
for i in range(0, N):
obj.SetSegment(i, N1, True)
# Spline schliessen
obj[c4d.SPLINEOBJECT_CLOSED] = False
Für das Beispiel N=4 und N1=3 gilt.
i=3 3 7 11
i=2 2 6 10
i=1 1 5 9
i=0 0 4 8
k=0 k=1 k=2
Polygonobjekt 1

Wenn wir eine Höhe h zwischen den einzelnen Vielecken einfügen können wir auch ein 3 dimensionales Polygonobjekt erzeugen.
Zuerst übergeben wir die Punkte an das Polygonobjekt.
for i in range(NP):
obj.SetPoint(i, c4d.Vector(Punkte[i]))
Jetzt müssen wir jeweils 4 Punkte zu einem Polygon verbinden.
zz = 0 # Zaehler
for i in range(0, N1-1):
for k in range(0, N-1):
obj.SetPolygon(zz, c4d.CPolygon(k+i*N, k+N+i*N, k+N+1+i*N, k+1+i*N))
zz = zz + 1
obj.SetPolygon(zz, c4d.CPolygon(N-1+i*N, 2*N-1+i*N, N+i*N, 0+i*N))
zz = zz + 1
Für das Beispiel N=4 und N1=3 gilt.
8 9 10 11
i=1 4 5 6 7
i=0 0 1 2 3
k=0 k=1 k=2
Polygonobjekt 2

Für diese Variante müssen wir die Anzahl der Punkte verdoppeln. Jedes Vieleck wird zweimal kopiert und einmal mit einer
Höhe h versehen.
Punkte1 = []
for i in range(N1):
for k in range(N):
Punkte1.append(c4d.Vector(Punkte[k+i*N]))
for k in range(N):
Punkte1.append(c4d.Vector(Punkte[k+i*N]) + c4d.Vector(0, Faktor*h, 0))
Das Polygonobjekt besteht aus Dreiecken und Vierecken, wenden wir uns erst den Vierecken zu.
zz = 0
for i in range(0, N1):
for k in range(0, N-1):
obj.SetPolygon(zz, c4d.CPolygon(k+i*2*N, k+N+i*2*N, k+N+1+i*2*N, k+1+i*2*N))
zz = zz + 1
obj.SetPolygon(zz, c4d.CPolygon(N-1+i*2*N, 2*N-1+i*2*N, N+i*2*N, 0+i*2*N))
zz = zz + 1
Für das Beispiel N=4 und N1=3 gilt.
20 21 22 23
i=2 16 17 18 19
12 13 14 15
i=1 8 9 10 11
4 5 6 7
i=0 0 1 2 3
k=0 k=1 k=2
Für die Dreiecke gilt.
for i in range(0, N1-1):
for k in range(0, N-1):
obj.SetPolygon(zz, c4d.CPolygon(k+2*N+i*2*N, k+2*N+1+i*2*N, k+N+1+i*2*N, k+N+1+i*2*N))
zz = zz + 1
obj.SetPolygon(zz, c4d.CPolygon(3*N-1+i*2*N, 2*N+i*2*N, N+i*2*N, N+i*2*N))
zz = zz + 1
Polygonobjekt 3 und 4
Mit Hilfe der Polygonobjekte 3 und 4 lassen sich die Dreiecke der Spirale abwechselnd unterschiedlich einfärben.
zz = 0 # Zaehler
for i in range(0, N1-1,2):
for k in range(0, N-1):
obj.SetPolygon(zz, c4d.CPolygon((i+1)*N+k, (i+1)*N+k+1, i*N+k+1, i*N+k+1))
zz = zz + 1
obj.SetPolygon(zz, c4d.CPolygon((i+2)*N-1, (i+1)*N, i*N, i*N))
zz = zz + 1
und
zz = 0 # Zaehler
for i in range(1, N1-1,2):
for k in range(0, N-1):
obj.SetPolygon(zz, c4d.CPolygon((i+1)*N+k, (i+1)*N+k+1, i*N+k+1, i*N+k+1))
zz = zz + 1
obj.SetPolygon(zz, c4d.CPolygon((i+2)*N-1, (i+1)*N, i*N, i*N))
zz = zz + 1
Für das Beispiel N=4 und N1=4 gilt.
k=3 7 4 0 11 8 4 15 12 8
k=2 6 7 3 10 11 7 14 15 11
k=1 5 6 2 9 10 6 13 14 10
k=0 4 5 1 8 9 5 12 13 9
i=0 i=1 i=2
Polygonobjekt 5
Für den einzelnen Arme der Spirale wurden nur die dafür nötigen Punkte übertragen.
# Punkte uebergeben
zz = 0
for i in range(1,N1):
obj.SetPoint(zz, c4d.Vector(Punkte[i*N]))
zz = zz + 1
obj.SetPoint(zz, c4d.Vector(Punkte[1+(i-1)*N]))
zz = zz + 1
obj.SetPoint(zz, c4d.Vector(Punkte[(N1-1)*N+1]))
# Dreiecke setzen
for i in range(0, N1-2):
obj.SetPolygon(i, c4d.CPolygon(i*2, i*2+3, i*2+1, i*2+1))
obj.SetPolygon(N1-2, c4d.CPolygon((N1-2)*2, (N1-2)*2+2, (N1-2)*2+1, (N1-2)*2+1))