// [このプログラムの目的]先端が尖り、付け根がくびれた花びらの花の形を描く flower_y1,2013年6月17日(金)



// file name: flower_y1.c



#include< stdio.h>

#include< math.h>



void main(void)

{

	double a,pi;// pi は円周率

	double r;// 花びらの元の図形の動径

	double q1,q2,b;// 花びらの元の図形の変形の度合いを与える定数

	double f,df;// 花びらの元の図形に関する媒介変数、および、その変分

	double fmin,fmax;// f の最小値と最大値

	int nf;// f の分割数

	double x,y;// 花びらの元の図形の直交座標



	double rr,ff;// 仮の花びらの動径と位相角



	int n;// 花びらの数

	double d;// 花びらを縦方向に伸縮する伸縮率

	double k;// 花びらの角度を広げる



	double e,p;// 花びらの土台となる中心円の半径と位相角

	double dp;// p の変分

	double beta;// 1個の花びらが中心円の周囲を占有する角度範囲

	double l;// 1個の花びらが土台となる中心円の周囲を占有する角度に対する補正係数(ただし、0 < l )

	double dbeta;// beta の変分



	double xx,yy,rrr,fff;// 仲介変数

	double xxx[20001],yyy[20001];// メモリ容量の上限に注意



	int i,imax,j;

	int m;// 1個の花びらが土台となる芯円の周囲を占有する角度 beta の変分 dbeta のカウント数



	FILE *fp;



//  定数設定

	pi=3.14159265;



	a=1;//    a=1

	q1=1;//   q1=1

	q2=2;//   q2=2

	b=0.1;//  b=0.1

	d=8;//    d=8

	e=0.0;//  e=0

	k=1;//    k=1

	l=0.2;//  l=0.2



	printf("花びらの数を自然数で入力. \n n=? ");

	scanf("%d",&n);

	printf("n=%d\n",n);

	printf("\n");



	beta=2*pi/n;// 1個の花びらが土台となる芯円の周囲を占有する基本的な角度

	beta=l*beta;// beta の補正された角度



//  他のパラメータ設定

	fmin=-pi/2;

	fmax=3*pi/2;



	nf=100;



	df=(fmax-fmin)/nf;// 変換前の位相角 f のプロット間隔

	dbeta=beta/nf;// beta の 変分



	dp=2*pi/n/100;



	i=0;



// 主計算

	for(j=1;j<=n;j++) // n個の花びらを掃引

	{

		m=0;



		for(f=fmin;f< fmax;f=f+df) //  1個の花びらを通過する位相角 f の掃引

		{

			i++;

			m++;



			r=(a/(1+(1/q1)*(sqrt(fabs(sin(f/2-pi/4))))))/(1+(1/q2)*sqrt(fabs(sin(f/2+pi/4))));// 花びらの元の図形の動径



			x=r*cos(f);// 花びらの元の図形の直交座標

			y=b*r*sin(f)+b*(a/(1+(1/q1)));// 花びらの元の図形の直交座標



			rr=sqrt(x*x+y*y);// 元の図形から作られた花びらの動径の計算



			if(x==0)// 元の図形から作られた花びらの位相の計算

			{

				ff=pi/2;

			}

			else

			{

				if(x>0)

				{

					ff=asin(y/rr);

				}

				else

				{

					ff=pi-asin(y/rr);

				}

			}



			ff=k*(ff-pi/2)+pi/2;// 花びらの角度を広げる



			xx=rr*cos(ff);

			yy=d*rr*sin(ff);



			rrr=sqrt(xx*xx+yy*yy);// 元の図形から作られた花びらの動径の計算





			if(xx==0)// 元の図形から作られた花びらの位相の計算

			{

				fff=pi/2;

			}

			else

			{

				if(xx>0)

				{

					fff=asin(yy/rrr);

				}

				else

				{

					fff=pi-asin(yy/rrr);

				}

			}





			fff=fff+2*pi*(j-1)/n;// j 番目の花びらの位相角



			xxx[i]=rrr*cos(fff)+e*cos(2*pi*(j-1)/n+pi/2-beta/2+m*dbeta);

			yyy[i]=rrr*sin(fff)+e*sin(2*pi*(j-1)/n+pi/2-beta/2+m*dbeta);



			printf("i=%d,x=%f,y=%f\n",i,xxx[i],yyy[i]);

		}



		if(l<=1)

		{

			for(p=2*pi*(j-1)/n+pi/2+beta/2;p< 2*pi*j/n+pi/2-beta/2+0;p=p+dp)

			{

				i++;



				xxx[i]=e*cos(p);

				yyy[i]=e*sin(p);



				printf("i=%d,x=%f,y=%f\n",i,xxx[i],yyy[i]);

			}

		}

		else

		{

			for(p=2*pi*(j-1)/n+pi/2+beta/2;p>2*pi*j/n+pi/2-beta/2-0;p=p-dp)

			{

				i++;



				xxx[i]=e*cos(p);

				yyy[i]=e*sin(p);



				printf("i=%d,x=%f,y=%f\n",i,xxx[i],yyy[i]);

			}

		}

	}



	i++;

	xxx[i]=xxx[1];// 更に、始めと終わりの隙間を埋めるための保存

	yyy[i]=yyy[1];



	imax=i;



// 計算データ[n 個の花びらをもつ花の形の(x,y)座標]をテキストファイル(flower_y1.txt)に書き込む

	fp=fopen("flower_y1.txt","w");

	if(fp==NULL)

	{

		printf("FILE OPEN ERROR\n");

	}

	else

	{

		for(i=1;i<=imax;i++)

		{

			fprintf(fp,"%f,%f\n",xxx[i],yyy[i]);

		}

		fflush(fp);

		fclose(fp);

	}

	printf("end\n");

}// the end of the program





戻る