/*****
** Duesseldorf, den 10.4.1995.
** createsample.C: 
** Berechnung von zufaelligen Beispielen fuer den chull-Algorithmus. 
** Aufruf: "cs <l> <n|i> <x0> <x1> <y0> <y1>"
** mit l..Anzahl der Punkte, 
** n|i..n->normale float-Zufallszahlen, i->Nicht darstellbare Punkte werden
**      mit Hilfe von Intervallarithmetik durch 4 Punkte ersetzt.
** x0,x1,y0,y1..Der Bereich aus dem die Zufallszahlen gewaehlt werden.
** Die Ausgabe erfolgt auf stdout im binaerformat!.
*****/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "interval.h"


int main(int al, char **a)
{
 double x0=1e5,x1=1.00001e5,y0=-1,y1=1,d1,d2;
 int i,m=1,n=20,j,f1,f2;
 double x,y,alpha,z1,z2;
 float fx,fy;
 FILE *f,*g;
 char c[1000],ac;
 interval Ix,Iy;
 
//** Verhindern ,dass immer die gleichen Zufallszahlen erzeugt werden.
 if ( (f=fopen(".crs.rnd","rt"))!=NULL )
 {
  m= atoi(fgets(c,900,f));
  fclose(f);
  for (i=0;i<m;i++) drand48();
 }

//** Auswertung der Parameter.
 if (al>1) n= atoi(*(a+1));
 ac='n';
 if (al>2) ac= **(a+2);
 if (al>6)
 {
  x0= atof(*(a+3));
  x1= atof(*(a+4));
  y0= atof(*(a+5));
  y1= atof(*(a+6));
 }

//** Berechnen der Beispiele:
 switch(ac)
 {
  case 'n': //** normale Zufallszahlen.
   fwrite(&n,1,sizeof(int),stdout);
   for (i=0;i<n;i++)
   {
    fx= drand48()*(x1-x0)+x0;
    fy= drand48()*(y1-y0)+y0;
    fwrite(&fx,1,sizeof(float),stdout);
    fwrite(&fy,1,sizeof(float),stdout);
   }
   break;
  case 'i': //** Intervalleinschliessung.
   j=4*n;
   fwrite(&j,1,sizeof(int),stdout);
   for (i=0;i<n;i++)
   {
    do
    {
     f1= abs(random())+1;
     f2= abs(random())+1;
     Ix= interval(f1)/interval(f2);
    } while (Ix.Inf()<x0 || Ix.Inf()>x1);
    do
    {
     f1= abs(random())+1;
     f2= abs(random())+1;
     Iy= interval(f1)/interval(f2);
    } while (Iy.Inf()<y0 || Iy.Inf()>y1);
    fx= Ix.inf;
    fy= Iy.inf;
    fwrite(&fx,1,sizeof(float),stdout);
    fwrite(&fy,1,sizeof(float),stdout);
    fx= Ix.inf;
    fy= Iy.sup;
    fwrite(&fx,1,sizeof(float),stdout);
    fwrite(&fy,1,sizeof(float),stdout);
    fx= Ix.sup;
    fy= Iy.sup;
    fwrite(&fx,1,sizeof(float),stdout);
    fwrite(&fy,1,sizeof(float),stdout);
    fx= Ix.sup;
    fy= Iy.inf;
    fwrite(&fx,1,sizeof(float),stdout);
    fwrite(&fy,1,sizeof(float),stdout);
   }
   break;
 }

//** Verhindern, dass immer die gleichen Zahlen generiert werden.
 m=(m*7+1)%100000;
 f= fopen(".crs.rnd","wt");
 fprintf(f,"%i\n",m);
 fclose(f);
} 
