/******************************************************************** 3 Layer Attraktor Plugin für Cinema Version 8.0 (c) Jürgen Meier (Juergen-Meier@Hamburg.de) Version : 1.01 02.09.2003 *********************************************************************/ // Globale Variablen und Konstanten // Plugin ID Nummer const var cPluginID = 1012249; // Pluginname const var cPlugName = "3 Layer Attraktor"; // Pluginhilfstext const var cPlugHelp = "Erzeugt den 3 Layer Attraktor"; // Objektname const var cObjName = "3 Layer Attraktor"; // Index var i,j; // Koordinaten der Punkte var x,y,z; // Differenzen var dx,dy,dz; // Konstanten var a1=-4.1; var a2=1.2; var a3=13.45; var c1=2.76; var c2=0.6; var c3=13.13; var d=1.8; var b,c; // Delta var Delta=0.002; // Anzahl Iterationen var N=81500; var Ns=27000; // Startwerte var x0=0.0; var y0=0.0; var z0=0.0; // Alter Wert var xa,ya,za; // Abstand zwischen 2 Punkten var PP; var Abstand=0.05; // Skalierungsfaktor var FaktorX=200; var FaktorY=100; var FaktorZ=250; // Breite des Menütextes var Breite=150; // Maximalwerte var cMaxFloat=1000000; var cMaxInt=100000000; // Objektvariable var qObj; // Dialogvariable var gDial; // ****************************************************************** // Funktion zum Objekt aktivieren (c) h.g.seib // ****************************************************************** fSetActiveObject(vDoc,vObj) { // Aktives Objekt ermitteln var vAObj = GetActiveObject(vDoc); // Active object Bit bzw. Flag setzen if (vAObj) vAObj->DelBit(BIT_AOBJ); vObj->SetBit(BIT_AOBJ); // Änderung im Dokument bekanngeben (neues Objekt selektiert) GeEventAdd(NEW_ACTIVE_OBJECT); } // ****************************************************************** // Funktion zur Berechnung des Attraktors fAttraktor(vDoc) { // Variablen deklarieren // Felder für die Punkte des Attraktors var vPointAry; // Variable für VariableChanged und BackupTag deklarieren var vVarChanged,vBackupTags; // Neues Splineobjekt erzeugen und Namen zuweisen qObj=new(SplineObject); if (!qObj) return FALSE; qObj->SetName(cObjName); // Undo Funktion aktivieren vDoc->StartUndo(); vDoc->AddUndo(UNDO_OBJECT_NEW,qObj); vDoc->EndUndo(); // Variable für VariableChanged und BackupTag erzeugen vVarChanged = new(VariableChanged); vBackupTags = new(BackupTags); // Feld für die Punkte erzeugen vPointAry = new(array,N); // Feld für die Punkte dem Splineobjekt zuordnen qObj->SetPoints(vPointAry); // ??? vBackupTags->Init(qObj); vVarChanged->Init(0,N); // Message der Klasse BaseList2D if (!qObj->Message(MSG_POINTS_CHANGED, vVarChanged)) { vBackupTags->Restore(); return FALSE; } // Objekt in der Dokumenthierarchie positionieren vDoc->InsertObject(qObj,NULL,NULL); fSetActiveObject(vDoc,qObj); GeEventAdd(DOCUMENT_CHANGED); // Variable für den Container (Klasse BaseContainer) var vContainer = qObj->GetContainer(); // Spline Typ festlegen vContainer->SetData(SPLINEOBJECT_TYPE,3); // Containerdaten dem Spline Objekt zurückgeben qObj->SetContainer(vContainer); // Punkte des Attraktors berechnen // Startwerte übergeben x=x0; y=y0; z=z0; xa=x0; ya=y0; za=z0; // Konstanten berechnen b=((d*a2*a2*c3*c3)/(32*a3*a3*c2*c2))*sqrt((-a3*c2)/(a1*c1)); c=((a2*a2*c3*c3)/(4*a3*c2) - (a3*c1 + a1*c2)*b/d)/a2; // Schleife durchlaufen j=0; for (i=0;i Ns) { if (PP > Abstand) { qObj->SetPoint(j,vector(x*FaktorX,z*FaktorY,y*FaktorZ)); j=j+1; xa=x; ya=y; za=z; } } } return TRUE; } // ****************************************************************** // Ableitung der Klasse MyDialog von GeDialog // ****************************************************************** class MyDialog : GeDialog { public: MyDialog(); CreateLayout(); Init(); CoreMessage(vID,vMSG); Command(vID,vMSG); } // ****************************************************************** // Deklaration des Konstruktors MyDialog::MyDialog() { // Konstruktor der parent class aufrufen super(cPluginID); } // ****************************************************************** // Deklaration der Methode CreateLayout MyDialog::CreateLayout() { // Plugintitel setzen SetTitle(cPlugName); // Gruppe für die Konstanten AddGroupBeginV(1000,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Konstante a1",0); AddEditNumber(2100,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante a2",0); AddEditNumber(2101,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante a3",0); AddEditNumber(2102,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante c1",0); AddEditNumber(2103,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante c2",0); AddEditNumber(2104,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante c3",0); AddEditNumber(2105,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Konstante d",0); AddEditNumber(2106,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Gruppe für die Startwerte AddGroupBeginV(1001,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Start x",0); AddEditNumber(2003,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Start y",0); AddEditNumber(2004,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Start z",0); AddEditNumber(2005,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Gruppe für die Parameter der Iteration AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Delta",0); AddEditNumber(2006,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Anzahl N Start",0); AddEditNumber(2009,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Anzahl N",0); AddEditNumber(2007,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Abstand",0); AddEditNumber(2010,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Faktor x",0); AddEditNumber(2008,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Faktor y",0); AddEditNumber(2011,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Faktor z",0); AddEditNumber(2012,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Button für den Start der Berechnung AddButton (3000,BFH_CENTER,200,0,"Start"); return TRUE; } // ****************************************************************** // Deklaration der Methode Init MyDialog::Init() { // Startwerte setzen SetFloat(2100,a1,-cMaxFloat,cMaxFloat,0); SetFloat(2101,a2,-cMaxFloat,cMaxFloat,0); SetFloat(2102,a3,-cMaxFloat,cMaxFloat,0); SetFloat(2103,c1,-cMaxFloat,cMaxFloat,0); SetFloat(2104,c2,-cMaxFloat,cMaxFloat,0); SetFloat(2105,c3,-cMaxFloat,cMaxFloat,0); SetFloat(2106,d,-cMaxFloat,cMaxFloat,0); SetFloat(2003,x0,-cMaxFloat,cMaxFloat,0); SetFloat(2004,y0,-cMaxFloat,cMaxFloat,0); SetFloat(2005,z0,-cMaxFloat,cMaxFloat,0); SetFloat(2006,Delta,-cMaxFloat,cMaxFloat,0); SetInt(2007,N,0,cMaxInt,0); SetInt(2008,FaktorX,0,cMaxInt,0); SetInt(2009,Ns,0,cMaxInt,0); SetFloat(2010,Abstand,0,cMaxFloat,0); SetInt(2011,FaktorY,0,cMaxInt,0); SetInt(2012,FaktorZ,0,cMaxInt,0); return TRUE; } // ****************************************************************** // Deklaration der Methode CoreMessage MyDialog::CoreMessage(vID,vMSG) { switch (vID) { case NEW_DOCUMENT: case DOCUMENT_CHANGED: case NEW_ACTIVE_OBJECT: case ACTIVE_OBJECT_CHANGED: return TRUE; break; } return FALSE; } // ****************************************************************** // Deklaration der Methode Command MyDialog::Command(vID,vMSG) { var vDoc; // StopAllThreads(); switch (vID) { case 3000 : // Start Button gedrückt { vDoc = GetActiveDocument(); if (!vDoc) return FALSE; fAttraktor(vDoc); } case 2100 : a1=GetFloat(2100); case 2101 : a2=GetFloat(2101); case 2102 : a3=GetFloat(2102); case 2103 : c1=GetFloat(2103); case 2104 : c2=GetFloat(2104); case 2105 : c3=GetFloat(2105); case 2106 : d=GetFloat(2106); case 2003 : x0=GetFloat(2003); case 2004 : y0=GetFloat(2004); case 2005 : z0=GetFloat(2005); case 2006 : Delta=GetFloat(2006); case 2007 : N=GetInt(2007); case 2008 : FaktorX=GetInt(2008); case 2009 : Ns=GetInt(2009); case 2010 : Abstand=GetFloat(2010); case 2011 : FaktorY=GetInt(2011); case 2012 : FaktorZ=GetInt(2012); } return TRUE; } // ****************************************************************** // Ableitung der Klasse MyMenuPlugin von MenuPlugin // ****************************************************************** class MyMenuPlugin : MenuPlugin { public: MyMenuPlugin(); GetID(); GetName(); GetHelp(); Execute(doc); RestoreLayout(secret); } // ****************************************************************** // Deklaration des Konstruktors MyMenuPlugin::MyMenuPlugin() { super(); } // ****************************************************************** // Deklaration der Methode GetID MyMenuPlugin::GetID() { return cPluginID; } // ****************************************************************** // Deklaration der Methode GetName MyMenuPlugin::GetName() { return cPlugName; } // ****************************************************************** // Deklaration der Methode GetHelp MyMenuPlugin::GetHelp() { return cPlugHelp; } // ****************************************************************** // Deklaration der Methode Execute MyMenuPlugin::Execute(doc) { if (!gDial) gDial=new(MyDialog); gDial->Open(TRUE,-1,-1); } // ****************************************************************** // Deklaration der Methode RestoreLayout MyMenuPlugin::RestoreLayout(secret) { if (!gDial) gDial=new(MyDialog); gDial->RestoreLayout(secret); } // ****************************************************************** main() { Register(MyMenuPlugin); }