纯数学方法,如果缩放很小会很难看……(其实好像一直都很难看= =)不过绝对是标准的五角星……
输入边长就能输出五角星:
程序代码:
#include
#include
#define MIN(x, y) ((y) < (x) ? (y) : (x))
#define MAX(x, y) ((x) < (y) ? (y) : (x))
#define RAD(x) ((x) * M_PI / 180.0)
#define F1(x) (tan(RAD(162)) * (x) + 1 + cos(RAD(72)))
#define F2(x) (tan(RAD(18)) * (x) + 1 + cos(RAD(72)))
#define F3(x) (tan(RAD(54)) * (x) - sin(RAD(72)) * tan(RAD(54)))
#define F4(x) (tan(RAD(126)) * (x) + 2 + 2 * cos(RAD(72)) \
+ sin(RAD(72)) * tan(RAD(54)))
void draw_star(int scale)
{
int i, end = rint(scale * sin(RAD(72)) / 2), end2;
for (i = 0; i <= end; ++i)
{
int y1 = rint(F1(i*2.0/scale)*scale),
y2 = rint(F2(i*2.0/scale)*scale);
if (y1 != y2)
printf("%*c%*c\n", y1 + 1, '*', y2 - y1, '*');
else
printf("%*c\n", y1 + 1, '*');
}
for (i = 0; i < scale; ++i)
putchar('*');
end2 = rint(scale * cos(RAD(72)) * 2);
for (i = 0; i <= end2; ++i)
putchar(' ');
for (i = 0; i < scale; ++i)
putchar('*');
putchar('\n');
for (i = end + 1; ; ++i)
{
int y1 = rint(F1(i*2.0/scale)*scale),
y2 = rint(F2(i*2.0/scale)*scale),
y3 = rint(F3(i*2.0/scale)*scale),
y4 = rint(F4(i*2.0/scale)*scale);
if (y4 <= y1 || y3 >= y2)
{
printf("%*c%*c\n", y1 + 1, '*', y2 - y1, '*');
break;
}
if (y3 < y4)
{
int ymin = MIN(y1, y3);
printf("%*c%*c\n", ymin + 1, '*', MAX(y2, y4) - ymin, '*');
}
else
printf("%*c%*c%*c%*c\n", y1 + 1, '*', y4 - y1, '*',
y3 - y4, '*', y2 - y3, '*');
}
}
int main(void)
{
int scale;
while (scanf("%d", &scale) == 1)
draw_star(scale);
return 0;
}
/* - cc: flags+='-lm' */
输入13的输出结果:
13
*
* *
* *
* *
* *
* *
* *
************* *************
* *
* *
* *
* *
* *
* *
* * * *
* * * *
* * * *
* *
[本帖最后由 StarWing83 于 2009-11-7 12:27 编辑]