#include <stdio.h>
#include <gd.h>
#include <math.h>
void
draw_usa_flag(gdImagePtr img);
void
draw_star(gdImagePtr img,
int
x,
int
y,
int
size,
int
color);
int
main() {
int
width = 800;
int
height = (
int
)(width / 1.9);
gdImagePtr img = gdImageCreateTrueColor(width, height);
gdImageAlphaBlending(img, 0);
draw_usa_flag(img);
FILE
*outputFile =
fopen
(
"./../images/usa_flag.png"
,
"wb"
);
if
(outputFile == NULL) {
fprintf
(stderr,
"Error opening the output file.\n"
);
return
1;
}
gdImagePngEx(img, outputFile, 9);
fclose
(outputFile);
gdImageDestroy(img);
return
0;
}
void
draw_usa_flag(gdImagePtr img) {
int
width = gdImageSX(img);
int
height = gdImageSY(img);
int
red, white, blue;
red = gdImageColorAllocate(img, 178, 34, 52);
white = gdImageColorAllocate(img, 255, 255, 255);
blue = gdImageColorAllocate(img, 60, 59, 110);
int
stripe_height = height / 13;
int
stripe_width = width;
int
star_size = (
int
)(0.0308 * height);
for
(
int
y = 0; y < height; y += stripe_height) {
if
(y / stripe_height % 2 == 0) {
gdImageFilledRectangle(img, 0, y, stripe_width, y + stripe_height, red);
}
else
{
gdImageFilledRectangle(img, 0, y, stripe_width, y + stripe_height, white);
}
}
gdImageFilledRectangle(img, 0, 0, width * 2 / 5, stripe_height * 7, blue);
int
star_spacing_x = (
int
)(0.126 * height);
int
star_spacing_y = (
int
)(0.054 * height);
int
star_start_x = (
int
)(0.122 * height);
int
star_start_y = (
int
)(0.0485 * height);
for
(
int
row = 0; row < 9; row++) {
int
starsPerRow = (row % 2 == 0) ? 6 : 5;
int
space_x = (row % 2 == 0) ? star_spacing_x / -2 : 0;
for
(
int
star = 0; star < starsPerRow; star++) {
int
x = star_start_x + star * star_spacing_x+space_x;
int
y = star_start_y + row * star_spacing_y;
draw_star(img, x, y, star_size, white);
}
}
}
void
draw_star(gdImagePtr img,
int
x,
int
y,
int
size,
int
color) {
gdPoint points[10];
for
(
int
i = 0; i < 10; i++) {
double
angle = M_PI / 2 + i * 2 * M_PI / 10+M_PI;
int
radius = (i % 2 == 0) ? size : size / 2;
points[i].x = x + radius *
cos
(angle);
points[i].y = y + radius *
sin
(angle);
}
gdImageFilledPolygon(img, points, 10, color);
}