/********************************************************************
Pickover Attraktor
(c) Jürgen Meier (J.Meier@Dialup.Nacamar.de)
Version : 1.00
20.07.2001
*********************************************************************/


Function (doc)
{

// Variablen deklarieren
   // Koordinaten der Punkte
      var x,y,z;
   // Alter Wert von x
      var xa;
   // Schleifenindex
      var i;
   // Name der Kugel
      var sphere;

// Eingabe der Variablen
   var dd = new(SimpleDialog);

   dd->SetTitle("Pickover Attraktor");
   dd->SetData(0,"Konstante a",FIELD_FLOAT,-1000,1000,2.24);
   dd->SetData(1,"Konstante b",FIELD_FLOAT,-1000,1000,0.43);
   dd->SetData(2,"Konstante c",FIELD_FLOAT,-1000,1000,-0.65);
   dd->SetData(3,"Konstante d",FIELD_FLOAT,-1000,1000,-2.43);
   dd->SetData(4,"Anzahl Punkte N",FIELD_INTEGER,1,1000000,1000);
   dd->SetData(5,"Start x",FIELD_FLOAT,-10000,10000,0.0);
   dd->SetData(6,"Start y",FIELD_FLOAT,-10000,10000,0.2);
   dd->SetData(7,"Start z",FIELD_FLOAT,-10000,10000,0.3);
   dd->SetData(8,"Skalierungsfaktor",FIELD_FLOAT,0,10000,100);
   dd->SetData(9,"Radius Kugel",FIELD_FLOAT,0,1000,0.1);


   if (!dd->DoDialog()) return FALSE;
   var a=(dd->GetData(0));             // Konstante a
   var b=(dd->GetData(1));             // Konstante b
   var c=(dd->GetData(2));             // Konstante c
   var d=(dd->GetData(3));             // Konstante d
   var N=(dd->GetData(4));             // Anzahl Punkte N
   var x0=(dd->GetData(5));            // Startwert x
   var y0=(dd->GetData(6));            // Startwert y
   var z0=(dd->GetData(7));            // Startwert z
   var Faktor=(dd->GetData(8));        // Skalierungsfaktor
   var Radius=(dd->GetData(9));        // Radius Kugel

// Leeres Objekt für den Pickover Attraktor erzeugen
   var attraktor=doc->NewPolygonObject("Pickover Attraktor",NULL,NULL,0,0,0,0);

// Berechnung des Attraktors
   // Startwerte übergeben
      xa=x0;
      y=y0;
      z=z0;
   // Schleife durchlaufen
      for (i=0;i<N;i++)
          {
            // Neue Koordinaten berechnen
               x = sin(a*y)-z*cos(b*xa);
               y = z*sin(c*xa)-cos(d*y);
               z = sin(xa);
            // Name für die Kugel erzeugen;
               sphere=stradd("sphere",tostring(i));
            // Kugel erzeugen
               var Kugel = doc->NewObject(sphere,NULL,NULL,OBJECT_SPHERE);
               Kugel->SetRadius(Radius);
               Kugel->SetPosition(vector(x*Faktor,y*Faktor,z*Faktor));
               doc->MoveObject(Kugel,attraktor,NULL);
            // x Wert aktualisieren
               xa=x;
          }

// Objekt aktivieren
   doc->ActivateObject(attraktor);


// Refresh
   doc->SendMessage(DOCUMENT_CHANGED);


}

main()

{


RegisterMenuHook("Pickover Attraktor","Function");

}
