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