""" Parabolic Humming Top 10.04.2020 """ import c4d import math # Variablen und Konstanten dialog_title = 'Parabolic Humming Top' h = 3.0 # Konstante h für die Hoehe p = 0.7 # Konstante p für den Radius vMin = -h # Bereich u vMax = h # Bereich u uMin = 0.0 # Bereich v uMax = 2*math.pi # Bereich v Nu = 20 # Anzahl Punkte u Nv = 10 # Anzahl Punkte v SPunkte = 0 # Anzahl Punkte des Polygonobjekts SPolygon = 0 # Anzahl Polygone des Polygonobjekts Faktor = 25 # Skalierungsfaktor def CreatePolygonObject(): # Polygonobjekt erzeugen obj = c4d.BaseObject(c4d.Opolygon) SPunkte = Nu*(Nv-1)+2 SPolygone = Nu*Nv obj.ResizeObject(SPunkte, SPolygone) obj.SetName(dialog_title) # Variablen zz=0 # Zaehler # Segmentbreiten berechnen du=(uMax-uMin)/Nu dv=(vMax-vMin)/Nv # Punkte erzeugen for i in xrange(0,Nu): for j in xrange(1,Nv): # Berechnung der Parameter u=uMin+i*du v=vMin+j*dv # Berechnung der Koordinaten x= (((abs(v) - h)**2)/2*p)*math.cos(u) z= (((abs(v) - h)**2)/2*p)*math.sin(u) y= v # Punkt speichern obj.SetPoint(zz, c4d.Vector(x*Faktor,y*Faktor,z*Faktor)) # Zaehler erhoehen zz=zz+1 # Nordpol setzen obj.SetPoint(zz, c4d.Vector(0,h*Faktor,0)) zz=zz+1 # Suedpol setzen obj.SetPoint(zz, c4d.Vector(0,-h*Faktor,0)) zz=zz+1 # Polygone erzeugen zz=0 # Zaehler zuruecksetzen for j in xrange(0,Nv-2): for i in xrange(0,Nu-1): # Punkte fuer ein Quadrat definieren P1=i*(Nv-1)+j P2=i*(Nv-1)+j+1 P3=(i+1)*(Nv-1)+j+1 P4=(i+1)*(Nv-1)+j # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P4)) # Zaehler erhoehen zz=zz+1 # Laengsnaht schliessen for j in xrange(0,Nv-2): # Punkte fuer ein Quadrat definieren P1=j P2=j+1 P4=(Nv-1)*(Nu-1)+j P3=(Nv-1)*(Nu-1)+j+1 # Quadrat speichern obj.SetPolygon(zz, c4d.CPolygon(P4,P3,P2,P1)) # Zaehler erhoehen zz=zz+1 # Suedpol schliessen (Dreiecke setzen) for i in xrange(0,Nu-1): # Punkte fuer ein Dreieck definieren P1=Nu*(Nv-1)+1 P2=i*(Nv-1) P3=(i+1)*(Nv-1) # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P3)) # Zaehler erhoehen zz=zz+1; # Letztes Dreieck (Suedpol) setzen # Punkte fuer ein Dreieck definieren P1=Nu*(Nv-1)+1; P2=0; P3=(Nu-1)*(Nv-1); # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P3,P2,P1,P1)) # Zaehler erhoehen zz=zz+1; # Nordpol schliessen (Dreiecke setzen) for i in xrange(0,Nu-1): # Punkte fuer ein Dreieck definieren P1=Nu*(Nv-1) P2=(i+1)*(Nv-1)-1 P3=(i+2)*(Nv-1)-1 # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P3,P2,P1,P1)) # Zaehler erhoehen zz=zz+1; # Letztes Dreieck (Nordpol) setzen # Punkte fuer ein Dreieck definieren P1=Nu*(Nv-1) P2=Nv-2 P3=Nu*(Nv-1)-1 # Dreieck speichern obj.SetPolygon(zz, c4d.CPolygon(P1,P2,P3,P3)) # obj.Message(c4d.MSG_UPDATE) return obj def main(): plyobj = CreatePolygonObject() doc.InsertObject(plyobj, None, None, True) c4d.EventAdd() if __name__=='__main__': main()