aboutsummaryrefslogtreecommitdiffstats
path: root/7_2/include/figure.h
diff options
context:
space:
mode:
Diffstat (limited to '7_2/include/figure.h')
-rw-r--r--7_2/include/figure.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/7_2/include/figure.h b/7_2/include/figure.h
new file mode 100644
index 0000000..393ca00
--- /dev/null
+++ b/7_2/include/figure.h
@@ -0,0 +1,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