3 * Name : test_ccri_angle_average
4 * Author : Chris Koeritz
6 * Tests the angle averaging method (for angles in degrees)
8 * Copyright (c) 2001-$now By Author. This program is free software; you can
9 * redistribute it and/or modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either version 2 of
11 * the License or (at your option) any later version. This is online at:
12 * http://www.fsf.org/copyleft/gpl.html
13 * Please send any updates to: fred@gruntose.com
16 #include <application/hoople_main.h>
17 #include <basis/astring.h>
18 #include <geometric/angle.h>
19 #include <loggers/program_wide_logger.h>
20 #include <mathematics/double_plus.h>
21 #include <structures/static_memory_gremlin.h>
22 #include <unit_test/unit_base.h>
24 using namespace application;
25 using namespace basis;
26 using namespace geometric;
27 using namespace loggers;
28 using namespace mathematics;
29 using namespace structures;
30 using namespace unit_test;
32 typedef double_plus floot;
34 class test_ccri_angle_average : public virtual unit_base, public virtual application_shell
37 test_ccri_angle_average() : application_shell() {}
38 DEFINE_CLASS_NAME("test_ccri_angle_average");
39 virtual int execute();
41 // returns average of angles a1 and a2, in degrees.
42 double angleAverage(double a1, double a2) {
45 if (absolute_value(a1 - a2) > 180.0) {
46 if (a1 < 180.0) a1 += 360.0;
49 return fmod( (a1 + a2) / 2.0, 360.0);
54 int test_ccri_angle_average::execute()
61 // there could be two right answers for angles 180 degrees apart, but we only test for one.
63 avg = angleAverage(a1, a2);
64 ASSERT_EQUAL(floot(avg), floot(113), a_sprintf("%f and %f 180 degrees apart", a1, a2));
66 avg = angleAverage(a1, a2);
67 ASSERT_EQUAL(floot(avg), floot(269), a_sprintf("%f and %f 180 degrees apart", a1, a2));
69 avg = angleAverage(a1, a2);
70 ASSERT_EQUAL(floot(avg), floot(180), a_sprintf("%f and %f 180 degrees apart", a1, a2));
74 avg = angleAverage(a1, a2);
75 ASSERT_EQUAL(floot(avg), floot(1.5), a_sprintf("%f and %f", a1, a2));
76 a1 = 89.9; a2 = 270.1;
77 avg = angleAverage(a1, a2);
78 ASSERT_EQUAL(floot(avg), floot(0), a_sprintf("%f and %f", a1, a2));
80 avg = angleAverage(a1, a2);
81 ASSERT_EQUAL(floot(avg), floot(0), a_sprintf("%f and %f", a1, a2));
83 avg = angleAverage(a1, a2);
84 ASSERT_EQUAL(floot(avg), floot(359.5), a_sprintf("%f and %f", a1, a2));
86 avg = angleAverage(a1, a2);
87 ASSERT_EQUAL(floot(avg), floot(358.5), a_sprintf("%f and %f", a1, a2));
89 avg = angleAverage(a1, a2);
90 ASSERT_EQUAL(floot(avg), floot(359), a_sprintf("%f and %f", a1, a2));
92 avg = angleAverage(a1, a2);
93 ASSERT_EQUAL(floot(avg), floot(91.5), a_sprintf("%f and %f", a1, a2));
95 avg = angleAverage(a1, a2);
96 ASSERT_EQUAL(floot(avg), floot(134), a_sprintf("%f and %f", a1, a2));
98 avg = angleAverage(a1, a2);
99 ASSERT_EQUAL(floot(avg), floot(113.5), a_sprintf("%f and %f", a1, a2));
101 avg = angleAverage(a1, a2);
102 ASSERT_EQUAL(floot(avg), floot(191.5), a_sprintf("%f and %f", a1, a2));
104 avg = angleAverage(a1, a2);
105 ASSERT_EQUAL(floot(avg), floot(210), a_sprintf("%f and %f", a1, a2));
107 avg = angleAverage(a1, a2);
108 ASSERT_EQUAL(floot(avg), floot(322.5), a_sprintf("%f and %f", a1, a2));
110 avg = angleAverage(a1, a2);
111 ASSERT_EQUAL(floot(avg), floot(180), a_sprintf("%f and %f", a1, a2));
113 avg = angleAverage(a1, a2);
114 ASSERT_EQUAL(floot(avg), floot(0), a_sprintf("%f and %f", a1, a2));
117 avg = angleAverage(a1, a2);
118 ASSERT_EQUAL(floot(avg), floot(59.5), a_sprintf("%f and %f", a1, a2));
120 avg = angleAverage(a1, a2);
121 ASSERT_EQUAL(floot(avg), floot(289.5), a_sprintf("%f and %f", a1, a2));
123 avg = angleAverage(a1, a2);
124 ASSERT_EQUAL(floot(avg), floot(276), a_sprintf("%f and %f", a1, a2));
126 avg = angleAverage(a1, a2);
127 ASSERT_EQUAL(floot(avg), floot(4), a_sprintf("%f and %f", a1, a2));
129 return final_report();
134 HOOPLE_MAIN(test_ccri_angle_average, )