diff options
Diffstat (limited to 'util.cpp')
-rw-r--r-- | util.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/util.cpp b/util.cpp new file mode 100644 index 0000000..a1cf8e9 --- /dev/null +++ b/util.cpp | |||
@@ -0,0 +1,173 @@ | |||
1 | #include "util.h" | ||
2 | |||
3 | |||
4 | vector<vector<string> > splitString(string s) | ||
5 | { | ||
6 | vector<vector<string> > result; | ||
7 | vector<string> line; | ||
8 | string word; | ||
9 | for(int i = 0; i < (int) s.size(); ++i) | ||
10 | { | ||
11 | if(s[i] == ' ') | ||
12 | { | ||
13 | line.push_back(word); | ||
14 | word = ""; | ||
15 | } | ||
16 | else if(s[i] == '\n') | ||
17 | { | ||
18 | line.push_back(word); | ||
19 | word = ""; | ||
20 | result.push_back(line); | ||
21 | line = vector<string>(); | ||
22 | } | ||
23 | else | ||
24 | word += s[i]; | ||
25 | } | ||
26 | line.push_back(word); | ||
27 | result.push_back(line); | ||
28 | return result; | ||
29 | } | ||
30 | |||
31 | void _tospace(string &s) | ||
32 | { | ||
33 | for(int i = 0; i < (int) s.size(); ++i) | ||
34 | if(s[i] == '_') | ||
35 | s[i] = ' '; | ||
36 | } | ||
37 | |||
38 | void spaceto_(string &s) | ||
39 | { | ||
40 | for(int i = 0; i < (int) s.size(); ++i) | ||
41 | if(s[i] == ' ') | ||
42 | s[i] = '_'; | ||
43 | } | ||
44 | |||
45 | double round_beautiful(double d) | ||
46 | { | ||
47 | if(d == 0) | ||
48 | return d; | ||
49 | double ten = 1; | ||
50 | while(d >= 10) | ||
51 | { | ||
52 | d/= 10; | ||
53 | ten *= 10; | ||
54 | } | ||
55 | while(d < 1) | ||
56 | { | ||
57 | d*= 10; | ||
58 | ten /= 10; | ||
59 | } | ||
60 | vector<double> candidates; | ||
61 | candidates.push_back((int)d); | ||
62 | candidates.push_back(((int)d) + 0.5); | ||
63 | if(ten > 1) | ||
64 | { | ||
65 | candidates.push_back(((int)d)/9.0*10); | ||
66 | } | ||
67 | int closest = 0; | ||
68 | double mindist = 10; | ||
69 | for(int i = 0; i < (int)candidates.size(); ++i) | ||
70 | { | ||
71 | if(mindist > fabs(candidates[i]-d)) | ||
72 | { | ||
73 | mindist = fabs(candidates[i]-d); | ||
74 | closest = i; | ||
75 | } | ||
76 | } | ||
77 | double result = candidates[closest] * ten; | ||
78 | if(closest == 2) | ||
79 | result = (int) result; | ||
80 | return result; | ||
81 | } | ||
82 | |||
83 | SDL_Event relativate(const SDL_Event &e, SDL_Rect p) | ||
84 | { | ||
85 | SDL_Event result = e; | ||
86 | if(e.type == SDL_MOUSEMOTION) | ||
87 | { | ||
88 | result.motion.x -= p.x; | ||
89 | result.motion.y -= p.y; | ||
90 | } | ||
91 | if(e.type == SDL_MOUSEBUTTONDOWN || e.type == SDL_MOUSEBUTTONUP) | ||
92 | { | ||
93 | result.button.x -= p.x; | ||
94 | result.button.y -= p.y; | ||
95 | } | ||
96 | return result; | ||
97 | } | ||
98 | |||
99 | bool inRect(SDL_Rect r, double x, double y) | ||
100 | { | ||
101 | if(x < r.x || x >= r.x + r.w || y < r.y || y >= r.y + r.h) | ||
102 | return false; | ||
103 | return true; | ||
104 | } | ||
105 | |||
106 | SDL_Surface* copyImage(SDL_Surface* s) | ||
107 | { | ||
108 | return SDL_ConvertSurface(s,s->format,SDL_SWSURFACE); | ||
109 | } | ||
110 | |||
111 | |||
112 | //loads a bitmap from file and converts it to screen properties | ||
113 | SDL_Surface* loadBMP(std::string filename) | ||
114 | { | ||
115 | SDL_Surface* loadedImage = NULL; | ||
116 | |||
117 | SDL_Surface* convertedImage = NULL; | ||
118 | |||
119 | loadedImage = IMG_Load(filename.c_str()); | ||
120 | if(loadedImage != NULL) | ||
121 | { | ||
122 | convertedImage = SDL_DisplayFormat(loadedImage); | ||
123 | if(convertedImage) | ||
124 | { | ||
125 | Uint32 colorkey = SDL_MapRGB(convertedImage->format, 0, 1, 2); | ||
126 | SDL_SetColorKey(convertedImage, SDL_SRCCOLORKEY, colorkey); | ||
127 | SDL_FreeSurface(loadedImage); | ||
128 | return convertedImage; | ||
129 | } | ||
130 | cout << "Error: Could not convert Image" << filename << '.' << endl; | ||
131 | } | ||
132 | cout << "Error: Could not load bitmap from file " << filename << endl; | ||
133 | return NULL; | ||
134 | } | ||
135 | |||
136 | |||
137 | string lltostr(const long long& l) | ||
138 | { | ||
139 | stringstream str; | ||
140 | str << l; | ||
141 | return str.str(); | ||
142 | } | ||
143 | |||
144 | string dbltostr(const double& d, int dec) | ||
145 | { | ||
146 | stringstream str; | ||
147 | long long bla = pow(10,dec); | ||
148 | str << ((long long) (bla*d))/((double) bla); | ||
149 | return str.str(); | ||
150 | } | ||
151 | |||
152 | //returns true if the line intersects with the circle (or lies in it) | ||
153 | bool intersects(double radius, double startx, double starty, double endx, double endy) | ||
154 | { | ||
155 | double xdir = endx - startx; | ||
156 | double ydir = endy - starty; | ||
157 | //|dir*lambda+start|<radius | ||
158 | //(xdir^2+ydir^2)*lamda^2 + (xdir*startx + ydir*starty)*lamda + startx^2 + starty^2 - radius^2 = 0; | ||
159 | double a = xdir*xdir + ydir*ydir; | ||
160 | double b = xdir*startx + ydir*starty; | ||
161 | double c = startx*startx + starty*starty - radius*radius; | ||
162 | double dis = b*b - 4 * a * c; | ||
163 | if(dis < 0) | ||
164 | return false; | ||
165 | double sol1 = (-b + sqrt(dis))/(2*a); | ||
166 | if(sol1 < 0) | ||
167 | return false; | ||
168 | double sol2 = (-b - sqrt(dis))/(2*a); | ||
169 | if(sol2 > 1) | ||
170 | return false; | ||
171 | return true; | ||
172 | |||
173 | } | ||