// ランダムドット
#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;
}