FIFE  2008.0
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
angles.cpp
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 *
7  * modify it under the terms of the GNU Lesser General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2.1 of the License, or (at your option) any later version. *
10  * *
11  * This library 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 GNU *
14  * Lesser General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Lesser General Public *
17  * License along with this library; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, 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  int32_t getIndexByAngle(int32_t angle, const type_angle2id& angle2id, int32_t& closestMatchingAngle) {
35  int32_t 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  int32_t ud = wangle - (--u)->first;
51  int32_t 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  int32_t ld = u->first - wangle;
67  int32_t 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  int32_t ud = u->first - wangle;
80  int32_t ucm = u->first;
81  int32_t ui = u->second;
82  u--;
83  int32_t ld = wangle - u->first;
84  int32_t lcm = u->first;
85  int32_t li = u->second;
86 
87  if (ud <= ld) {
88  closestMatchingAngle = ucm;
89  return ui;
90  }
91  closestMatchingAngle = lcm;
92  return li;
93  }
94 }