1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#ifndef JCG_FIGURE_H
#define JCG_FIGURE_H
#include "drawable.h"
#include "common.h"
// любая фигура
// создаётся функциями figure_point, figure_line и т.д.
// у каждой фигуры должен быть способ "нарисоваться" на
// любое "рисовальное" поле, используя функцию drawable.put
struct figure {
enum {
F_NONE, F_POINT, F_RECT, F_LINE, F_CIRCLE
} type;
union {
struct {
vector2 coords;
} point;
struct {
vector2 upleft, downright;
} rect;
struct {
vector2 start, end;
} line;
struct {
vector2 center;
long rad;
} circle;
};
void (*draw)(const struct figure *self, struct drawable *d);
};
// массив функций по типам (lookup table)
extern void (*const draw_lookup[])(const struct figure *, struct drawable *);
// конструктор 1
struct figure figure_point(vector2 p);
// конструктор 2
struct figure figure_rect(vector2 upleft, vector2 downright);
// конструктор 3
struct figure figure_line(vector2 start, vector2 end);
// конструктор 4
struct figure figure_circle(vector2 center, long radius);
// draw для F_POINT
void draw_point(const struct figure *self, struct drawable *d);
// draw для F_RECT
void draw_rect(const struct figure *self, struct drawable *d);
// draw для F_LINE
void draw_line(const struct figure *self, struct drawable *d);
// draw для F_CIRCLE
void draw_circle(const struct figure *self, struct drawable *f);
void print_figure(const struct figure *self);
#endif // JCG_FIGURE_H
|