""" Glynn Fraktal (c) Juergen Meier (www.3d-meier.de) 18.06.2022 """ import c4d import math import cmath from c4d import gui from c4d import documents # Variablen und Konstanten Titel = 'Glynn Fraktal' xMin = -0.70 # Bereich u xMax = 1.40 # Bereich u yMin = -1.05 # Bereich v yMax = 1.05 # Bereich v Nx = 1000 # Anzahl Punkte x Ny = 1000 # Anzahl Punkte y Nmax = 50 # Iterationstiefe zMax = 4.0 # Maximaler z Wert Faktor = 10 # Skalierungsfaktor a = -0.20 # Konstante real b = 0.0 # Konstante imaginaer # Eingabedialog class MyDialogs(gui.GeDialog): res = False # Erzeugung des Layouts def CreateLayout(self): self.SetTitle(Titel) # Eingabe der Konstanten self.GroupBegin(2000, c4d.BFH_CENTER, 2, 0, "Bereich Glynn Fraktal") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(90, 2) self.AddStaticText(2001, c4d.BFH_LEFT, 0, 0, 'x-Min', c4d.BORDER_NONE) self.AddEditNumber(1001, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2002, c4d.BFH_LEFT, 0, 0, 'x-Max', c4d.BORDER_NONE) self.AddEditNumber(1002, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2003, c4d.BFH_LEFT, 0, 0, 'y-Min', c4d.BORDER_NONE) self.AddEditNumber(1003, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2004, c4d.BFH_LEFT, 0, 0, 'y-Max', c4d.BORDER_NONE) self.AddEditNumber(1004, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Eingabe der Startwerte self.GroupBegin(2005, c4d.BFH_CENTER, 2, 0, "Berechnung") self.GroupBorder(c4d.BORDER_ROUND) self.GroupBorderSpace(15, 5, 15, 5) self.GroupSpace(27, 2) self.AddStaticText(2006, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte x', c4d.BORDER_NONE) self.AddEditNumberArrows(1005, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2007, c4d.BFH_LEFT, 0, 0, 'Anzahl Punkte y', c4d.BORDER_NONE) self.AddEditNumberArrows(1006, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2008, c4d.BFH_LEFT, 0, 0, 'Iterationstiefe', c4d.BORDER_NONE) self.AddEditNumberArrows(1007, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2009, c4d.BFH_LEFT, 0, 0, 'z-Max', c4d.BORDER_NONE) self.AddEditNumber(1008, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2010, c4d.BFH_LEFT, 0, 0, 'Skalierungsfaktor', c4d.BORDER_NONE) self.AddEditNumber(1009, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2011, c4d.BFH_LEFT, 0, 0, 'c-real', c4d.BORDER_NONE) self.AddEditNumber(1010, c4d.BFH_CENTER, 100, 0) self.AddStaticText(2012, c4d.BFH_LEFT, 0, 0, 'c-imaginaer', c4d.BORDER_NONE) self.AddEditNumber(1011, c4d.BFH_CENTER, 100, 0) self.GroupEnd() self.AddSeparatorV(300, c4d.BFH_CENTER) # Dialog mit OK schliessen self.AddDlgGroup(c4d.DLG_OK|c4d.DLG_CANCEL) return False # Werte uebernehmen wenn Dialog geschlossen def AskClose(self): global uMin, uMax, vMin, vMax, Nx, Ny, Faktor xMin = self.GetReal(1001) xMax = self.GetReal(1002) yMin = self.GetReal(1003) yMax = self.GetReal(1004) Nx = self.GetLong(1005) Ny = self.GetLong(1006) Nmax = self.GetLong(1007) zMax = self.GetReal(1008) Faktor = self.GetReal(1009) a = self.GetReal(1010) b = self.GetReal(1001) return False # ????? def Command(self, id, msg): if id == 1:self.res = True if id == 1 or id == 2: self.Close() return True # Variablen im Eingabemenue def InitValues(self): self.SetReal(1001, xMin) self.SetReal(1002, xMax) self.SetReal(1003, yMin) self.SetReal(1004, yMax) self.SetLong(1005, Nx, 1, 1000000000) self.SetLong(1006, Ny, 1, 1000000000) self.SetLong(1007, Nmax, 1, 1000000000) self.SetReal(1008, zMax) self.SetReal(1009, Faktor) self.SetReal(1010, a) self.SetReal(1011, b) return True def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject((Nx+1)*(Ny+1), Nx*Ny) obj.SetName(Titel) # Konstante erzeugen c=complex(a, b) # Zaehler zz=0 # Segmentbreiten berechnen dx=(xMax-xMin)/(Nx-1) dy=(yMax-yMin)/(Ny-1) # Punkte erzeugen for j in xrange(0,Ny+1): for i in xrange(0,Nx+1): # Berechnung der Punkte y=yMax-j*dy x=xMin+i*dx # Punkt speichern obj.SetPoint(zz, c4d.Vector((x-dx/2)*Faktor,(y+dy/2)*Faktor,0)) # Zaehlewr erhoehen zz=zz+1 # Polygone erzeugen zz=0 # Zaehler zuruecksetzen for j in xrange(0,Ny): for i in xrange(0,Nx): # Komplexe Zahl bilden y=yMax-j*dy x=xMin+i*dx # Iteration z = complex(x, y) for k in xrange(0,Nmax): if abs(z) > zMax: break z = (z**1.5) + c if abs(z) < zMax: # Punkte fue Quadrat definieren P1=j*(Nx+1)+i P2=j*(Nx+1)+i+1 P3=(j+1)*(Nx+1)+i+1 P4=(j+1)*(Nx+1)+i # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zaehler erhoehen zz=zz+1 # obj.Message(c4d.MSG_UPDATE) return obj def main(): dlg = MyDialogs() dlg.Open(c4d.DLG_TYPE_MODAL) if dlg.res: plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) doc.SetActiveObject(plyobj) c4d.CallCommand(14039) # Mesh optimieren c4d.EventAdd() if __name__=='__main__': main()