1 /*! ========================================================================
2 ** Extended Template and Library Test Suite
3 ** Hermite Curve Test
4 ** $Id$
5 **
6 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
7 ** Copyright (c) 2007 Chris Moore
8 **
9 ** This package is free software; you can redistribute it and/or
10 ** modify it under the terms of the GNU General Public License as
11 ** published by the Free Software Foundation; either version 2 of
12 ** the License, or (at your option) any later version.
13 **
14 ** This package is distributed in the hope that it will be useful,
15 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 ** General Public License for more details.
18 **
19 ** === N O T E S ===========================================================
20 **
21 ** ========================================================================= */
22
23 /* === H E A D E R S ======================================================= */
24
25 #include <ETL/hermite>
26 #include <ETL/angle>
27 #include <ETL/clock>
28 #include <ETL/calculus>
29 #include <ETL/fixed>
30 #include <stdio.h>
31
32 /* === M A C R O S ========================================================= */
33
34 using namespace etl;
35
36 /* === C L A S S E S ======================================================= */
37
38
39 /* === P R O C E D U R E S ================================================= */
40
basic_test(void)41 int basic_test(void)
42 {
43 int ret=0;
44 float f;
45
46 hermite<float> Hermie;
47 etl::clock timer;
48 double t;
49
50 Hermie.p1()=0;
51 Hermie.t1()=1;
52 Hermie.p2()=0;
53 Hermie.t2()=1;
54
55 Hermie.sync();
56
57 integral<hermite<float> > inte(Hermie);
58
59
60 fprintf(stderr,"integral of curve() on [0,1] = %f\n",inte(0,1.0));
61 fprintf(stderr,"integral of curve() on [-1,3] = %f\n",inte(-1.0,3.0));
62 Hermie.set_rs(-1.0,7.0);
63 inte=integral<hermite<float> >(Hermie);
64 fprintf(stderr,"integral of curve()[%f,%f] on [-1,7] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(-1.0,7.0));
65 fprintf(stderr,"integral of curve()[%f,%f] on [0,1] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(0,1.0));
66 Hermie.set_rs(0.0,1.0);
67
68
69 for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f)
70 {
71 t+=Hermie(f)+Hermie(f+0.1f);
72 t+=Hermie(f)+Hermie(f+0.1f);
73 t+=Hermie(f)+Hermie(f+0.1f);
74 t+=Hermie(f)+Hermie(f+0.1f);
75 t+=Hermie(f)+Hermie(f+0.1f);
76 t+=Hermie(f)+Hermie(f+0.1f);
77 t+=Hermie(f)+Hermie(f+0.1f);
78 t+=Hermie(f)+Hermie(f+0.1f);
79 t+=Hermie(f)+Hermie(f+0.1f);
80 t+=Hermie(f)+Hermie(f+0.1f);
81 t+=Hermie(f)+Hermie(f+0.1f);
82 t+=Hermie(f)+Hermie(f+0.1f);
83 }
84 t=timer();
85
86 fprintf(stderr,"time=%f milliseconds\n",t*1000);
87 return ret;
88 }
89
angle_test(void)90 int angle_test(void)
91 {
92 int ret=0;
93 float f;
94
95 hermite<angle> Hermie;
96 etl::clock timer;
97 angle tmp;
98 double t;
99
100 Hermie.p1()=angle::degrees(0);
101 Hermie.t1()=angle::degrees(45);
102
103 Hermie.p2()=angle::degrees(-45);
104 Hermie.t2()=angle::degrees(180);
105
106 Hermie.sync();
107
108
109 for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f)
110 {
111 tmp+=Hermie(f)+Hermie(f+0.1f);
112 tmp+=Hermie(f)+Hermie(f+0.1f);
113 tmp+=Hermie(f)+Hermie(f+0.1f);
114 tmp+=Hermie(f)+Hermie(f+0.1f);
115 tmp+=Hermie(f)+Hermie(f+0.1f);
116 tmp+=Hermie(f)+Hermie(f+0.1f);
117 tmp+=Hermie(f)+Hermie(f+0.1f);
118 tmp+=Hermie(f)+Hermie(f+0.1f);
119 tmp+=Hermie(f)+Hermie(f+0.1f);
120 tmp+=Hermie(f)+Hermie(f+0.1f);
121 tmp+=Hermie(f)+Hermie(f+0.1f);
122 tmp+=Hermie(f)+Hermie(f+0.1f);
123 }
124 t=timer();
125
126 fprintf(stderr,"angle time=%f milliseconds\n",t*1000);
127
128 return ret;
129 }
130
fixed_test(void)131 int fixed_test(void)
132 {
133 int ret=0;
134 float f;
135
136 hermite<float,fixed> Hermie;
137 etl::clock timer;
138 double t;
139
140 Hermie.p1()=0;
141 Hermie.t1()=1;
142 Hermie.p2()=0;
143 Hermie.t2()=1;
144
145 Hermie.sync();
146
147
148
149 for(f=0.0f,timer.reset();f<1.001f;f+=0.005f)
150 {
151 t+=Hermie(f)+Hermie(f+0.1f);
152 t+=Hermie(f)+Hermie(f+0.1f);
153 t+=Hermie(f)+Hermie(f+0.1f);
154 t+=Hermie(f)+Hermie(f+0.1f);
155 t+=Hermie(f)+Hermie(f+0.1f);
156 t+=Hermie(f)+Hermie(f+0.1f);
157 t+=Hermie(f)+Hermie(f+0.1f);
158 t+=Hermie(f)+Hermie(f+0.1f);
159 t+=Hermie(f)+Hermie(f+0.1f);
160 t+=Hermie(f)+Hermie(f+0.1f);
161 t+=Hermie(f)+Hermie(f+0.1f);
162 t+=Hermie(f)+Hermie(f+0.1f);
163 }
164 t=timer();
165
166 fprintf(stderr,"time=%f milliseconds\n",t*1000);
167 return ret;
168 }
169
170
anglefixed_test(void)171 int anglefixed_test(void)
172 {
173 int ret=0;
174 float f;
175
176 hermite<angle,fixed> Hermie;
177 etl::clock timer;
178 angle tmp;
179 double t;
180
181 Hermie.p1()=angle::degrees(0);
182 Hermie.t1()=angle::degrees(45);
183
184 Hermie.p2()=angle::degrees(-45);
185 Hermie.t2()=angle::degrees(180);
186
187 Hermie.sync();
188
189
190 for(f=0.0f,timer.reset();f<1.001f;f+=0.0005f)
191 {
192 tmp+=Hermie(f)+Hermie(f+0.1f);
193 tmp+=Hermie(f)+Hermie(f+0.1f);
194 tmp+=Hermie(f)+Hermie(f+0.1f);
195 tmp+=Hermie(f)+Hermie(f+0.1f);
196 tmp+=Hermie(f)+Hermie(f+0.1f);
197 tmp+=Hermie(f)+Hermie(f+0.1f);
198 tmp+=Hermie(f)+Hermie(f+0.1f);
199 tmp+=Hermie(f)+Hermie(f+0.1f);
200 tmp+=Hermie(f)+Hermie(f+0.1f);
201 tmp+=Hermie(f)+Hermie(f+0.1f);
202 tmp+=Hermie(f)+Hermie(f+0.1f);
203 tmp+=Hermie(f)+Hermie(f+0.1f);
204 }
205 t=timer();
206
207 fprintf(stderr,"angle fixed time=%f milliseconds\n",t*1000);
208
209 return ret;
210 }
211
float_intersection_test()212 int float_intersection_test()
213 {
214 int ret=0;
215
216 hermite<float> curve1(0,1,0,1);
217 hermite<float> curve2(-1,2,-1,-2);
218 double t1,t2;
219 float d;
220
221 t1=curve1.intersect(curve2);
222 t2=curve2.intersect(curve1);
223
224 d=curve1(t1)-curve2(t2);
225
226 fprintf(stderr,"float:Intersection difference: %f (t1=%f, t2=%f)\n",d,t1,t2);
227
228 if(d>0.01)
229 {
230 fprintf(stderr,"float:FAILED INTERSECTION TEST.\n");
231 ret++;
232 }
233
234 return ret;
235 }
236
237 /* === E N T R Y P O I N T ================================================= */
238
main()239 int main()
240 {
241 int error=0;
242
243 error+=basic_test();
244 error+=angle_test();
245 error+=fixed_test();
246 error+=float_intersection_test();
247 return error;
248 }
249