/**************************************************************************/
/* 3D-Generator.c                                                         */
/* Version 1.0                                                            */
/*                                                                        */
/* Erzeugt ein von dem Programm 3-d.c weiterverarbeitbares File.          */
/* Dieses File Mandel.dat wird dann wie folgt verwendet:                  */
/*  3-d.run Mandel                                                        */
/*                                                                        */
/* fuer Markt+Technik geschrieben von Heiko Knappe                        */
/*                                                                        */
/* Komplexe Dynamische Systeme                                            */
/**************************************************************************/


#include <exec/types.h>
#include <math.h>
#include <stdio.h>
#include <libraries/dos.h>

#define N 10             /* Anzahl der Stuetzpunkte in x,y Richtung */
#define XRANGE .8
#define XOFF.4
#define YRANGE .8
#define YOFF.4
#define ZRANGE .8
#define ZOFF.4


int   n,nmax=100;            /* Iterationsschritte                  */
float emin=.001,emax=100000; /* Abbruchkriterium                    */
float rmin=-1.5,rmax=2.5;    /* Grenzen des Bildes                  */
float imin=-1.2,imax=1.2;
float rst,ist;
float re,im,re1,re2,im1,im2,cre,cim;
                             /* re,im laufender Re- und Im-Teil     */
                             /* re1,re2,im1,im2  -> Folgenglieder   */
float d;                     /* Abstand zu dem Bezugspunkt          */
int   i,j,k;
short land[N][N];            /* Feld mit den Punktwerten            */
char  name[]="Mandel.dat";
FILE  *file;


/***********************/
/* Hauptprogramm       */
/***********************/

main(argc,argv)
int argc;
char *argv[];
{
 if((argc!=2)&&(argc!=1))
 {
    printf("Eingabe: %s <nmax,rmin,rmax,imin,imax>\n",argv[0]);
    printf(" nmax: maximale Anzahl der Duerchlaeufe\n");
    printf(" [rmin,rmax] [imin,imax]: Wertebereich der Bildebene\n");
    exit(FALSE);
 }
 if(argc==2)
    if(sscanf(argv[1],"%d,%f,%f,%f,%f",&nmax,&rmin,&rmax,&imin,&imax)!=5)
    {
       printf("falsche Eingabe\n");
       exit(FALSE);
    }
 printf("\nParameter:\n emin=%f emax=%f\n",emin,emax);
 printf(" nmax=%d\n [%f,%f] [%f,%f]\n",nmax,rmin,rmax,imin,imax);
 emin*=emin;  /* mit dem Quadrat zu vergleichen erspart Wurzeln zu */
 emax*=emax;  /* berechnen -> Schnelligkeit                        */
 apfel();
 ausgabe();
}


/***********************/
/* Berechnung der      */
/* Stuetzpunkte        */
/***********************/

apfel()
{
 printf("Berechnung der Stuetzpunkte \n");
 rst=(rmax-rmin)/N;
 ist=(imax-imin)/N;
 for(i=0;i<N;++i) /* in x-Richtung */
 {
    re=rmin+i*rst;
    for(j=0;j<N;++j) /* in y-Richtung */
    {
       im=imin+j*ist;
       for(n=re1=im1=0,cre=re,cim=im;n<nmax;++n)
       {
          im2=2*re1*im1-cim,re2=re1*re1-im1*im1-cre;
          im1=im2,re1=re2;
          d=im1*im1+re1*re1;
          /* Ist der Attraktor erreicht?                       */
          if(d<emin)  break;
          /* Attraktor Unendlich?                              */
          if(d>emax)  break;
       }
       land[i][j]=n;
    }
 }
 printf("-> fertig\n");
}


/***********************/
/* Ausgabe             */
/***********************/

ausgabe()
{
 float fx,fy,fz;

 if((file=fopen(name,"w"))==0)
 {
    printf("Daten-File kann nicht geoeffnet werden!!\n");
    exit(FALSE);
 }
 /* Punkte abspeichern */
 for(i=0;i<N;++i)
 {
    for(j=0;j<N;++j)
    {
       fx=-.5+(float)1/(float)(N-1)*(float)i;
       fz=-.5+(float)1/(float)(N-1)*(float)j;
       fy=-.5+(float)1/(float)nmax*(float)land[i][j];
       fprintf(file,"P %f,%f,%f\n",fx,fy,fz);
    }
    fprintf(file,"\n");
 }
 /* Flaechen abspeichern */
 for(i=1;i<N;++i)
 {
    for(j=1;j<N;++j)
    {
       fprintf(file,"F %d,%d,%d\n",j+(i-1)*N,j+(i-1)*N+1,j+i*N+1);
       fprintf(file,"F %d,%d,%d\n",j+(i-1)*N+1,j+i*N+1,j+i*N);
    }
 }
 fclose(file);
}
