/******************************************************************** Klein Bottle Plugin für Cinema 4D Version 5 (c) Jürgen Meier (www.3d-meier.de) Version : 1.01 11.02.2004 *********************************************************************/ Function(doc) { // Variablen deklarieren var i,j, // Indizes für die Schleifen zz, // Zähler r, // Hilfsvariable für die Berechnung u, // Parameter für die Fläche v, // Parameter für die Fläche du, // Segmentbreite u dv, // Segmentbreite v Nv, // Anzahl Unterteilungen v x, // x Koordinate eines Punktes y, // y Koordinate eines Punktes z, // z Koordinate eines Punktes SP, // Anzahl Punkte des Polygonobjektes SK, // Anzahl Kanten des Polygonobjektes SQ, // Anzahl Quadrate des Polygonobjektes P1,P2,P3,P4; // Punkte für ein Quadrat // Eingabe der Variablen var d = new(SimpleDialog); d->SetTitle("Klein Bottle"); d->SetData(0,"Konstante a",FIELD_FLOAT,0,1000,6); d->SetData(1,"Konstante b",FIELD_FLOAT,0,1000,16); d->SetData(2,"Skalierungsfaktor",FIELD_FLOAT,1,10000,10); d->SetData(3,"Nu",FIELD_INTEGER,1,1000,75); d->SetData(4,"Nv/2",FIELD_INTEGER,1,1000,20); if (!d->DoDialog()) return FALSE; var a=(d->GetData(0)); // Konstante a var b=(d->GetData(1)); // Konstante b var f=(d->GetData(2)); // Skalierungsfaktor var Nu=(d->GetData(3)); // Anzahl Unterteilungen u var Nv05=(d->GetData(4)); // Anzahl Unterteilungen v // Anzahl Unterteilungen v berechnen, so wird sichergestellt das Nv eine // gerade Zahl ist Nv=Nv05+Nv05; // Feld für die Indizes der Phasenverschiebung des letzten Segments // Feld erzeugen var Feld = new(array,Nv); // Zähler zurücksetzen zz=0; // Indizes berechnen for (j=0;jNewPolygonObject("Klein Bottle",NULL,NULL,SP,SK,0,SQ); // Punkte des Polygonobjektes berechnen // Zähler zurücksetzen zz=0; // Parameterbereich durchlaufen for (i=0;iSetPoint(zz, vector(x,y,z)); // Zähler erhöhen zz=zz+1; } } // Linien setzen // Zähler zurücksetzen zz=0; // Linien quer for (i=0;iSetEdge(zz, i*Nv+j, i*Nv+j+1); // Zähler erhöhen zz=zz+1; } // Letzte Linie setzen (Kreis schließen) // Linie speichern M->SetEdge(zz,i*Nv+Nv-1,i*Nv); // Zähler erhöhen zz=zz+1; } // Linien längs for (j=0;jSetEdge(zz, i*Nv+j,(i+1)*Nv+j); // Zähler erhöhen zz=zz+1; } // Letzte Linie setzen (Kreis schließen) // Linien speichern M->SetEdge(zz,(Nu-1)*Nv+j,Feld[j]); // Zähler erhöhen zz=zz+1; } // Quadrate setzen // Zähler zurücksetzen zz=0; for (j=0;jSetQuadrangle(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; } } // Längsnaht schließen for (i=0;iSetQuadrangle(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; } // Letztes Quadrat der Längsnaht // Punkte für das Quadrat definieren P1=Nv*Nu-1; P2=Feld[Nv-1]; P3=Feld[0]; P4=Nv*(Nu-1); // Quadrat speichern M->SetQuadrangle(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; // Quernaht schließen for (j=0;jSetQuadrangle(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; } // Update M->UpdateObject(); // Objekt aktivieren doc->ActivateObject(M); // Refresh doc->SendMessage(DOCUMENT_CHANGED); } main() { RegisterMenuHook("Klein Bottle","Function"); }