comparison engine/core/util/math/angles.cpp @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children 90005975cdbb
comparison
equal deleted inserted replaced
-1:000000000000 0:4a0efb7baf70
1 /***************************************************************************
2 * Copyright (C) 2005-2008 by the FIFE team *
3 * http://www.fifengine.de *
4 * This file is part of FIFE. *
5 * *
6 * FIFE is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
20 ***************************************************************************/
21
22 // Standard C++ library includes
23 #include <iostream>
24
25 // 3rd party library includes
26
27 // FIFE includes
28 // These includes are split up in two parts, separated by one empty line
29 // First block: files included from the FIFE root src directory
30 // Second block: files included from the same folder
31 #include "angles.h"
32
33 namespace FIFE {
34 int getIndexByAngle(int angle, const type_angle2id& angle2id, int& closestMatchingAngle) {
35 int wangle = (360 + angle) % 360;
36
37 if (angle2id.size() == 0) {
38 return -1;
39 }
40 if (angle2id.size() == 1) {
41 closestMatchingAngle = angle2id.begin()->first;
42 return angle2id.begin()->second;
43 }
44
45 type_angle2id::const_iterator u(angle2id.upper_bound(wangle));
46 type_angle2id::const_iterator tmp;
47
48 // take care of the forward wrapping case
49 if (u == angle2id.end()) {
50 int ud = wangle - (--u)->first;
51 int ld = 360 - wangle + angle2id.begin()->first;
52 if (ud > ld) {
53 // wrapped value (first)
54 closestMatchingAngle = angle2id.begin()->first;
55 return angle2id.begin()->second;
56 }
57 // non-wrapped value
58 closestMatchingAngle = u->first;
59 return u->second;
60 }
61
62 // take care of the backward wrapping case
63 if (u == angle2id.begin()) {
64 tmp = angle2id.end();
65 tmp--;
66 int ld = u->first - wangle;
67 int ud = 360 - tmp->first + wangle;
68 if (ud > ld) {
69 // non-wrapped value (first)
70 closestMatchingAngle = angle2id.begin()->first;
71 return angle2id.begin()->second;
72 }
73 // wrapped value (last)
74 closestMatchingAngle = tmp->first;
75 return tmp->second;
76 }
77
78 // value in the middle...
79 int ud = u->first - wangle;
80 int ucm = u->first;
81 int ui = u->second;
82 u--;
83 int ld = wangle - u->first;
84 int lcm = u->first;
85 int li = u->second;
86
87 if (ud <= ld) {
88 closestMatchingAngle = ucm;
89 return ui;
90 }
91 closestMatchingAngle = lcm;
92 return li;
93 }
94 }