// [このプログラムの目的]カージオイドから // ハート形曲線への変換5, // 2009年04月14日(水) // カージオイドの方程式 R=a(1-sin t) 、 // かつ、x=r cos t, y=r sin t に於いて、 // 変換を施し、底を尖らせる。 // 最終的に,x=r*cos(f),y=r*sin(f)+p*abs(x) // を x-y座標に変換して、曲線を描かせる。 // file name: heart_curve_e.c #include< stdio.h> #include< math.h> void main(void) { double a,pi; // a は元のカージオイドの定数,pi は円周率 double t,dt; // 各々,変換前のカージオイドの位相角[rad], // および,位相角の変分[rad] double r,z; // それぞれ、変換後のカージオイドの // 曲座標の動径、位相角[ラジアン] double f; // さらに底を尖らせたカージオイドの // 位相角[ラジアン] float angle; // 目標とする底の尖った角度[度] float nb; // 縦方向に図形を圧縮するときの圧縮率[%] double alpha; // 角度 angle [度]から // 角度 alpha [ラジアン]に単位を変換する double b; // 縦方向に圧縮する圧縮係数 float p; // 修正関数の定数 double tmin,tmax; // 位相角の最小値と最大値[ラジアン] int i,imax; double x,y;// 修正前の直交座標 double xx[10001],yy[10001]; // メモリ容量の上限に注意 FILE *fp; // 定数設定 pi=3.14159265; a=1; // 他のパラメータ設定 printf("目標とする底の尖った角度の入力"); printf("0 < 180度 ;alpha[度]= ?"); scanf("%f",&angle); printf("\n"); alpha=pi*angle/180; printf("縦方向に圧縮する圧縮率の入力"); printf("(30〜100がよい); b[%] = ?"); scanf("%f",&nb); printf("\n"); b=1.0*nb/100; printf("修正関数の定数(0(3*pi/2-dt) && t<(3*pi/2+dt)) { r=0.; z=-pi/2; } else { if(t>(-pi/2-dt) && t<(-pi/2+dt)) { r=0.; z=pi/2; } else { r=a*sqrt((5-3*sin(t))*(1+sin(t))); z=asin(a*(1-sin(t))*cos(t)/r); } } f=-alpha*z/pi+pi/2; x=r*cos(f); xx[i]=x; y=b*r*sin(f); if(x>=0) { yy[i]=y+p*x; } else { yy[i]=y-p*x; } printf("i=%d,x=%f,y=%f\n",i,xx[i],yy[i]); } imax=i; // 計算データ[n角の星形曲線の(x,y)座標]を // text file (heart_curve_e.txt)に書き込む fp=fopen("heart_curve_e.txt","w"); if(fp==NULL) { printf("FILE OPEN ERROR\n"); } else { for(i=1;i<=imax;i++) { fprintf(fp,"%f,%f\n",xx[i],yy[i]); } fflush(fp); fclose(fp); } printf("end\n"); }// the end of the program