/********************************************************************
Lorenz I Attraktor
(c) Jürgen Meier (J.Meier@Dialup.Nacamar.de)
Version : 1.00
20.07.2001
*********************************************************************/


Function (doc)
{

// Variablen deklarieren
   // Spline Punkt deklarieren
      var spunkt=new(SplinePoint);
   // Koordinaten der Punkte
      var x,y,z;
   // Differenzen
      var dx,dy,dz;
   // Hilfsvariable
      var h;
   // Schleifenindex
      var i;


// Eingabe der Variablen
   var d = new(SimpleDialog);

   d->SetTitle("Lorenz I Attraktor");
   d->SetData(0,"Konstante a",FIELD_FLOAT,0,10000,10);
   d->SetData(1,"Konstante b",FIELD_FLOAT,0,1000,28);
   d->SetData(2,"Konstante c",FIELD_FLOAT,0,1000,6);
   d->SetData(3,"Delta",FIELD_FLOAT,0,1000,0.01);
   d->SetData(4,"Anzahl Punkte N",FIELD_INTEGER,1,1000000,1000);
   d->SetData(5,"Start x",FIELD_FLOAT,-10000,10000,1);
   d->SetData(6,"Start y",FIELD_FLOAT,-10000,10000,1);
   d->SetData(7,"Start z",FIELD_FLOAT,-10000,10000,1);
   d->SetData(8,"Skalierungsfaktor",FIELD_FLOAT,0,10000,0.4);


   if (!d->DoDialog()) return FALSE;
   var a=(d->GetData(0));             // Konstante A
   var b=(d->GetData(1));             // Konstante B
   var c=(d->GetData(2));             // Konstante C
   var Delta=(d->GetData(3));         // Delta
   var N=(d->GetData(4));             // Anzahl Punkte N
   var x0=(d->GetData(5));            // Startwert x
   var y0=(d->GetData(6));            // Startwert y
   var z0=(d->GetData(7));            // Startwert z
   var Faktor=(d->GetData(8));        // Skalierungsfaktor


  // Neues Splineobjekt für den Lorenz I Attraktor erzeugen
     var Lorenz = doc->NewSplineObject("Lorenz I Attraktor",NULL,NULL,N);
  // Spline Info für das Spline Objekt definieren
     var spinfo=new(SplineInfo);
  // Spline schließen
     spinfo->closed=FALSE;
  // Spline Typ definieren
     spinfo->type=SPL_BSPLINE;
  // Spline Info setzen
     Lorenz->SetSplineInfo(spinfo);
  // Berechnung des Attraktors
     // Startwerte übergeben
        x=x0;
        y=y0;
        z=z0;
     // Schleife durchlaufen
        for (i=0;i<N;i++)
            {
              // Hilfsvariable
                 h=sqrt(x*x+y*y);
              // Delta Werte berechnen
                 dx = (-a-1)*x + (a-b)*y+ (1-a)*h + y*z;
                 dy = (b-a)*x - (a+1)*y+ (b+a)*h - x*z - h*z;
                 dz = y/2 - c*z;
              // Neue Koordinaten berechnen
                 x=x + Delta * dx;
                 y=y + Delta * dy;
                 z=z + Delta * dz;
              // Punkt setzen
                 spunkt->p = vector(x*Faktor,z*Faktor,y*Faktor);
                 Lorenz->SetPoint(i,spunkt);
            }
  // Update
     Lorenz->UpdateObject();


// Objekt aktivieren
   doc->ActivateObject(Lorenz);


// Refresh
   doc->SendMessage(DOCUMENT_CHANGED);


}

main()

{


RegisterMenuHook("Lorenz I Attraktor","Function");

}
