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