[zurück]

6. Python Code

[vor]

Auf dieser Seite möchte ich die Entwicklung des Plugins dokumentieren. Das mache ich mehr für mich, ich bin kein Pythonexperte. Deshalb sollte man meinen Code auch mit Vorsicjht genießen, vielleicht könnte man manches einfacher machen aber hauptsache es funkzioniert.

Fangen wir damit an ein Nullobjekt mit dem Namen Sonnenblume zu erzeugen (Test1.py).


"""
Test 1
09.05.2019
"""

import c4d

def CreateNullobjekt():
    obj = c4d.BaseObject(c4d.Onull)   # Nullobjekt erzeugen
    obj.SetName("Sonnenblume")
    obj.Message(c4d.MSG_UPDATE)
    return obj

def main():
    nullobj = CreateNullobjekt()

    doc.InsertObject(nullobj, None, None, True)

    c4d.EventAdd()

if __name__=='__main__':
    main()

Für die Darstellung der Sonnenblumenkerne habe ich mich für Kreise in Form von Splines entschlossen. So hat man für alle Kreise nur ein Objekt. Mit Polygonen würde das natürlich auch gehen.

Fangen wir mit einem Sechseck an dessen Punkte wir manuell zuweisen (Test2.py).


def CreateSplineObjectV():
  # Splineobjekte erzeugen
    obj = c4d.BaseObject(c4d.Ospline)
  # Anzahl Punkte des Splines
    obj.ResizeObject(6)

  # Punkte des Sechsecks definieren
    obj.SetPoint(0, c4d.Vector(200, 0, 0))
    obj.SetPoint(1, c4d.Vector(100, 173.205, 0))
    obj.SetPoint(2, c4d.Vector(-100, 173.205, 0))
    obj.SetPoint(3, c4d.Vector(-200, 0, 0))
    obj.SetPoint(4, c4d.Vector(-100, -173.205, 0))
    obj.SetPoint(5, c4d.Vector(100, -173.205, 0))

  # Spline schließen
    obj[c4d.SPLINEOBJECT_CLOSED] = True
  # Name vergeben
    obj.SetName("Sechseck")

Natürlich macht es keinen Sinne die Punkte manuell zuzuweisen, wir wollen sie ja berechnen. Da Python auch mit komplexen Zahlen umgehen kann habe ich das Ganze in die komplexe Zahlenebene verlegt. Das würde natürlich auch anders funktionieren aber ich liebe komplexe Zahlen. Für die Drehung habe ich dann eine Funktion definiert (Test3.py).


def Drehung(z, Grad):
    Winkel = Grad * math.pi/180
    x = z.real
    y = z.imag
    x1 = math.cos(Winkel) * x + math.sin(Winkel) * y
    y1 = -math.sin(Winkel) * x + math.cos(Winkel) * y
    return complex(x1, y1)

Die Daten des ursprünglichen Vielecks werden in einem Array "Vieleck" gespeichert und dann auf das Spline übertragen.


  # Vieleckdaten erzeugen
    z = complex(r, 0)
    Vieleck.append(z)
    for k in range(1,NK):
        z = Drehung(Vieleck[0], -360*k/NK)
        Vieleck.append(z)

  # Vieleckdaten dem Spline zuweisen
    for k in range(0,NK):
        z = Vieleck[k]
        obj.SetPoint(zz, c4d.Vector(z.real*Faktor, z.imag*Faktor, 0.0))
        zz = zz + 1

Für die Sonnenblume benötigen wir aber mehr (NS) Kerne (Vielecke). Sie werden jeweils ein kleines Stück nach aussen verschoben und um den Winkel Phi gedreht (Test4.py).

Zusätzlich habe ich noch ein Extrude Nurbs eingefügt (Test5.py).

Die Berechnung der Fibonacci ist ein interessantes Feld für Programmierversuiche, hier (Fibonacci1.py) mal mein eigener Versuch.


"""
Fibonacci 1
www.3d-meier.de
18.05.2019
"""

F = []

def Fibonacci(n):
    F.append(0)
    F.append(1)

    for k in range(1,n):
        F.append(F[k]+F[k-1])
    return F[n]

def main():
    print(Fibonacci(10))
    print(F)

if __name__=='__main__':
    main()

Im Internet gibt es fast unendlich viele Beispiele die Fibonacci Zahlen zu brerechnen. Einige versuche ich hier nachzuvollziehen und zu verstehen. Das man sie auf vielen Seiten findet verzichte ich auf eine Quellenangabe. (Fibonacci2.py bis Fibonacci4.py)


def Fibonacci(n):
    a = 1
    b = 1
    if n == 1:
        return a
    elif n == 2:
        return b
    else:
        for i in range(1,n-1):
            c = a + b
            a = b
            b = c
        return b

def Fibonacci(n):
    if n==1 or n==2:
        return 1
    return Fibonacci(n-1) + Fibonacci(n-2)

def Fibonacci(n):
    a = (1 + (5 ** 0.5)) ** n
    b = (1 - (5 ** 0.5)) ** n
    c = (2 ** n) * (5 ** 0.5)
    return int(round((a - b) / c))







[zurück] [Inhaltsverzeichnis] [vor]