From 113fbd0d57be3df9bc6ac56b44d8bd154cc90d38 Mon Sep 17 00:00:00 2001 From: Wintermate Date: Tue, 8 Oct 2013 02:49:33 +0200 Subject: [PATCH] =?utf8?q?mockup/util=20=C3=BCbernommen=20(fixed=20point,?= =?utf8?q?=20rectangle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- badge/util/fixed_point.h | 37 ++++++++++++++++++++++++++++ badge/util/rectangle.h | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 badge/util/fixed_point.h create mode 100644 badge/util/rectangle.h diff --git a/badge/util/fixed_point.h b/badge/util/fixed_point.h new file mode 100644 index 0000000..05a8c79 --- /dev/null +++ b/badge/util/fixed_point.h @@ -0,0 +1,37 @@ +#ifndef INCLUDED_FIXED_POINT_H +#define INCLUDED_FIXED_POINT_H + +#include +#include + +/* Unterstes Byte als Nachkomma. 16 Bit Nutzlast! Sonst geht Multiplikation flöten. */ +typedef struct { int32_t data; } fixed_point; + +static inline fixed_point fixed_point_add(fixed_point x, fixed_point y) { fixed_point r = { x.data + y.data }; return r; } +static inline fixed_point fixed_point_sub(fixed_point x, fixed_point y) { fixed_point r = { x.data - y.data }; return r; } +static inline fixed_point fixed_point_mul(fixed_point x, fixed_point y) { fixed_point r = { x.data * y.data / 256 }; return r; } +static inline fixed_point fixed_point_div(fixed_point x, fixed_point y) { fixed_point r = { (x.data * 256) / y.data }; return r; } + +static inline fixed_point fixed_point_neg(fixed_point x) { fixed_point r = { -x.data }; return r; } +static inline fixed_point fixed_point_abs(fixed_point x) { fixed_point r = { x.data < 0 ? -x.data : x.data }; return r; } + +static inline bool fixed_point_lt(fixed_point x, fixed_point y) { return x.data < y.data; } +static inline bool fixed_point_gt(fixed_point x, fixed_point y) { return x.data > y.data; } +static inline bool fixed_point_le(fixed_point x, fixed_point y) { return x.data <= y.data; } +static inline bool fixed_point_ge(fixed_point x, fixed_point y) { return x.data >= y.data; } +static inline bool fixed_point_eq(fixed_point x, fixed_point y) { return x.data == y.data; } +static inline bool fixed_point_ne(fixed_point x, fixed_point y) { return x.data != y.data; } + +#define FIXED_POINT_I(x, y) { ((x) * 256) + ((y) * 256 / 1000) } + +static inline fixed_point FIXED_POINT(unsigned x, unsigned y) { + fixed_point r = { ((int) x * 256) + ((int) y * 256 / 1000) }; + return r; +} + +static inline int fixed_point_cast_int(fixed_point x) { return x.data / 256; } + +static inline fixed_point fixed_point_min(fixed_point x, fixed_point y) { return fixed_point_lt(x, y) ? x : y; } +static inline fixed_point fixed_point_max(fixed_point x, fixed_point y) { return fixed_point_gt(x, y) ? x : y; } + +#endif diff --git a/badge/util/rectangle.h b/badge/util/rectangle.h new file mode 100644 index 0000000..8653e6b --- /dev/null +++ b/badge/util/rectangle.h @@ -0,0 +1,52 @@ +#ifndef INCLUDED_RECTANGLE_H +#define INCLUDED_RECTANGLE_H + +#include "fixed_point.h" + +typedef struct { + fixed_point x; + fixed_point y; +} vec2d; + +static inline vec2d vec2d_add(vec2d v1, vec2d v2) { + vec2d r = { + fixed_point_add(v1.x, v2.x), + fixed_point_add(v1.y, v2.y) + }; + + return r; +} + +typedef struct { + vec2d pos; + vec2d extent; +} rectangle; + +static inline fixed_point rectangle_top (rectangle const *r) { return r->pos.y; } +static inline fixed_point rectangle_left (rectangle const *r) { return r->pos.x; } +static inline fixed_point rectangle_bottom(rectangle const *r) { return fixed_point_add(rectangle_top (r), r->extent.y); } +static inline fixed_point rectangle_right (rectangle const *r) { return fixed_point_add(rectangle_left(r), r->extent.x); } + +static inline fixed_point rectangle_width (rectangle const *r) { return r->extent.x; } +static inline fixed_point rectangle_height(rectangle const *r) { return r->extent.y; } + +static inline vec2d rectangle_mid(rectangle const *r) { + vec2d v = { fixed_point_add(r->pos.x, fixed_point_div(r->extent.x, FIXED_POINT(2, 0))), + fixed_point_add(r->pos.y, fixed_point_div(r->extent.y, FIXED_POINT(2, 0))) + }; + return v; +} + +static inline void rectangle_move_to (rectangle *r, vec2d new_pos) { r->pos = new_pos; } +static inline void rectangle_move_to_x(rectangle *r, fixed_point new_x ) { r->pos.x = new_x; } +static inline void rectangle_move_to_y(rectangle *r, fixed_point new_y ) { r->pos.x = new_y; } + +static inline bool rectangle_intersect(rectangle const *r1, + rectangle const *r2) { + return (fixed_point_lt(rectangle_top (r1), rectangle_bottom(r2)) && + fixed_point_gt(rectangle_bottom(r1), rectangle_top (r2)) && + fixed_point_lt(rectangle_left (r1), rectangle_right (r2)) && + fixed_point_gt(rectangle_right (r1), rectangle_left (r2))); +} + +#endif -- 2.20.1