// ランダムドット

#include "stdafx.h"

#include "stdlib.h"

#include "math.h"

#define frand() ((double)rand()/(RAND_MAX+1))

int SelectedID;

FILE *fstream;

double SinR_dev_R(double X, double Y)

{             double R = sqrt(X*X+Y*Y);

              if(R<=0.0000001) return 1.0;

              return sin(R)/R;

}

double HalfBall(double X, double Y)

{             double R =sqrt(X*X+Y*Y);

              if(R>5) return -1.0;

              else{

                            R=R/5;

                            return sqrt(1-R*R)-1;

              }

}

double Cylinder(double X, double Y)

{             double R = fabs(X);

              if(R>5) return -1.0;

              else R=R/5;

              return sqrt(1-R*R)-1;

}

double Pyramid(double X, double Y)

{             double XX = fabs(X);

              double R = fabs(Y);

              if(XX>R) R=XX;

              if(R>5) return -1;

              else R=R/2.5;

              return 1 - R;

}

double fmod(double D, double M)

{

              return D- (int)(D/M)*M;

}

double UpperLowerOpen(double X, double Y)

{

              double R = sqrt(X*X+Y*Y);

              if(R>=10) return 0;

              else if (fmod(R, 4.0)>2.0) return Y/10;

              else return -Y/10;

}

double HyperbolicParabola(double X, double Y)

{             return (X*X-Y*Y)/50;

}

double QuadraticBell(double X, double Y)

{             return 1- sqrt(X*X+Y*Y)/5;

}

double Cross(double X, double Y)

{             double XX=fabs(X) ;  double YY=fabs(Y);

              if     (XX>5 || YY>5) return -1;

              else if(XX<1 || YY<1) return 1;

              else                  return -1;

}

double Def_Exp(double X, double Y)

{             double XX=X/5 ;  double YY=Y/5;

              double R=XX*XX+YY*YY;

              return (XX-YY) *exp(-R);

}

double mult_R(double X, double Y)

{             double XX=fmod(X,4)-2 ;  double YY=fmod(Y,4)-2;

              double R=sqrt(XX*XX+YY*YY);

              if (R>1) return 0;

              else return sqrt(1-R*R);

}

double func10(double X, double Y)

{             return (cos(X/1.5)+sin(Y/1.5))/2;

}

double func11(double X, double Y)

{             double XX=X/3 ;  double YY=Y/3;

    if( XX>0) XX=-XX;

              if(YY>0)  YY=-YY;

    return exp(XX+YY)*2-1;

}

double funCall(double X, double Y)

{             int ID=SelectedID;

              switch(ID)

              {             case 0:return SinR_dev_R(X,Y);

                            case 1:return HalfBall(X,Y);

                            case 2:return Cylinder(X,Y);

                            case 3:return Pyramid(X,Y);

                            case 4:return UpperLowerOpen(X,Y);

                            case 5:return HyperbolicParabola(X,Y);

                            case 6:return QuadraticBell(X,Y);

                            case 7:return Cross(X,Y);

                            case 8:return Def_Exp(X,Y);

                            case 9:return mult_R(X,Y);

                            case 10:return func10(X,Y);

                            case 11:return func11(X,Y);

              }

    return 0;

}

void DisplayDot()

{             double X1 = -12;  double X2 =  12;

              double Y1 =  10; double Y2 = -10;

              double R0 = 0.2;

              double UNIT = 6;              double XY =1; int Loop=3000;

              double Period=(X2-X1)/6;

              double Z0=R0*Period;double RD;

              double R, X, Y, Z;

              float XX=(float)(Period/6.0);

              float YY=(float)(Y1*1.1);

              fprintf(fstream,"""Circle"", %f, %f, 0.1, 0\n",-XX,YY);

              fprintf(fstream,"""Circle"", %f, %f, 0.1, 0\n",XX,YY);

    RD = frand();

              for(int i=0;i<Loop;i++)

              {             R=frand();

                            Y=R*(Y2-Y1)+Y1;

                            Z=funCall(X1,Y);

                            R=frand();

                            X=(Period + fabs(Z0*Z))*R+X1;

                            while(X<=X2)

                            {             fprintf(fstream,"""Line"", %f, %f, %f, %f, 0, ""BF""\n",

                                                            X-0.02,Y-0.02,X+0.02,Y+0.02);

                                          Z = funCall(X + Period * 0.5, Y);

                                          X = X + Period - XY * Z0 * Z;

                            }

              }

}

void window(double X1, double Y1, double X2, double Y2)

{             fprintf(fstream,"""Window"",%f, %f, %f, %f\n",X1,Y1,X2,Y2);

}

int main(int argc, char* argv[])

{

              while(1){

                            printf("Input Process No.\n");

                            printf("  0:sin(R)/R, 1:半球,  2:円筒,    3:ピラミッド\n");

                            printf("  4:上下開き, 5:双曲放物面,       6:二次錘面\n");

                            printf("  7:十字, 8:(x-y)exp(-(x*x+y*y)), 9:繰返し\n");

                            printf(" 10:cos(x)+sin(y),  11:exp(-(abs(x)+abs(y))\n");

                  scanf("%d",&SelectedID);

                            fstream=fopen("c:\\data3.txt","w");

                            window(-12*1.2, 12*1.4, 10*1.4,-10*1.4);

                            DisplayDot();

                            fprintf(fstream,"""Line"",-12, -10,12, 10,0,""B""\n");

                            fclose(fstream);

              }

             

              return 0;

}