angles.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <iostream>
00024
00025
00026
00027
00028
00029
00030
00031 #include "angles.h"
00032
00033 namespace FIFE {
00034 int getIndexByAngle(int angle, const type_angle2id& angle2id, int& closestMatchingAngle) {
00035 int wangle = (360 + angle) % 360;
00036
00037 if (angle2id.size() == 0) {
00038 return -1;
00039 }
00040 if (angle2id.size() == 1) {
00041 closestMatchingAngle = angle2id.begin()->first;
00042 return angle2id.begin()->second;
00043 }
00044
00045 type_angle2id::const_iterator u(angle2id.upper_bound(wangle));
00046 type_angle2id::const_iterator tmp;
00047
00048
00049 if (u == angle2id.end()) {
00050 int ud = wangle - (--u)->first;
00051 int ld = 360 - wangle + angle2id.begin()->first;
00052 if (ud > ld) {
00053
00054 closestMatchingAngle = angle2id.begin()->first;
00055 return angle2id.begin()->second;
00056 }
00057
00058 closestMatchingAngle = u->first;
00059 return u->second;
00060 }
00061
00062
00063 if (u == angle2id.begin()) {
00064 tmp = angle2id.end();
00065 tmp--;
00066 int ld = u->first - wangle;
00067 int ud = 360 - tmp->first + wangle;
00068 if (ud > ld) {
00069
00070 closestMatchingAngle = angle2id.begin()->first;
00071 return angle2id.begin()->second;
00072 }
00073
00074 closestMatchingAngle = tmp->first;
00075 return tmp->second;
00076 }
00077
00078
00079 int ud = u->first - wangle;
00080 int ucm = u->first;
00081 int ui = u->second;
00082 u--;
00083 int ld = wangle - u->first;
00084 int lcm = u->first;
00085 int li = u->second;
00086
00087 if (ud <= ld) {
00088 closestMatchingAngle = ucm;
00089 return ui;
00090 }
00091 closestMatchingAngle = lcm;
00092 return li;
00093 }
00094 }