#include #include #include 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) = ( %.3f, %.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); }