aboutsummaryrefslogtreecommitdiffstats
path: root/7_2/include/figure.h
blob: 393ca003bc5d4fa9a60b6162c7461660e1c045de (plain)
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