Animation of precision_vs_zoom
[ipdf/code.git] / src / rect.h
1 #ifndef _RECT_H
2 #define _RECT_H
3
4 #include "common.h"
5 #include "real.h"
6
7 namespace IPDF
8 {
9         struct Rect
10         {
11                 Real x; Real y; Real w; Real h;
12                 Rect() = default; // Needed so we can fread/fwrite this struct
13                 Rect(Real _x, Real _y, Real _w, Real _h) : x(_x), y(_y), w(_w), h(_h) {}
14                 std::string Str() const
15                 {
16                         std::stringstream s;
17                         // float conversion needed because it is fucking impossible to get ostreams working with template classes
18                         s << "{" << Float(x) << ", " << Float(y) << ", " << Float(x + w) << ", " << Float(y + h) << " (w: " << Float(w) <<", h: " << Float(h) <<")}";
19                         return s.str();
20                 }
21                 inline bool PointIn(Real pt_x, Real pt_y) const
22                 {
23                         if (pt_x <= x) return false;
24                         if (pt_y <= y) return false;
25                         if (pt_x >= x + w) return false;
26                         if (pt_y >= y + h) return false;
27                         return true;
28                 }
29
30                 inline bool Intersects(const Rect& other) const
31                 {
32                         if (x + w < other.x) return false;
33                         if (y + h < other.y) return false;
34                         if (x > other.x + other.w) return false;
35                         if (y > other.y + other.h) return false;
36                         return true;
37                 }
38         };
39
40         inline Rect TransformRectCoordinates(const Rect& view, const Rect& r)
41         {
42                 Rect out;
43                 Real w = (view.w == Real(0))?Real(1):view.w;
44                 Real h = (view.h == Real(0))?Real(1):view.h;
45                 out.x = (r.x - view.x) / w;
46                 out.y = (r.y - view.y) / h;
47                 out.w = r.w / w;
48                 out.h = r.h / h;
49                 return out;
50         }
51
52         inline Vec2 TransformPointCoordinates(const Rect& view, const Vec2& v)
53         {
54                 Vec2 out;
55                 out.x = (v.x - view.x) / view.w;
56                 out.y = (v.y - view.y) / view.h;
57                 return out;
58         }
59
60
61 }
62
63 #endif //_RECT_H

UCC git Repository :: git.ucc.asn.au