/********************************************************************
Kakadu 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;
   // Alter Wert von x
      var xa;
   // Schleifenindex
      var i;
   // Name der Kugel
      var sphere;

// Eingabe der Variablen
   var dd = new(SimpleDialog);

   dd->SetTitle("Kakadu Attraktor");
   dd->SetData(0,"Konstante a",FIELD_FLOAT,0,10000,0.7);
   dd->SetData(1,"Konstante b",FIELD_FLOAT,0,1000,1.2);
   dd->SetData(2,"Konstante c",FIELD_FLOAT,0,1000,0.21);
   dd->SetData(3,"Anzahl Punkte N",FIELD_INTEGER,1,1000000,1000);
   dd->SetData(4,"Start x",FIELD_FLOAT,-10000,10000,1);
   dd->SetData(5,"Start y",FIELD_FLOAT,-10000,10000,1);
   dd->SetData(6,"Skalierungsfaktor",FIELD_FLOAT,0,10000,100);
   dd->SetData(7,"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 N=(dd->GetData(3));             // Anzahl Punkte N
   var x0=(dd->GetData(4));            // Startwert x
   var y0=(dd->GetData(5));            // Startwert y
   var Faktor=(dd->GetData(6));        // Skalierungsfaktor
   var Radius=(dd->GetData(7));        // Radius Kugel

// Leeres Objekt für den Kakadu Attraktor erzeugen
   var attraktor=doc->NewPolygonObject("Kakadu Attraktor",NULL,NULL,0,0,0,0);

// Berechnung des Attraktors
   // Startwerte übergeben
      xa=x0;
      y=y0;
   // Schleife durchlaufen
      for (i=0;i<N;i++)
          {
            // Neue Koordinaten berechnen
               x=y*(1+sin(a*xa))-b*sqrt(abs(xa));
               y=c-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,0));
               doc->MoveObject(Kugel,attraktor,NULL);
            // x Wert aktualisieren
               xa=x;
          }

// Objekt aktivieren
   doc->ActivateObject(attraktor);


// Refresh
   doc->SendMessage(DOCUMENT_CHANGED);


}

main()

{


RegisterMenuHook("Kakadu Attraktor","Function");

}
