1 #include <stdio.h>
2
3 //图元的类型
4 enum SHAPE_TYPE{
5 RECT_TYPE = 0,
6 CIRCLE_TYPE = 1,
7 TRIANGLE_TYPE = 2,
8 SHAPE_NUM,
9 };
10 //为了定义三角形的坐标而设
11 struct point{
12 float x;
13 float y;
14 };
15 //创建shape结构体
16 struct shape{
17 //int type;
18 enum SHAPE_TYPE type;
19 union {
20 struct {
21 float x;
22 float y;
23 float w;
24 float h;
25 }rect;
26
27 struct {
28 float c_x;
29 float c_y;
30 float r;
31 }circle;
32
33 struct {
34 struct point t0;
35 struct point t1;
36 struct point t2;
37 }triangle;
38 }u;
39 };
40 //初始化矩形
41 void init_rect_shape(struct shape *s, float x, float y, float w, float h)
42 {
43 s->type = RECT_TYPE;
44 s->u.rect.x = x;
45 s->u.rect.y = y;
46 s->u.rect.w = w;
47 s->u.rect.h = h;
48 return ;
49 }
50 //初始化三角形
51 void init_triangle_shape(struct shape *s,float a, float b, float c, float d,float e, float f)
52 {
53 s->type = TRIANGLE_TYPE;
54 s->u.triangle.t0.x = a;
55 s->u.triangle.t0.y = b;
56 s->u.triangle.t1.x = c;
57 s->u.triangle.t1.y = d;
58 s->u.triangle.t2.x = e;
59 s->u.triangle.t2.y = f;
60 return ;
61 }
62 //初始化圆
63 void init_circle_shape(struct shape *s, float a, float b, float r)
64 {
65 s->type = CIRCLE_TYPE;
66 s->u.circle.c_x = a;
67 s->u.circle.c_y = b;
68 s->u.circle.r = r;
69 return;
70 }
71 //输出图形
72 void draw_shape(struct shape *shapes, int count)
73 {
74 int i = 0;
75 for(i=0;i<count;i++)
76 {
77 switch(shapes[i].type)
78 {
79 case CIRCLE_TYPE:
80 printf("circle:%f, %f, %f\n", shapes[i].u.circle.c_x, shapes[i].u.circle.c_y, shapes[i].u.circle.r);
81 break;
82 case TRIANGLE_TYPE:
83 printf("triangle:%f, %f, %f, %f, %f, %f\n", shapes[i].u.triangle.t0.x, shapes[i].u.triangle.t0.y, shapes[i].u.triangle.t1.x, shapes[i].u.triangle.t1.y, shapes[i].u.triangle.t2.x, shapes[i].u.triangle.t2.y);
84 break;
85 case RECT_TYPE:
86 printf("circle:%f, %f, %f, %f\n", shapes[i].u.rect.x, shapes[i].u.rect.y, shapes[i].u.rect.w, shapes[i].u.rect.h);
87 break;
88 default:
89 break;
90 }
91 }
92
93 return ;
94 }
95
96 int main()
97 {
98 struct shape shape_set[3];
99 init_rect_shape(&shape_set[0], 100, 200, -100, 200);
100 init_triangle_shape(&shape_set[1], 10, 20, 30, -30, 40, -40);
101 init_circle_shape(&shape_set[2], 100, 200, 300);
102 draw_shape(shape_set, 3);
103
104 return 0;
105 }