↑クリックで画像が拡大します↑
意外な例をもう一つ。
簡単そうに見えて実はとても難しいのが「☆」なんです。
☆は書くのに当時とても苦労しました。
大学1年の時、☆って書いたらどんなプログラムになるんだろう?と疑問に思ったんことがあるんで
書いてみた事があります。
☆って直線のあつまりだから簡単そうに思えますが
では実際どんな方程式の集まりか?といわれたらぱっと答えにくいですよね。
まず☆に外接する円を描きます。
その円のπ/2をθ=0°として2*π/5ずつ中心から直線を描き、その直線と円の交点をそれぞれ結んだ直線の集まりが
☆なんです。
しかも塗りつぶそうと思ったら不等式を作って定義域を作って・・、かなり複雑になります。
☆を描くプログラムを示します。
昔に書いたプログラムなんでおかしい所沢山ありますけどそこはスルーで^^;
http://dixq.net/board/program/hoshi.c
(文字化けする時はメニューの「表示」>「エンコード」>「日本語(自動選択)」を指定してください)
もし参考になれば幸いです。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int hantei( int y, int x, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5, double y5, double y8, double y9, int r ){
if(y1 < y && y < y2)
if( y<(y4-y2)*(x-x2)/(x4-x2)+y2 && y<(y5-y2)*(x-x2)/(x5-x2)+y2)
return 1;
if(y9 < y && y <= y1)
if(y>(y4-y1)*(x-x1)/(x4-x1)+y1 && y>(y5-y3)*(x-x3)/(x5-x3)+y3)
return 1;
if(y8 < y && y < y9)
if(y<(y4-y2)*(x-x2)/(x4-x2)+y2 && y<(y5-y2)*(x-x2)/(x5-x2)+y2)
return 1;
if(y5 < y && y < y8)
if(y>(y4-y1)*(x-x1)/(x4-x1)+y1 && y<(y4-y2)*(x-x2)/(x4-x2)+y2 || y < (y5-y2)*(x-x2)/(x5-x2)+y2 && y > (y5-y3)*(x-x3)/(x5-x3)+y3)
return 1;
if(y < y5 && y > y5-1){
printf("表示した星型の外接円の直径は %d です。\n", r*2);
printf("星型の外接円との交点はそれぞれ\n");
printf("(x1,y1) = ( %.3f, %.3f)",x1,y1);printf(" (x2,y2) = ( %f.3, %.3f)\n",x2,y2);
printf("(x3,y3) = ( %.3f, %.3f)",x3,y3);printf(" (x4,y4) = ( %.3f, %.3f)\n",x4,y4);
printf("(x5,y5) = ( %.3f, %.3f)\n",x5,y5);
exit (9);}
else
return 0;
}
int keisan(int i, int j, int r){
double pai=3.1415926;
double x1,x2,x3,x4,x5,x6,x7,x8,x9,y1,y2,y3,y4,y5,y6,y7,y8,y9;
double a1,b1,c1,d1,a2,b2,c2,d2;
x1=r*cos(pai/10);
y1=r*sin(pai/10);
x2=0;
y2=r;
x3=-r*cos(pai/10);
y3=r*sin(pai/10);
x4=-r*cos(pai*3/10);
y4=-r*cos(pai*3/10);
x5=r*cos(pai*3/10);
y5=-r*cos(pai*3/10);
a1=(y4-y1) / (x4-x1);
b1=(-(y4-y1)*x1 / (x4-x1)) + y1;
c1=(y5-y2) / (x5-x2);
d1=(-(y5-y2)*x2 / (x5-x2)) + y2;
a2=(y4-y1) / (x4-x1);
b2=(-(y4-y1)*x1 / (x4-x1)) + y1;
c2=(y5-y3) / (x5-x3);
d2=(-(y5-y3)*x3 / (x5-x3)) + y3;
y8=(a1/(a1-c1))*(d1-c1*b1/a1);
y9=(a2/(a2-c2))*(d2-c2*b2/a2);
return(hantei(i,j,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,y8,y9,r));
}
int main(){
int i, j, r;
printf("星の大きさを入力してください。この数値は星型に外接する円の半径となります。\n");
scanf("%d", &r);
for( i = r ; i >= -r ; i-- ){
for( j = r ; j >= -r ; j-- ){
if( keisan( i, j, r ) == 1 )
printf("#");
else if( keisan( i, j, r ) == 0)
printf(" ");
else if( keisan( i, j, r ) == 2){
exit (9);
}
}
printf("\n");
}
return (0);
}