/********************************************************************
Tinkerbell 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 d = new(SimpleDialog);

   d->SetTitle("Tinkerbell Attraktor");
   d->SetData(0,"Konstante a",FIELD_FLOAT,0,10000,0.9);
   d->SetData(1,"Konstante b",FIELD_FLOAT,0,1000,0.6013);
   d->SetData(2,"Anzahl Punkte N",FIELD_INTEGER,1,1000000,5000);
   d->SetData(3,"Radius Kugel",FIELD_FLOAT,0,1000,0.25);
   d->SetData(4,"Start x",FIELD_FLOAT,-10000,10000,0.1);
   d->SetData(5,"Start y",FIELD_FLOAT,-10000,10000,0.0);
   d->SetData(6,"Skalierungsfaktor",FIELD_FLOAT,0,10000,100);


   if (!d->DoDialog()) return FALSE;
   var a=(d->GetData(0));             // Konstante a
   var b=(d->GetData(1));             // Konstante b
   var N=(d->GetData(2));             // Anzahl Punkte N
   var Radius=(d->GetData(3));        // Radius Kugel
   var x0=(d->GetData(4));            // Startwert x
   var y0=(d->GetData(5));            // Startwert y
   var Faktor=(d->GetData(6));        // Skalierungsfaktor

// Leeres Objekt für den Tinkerbell Attraktor erzeugen
   var attraktor=doc->NewPolygonObject("Tinkerbell 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= xa*xa - y*y + a* xa + b *y;
               y=2*xa * y - 2*xa + 0.5 *y;
            // 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("Tinkerbell Attraktor","Function");

}
