Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / ETL / tags / ETL_0_04_08 / ETL / test / hermite.cpp
1 /*! ========================================================================
2 ** Extended Template and Library Test Suite
3 ** Hermite Curve Test
4 ** $Id: hermite.cpp,v 1.1.1.1 2005/01/04 01:31:48 darco Exp $
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 <stdio.h>
29
30 /* === M A C R O S ========================================================= */
31
32 using namespace etl;
33
34 /* === C L A S S E S ======================================================= */
35
36
37 /* === P R O C E D U R E S ================================================= */
38
39 int basic_test(void)
40 {
41         int ret=0;
42         float f;
43         
44         hermite<float> Hermie;
45         etl::clock timer;
46         double t;
47         
48         Hermie.p1()=0;
49         Hermie.t1()=1;
50         Hermie.p2()=0;
51         Hermie.t2()=1;
52         
53         Hermie.sync();
54         
55         integral<hermite<float> > inte(Hermie);
56
57         
58         fprintf(stderr,"integral of curve() on [0,1] = %f\n",inte(0,1.0));
59         fprintf(stderr,"integral of curve() on [-1,3] = %f\n",inte(-1.0,3.0));
60         Hermie.set_rs(-1.0,7.0);
61         inte=integral<hermite<float> >(Hermie);
62         fprintf(stderr,"integral of curve()[%f,%f] on [-1,7] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(-1.0,7.0));
63         fprintf(stderr,"integral of curve()[%f,%f] on [0,1] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(0,1.0));
64         Hermie.set_rs(0.0,1.0);
65         
66         
67         for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f)
68         {
69                 t+=Hermie(f)+Hermie(f+0.1f);
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         }
82         t=timer();
83         
84         fprintf(stderr,"time=%f milliseconds\n",t*1000);
85         return ret;
86 }
87
88 int angle_test(void)
89 {
90         int ret=0;
91         float f;
92         
93         hermite<angle> Hermie;
94         etl::clock timer;
95         angle tmp;
96         double t;
97         
98         Hermie.p1()=angle::degrees(0);
99         Hermie.t1()=angle::degrees(45);
100
101         Hermie.p2()=angle::degrees(-45);
102         Hermie.t2()=angle::degrees(180);
103
104         Hermie.sync();  
105         
106         
107         for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f)
108         {
109                 tmp+=Hermie(f)+Hermie(f+0.1f);
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         }
122         t=timer();
123         
124         fprintf(stderr,"angle time=%f milliseconds\n",t*1000);
125
126         return ret;
127 }
128
129 int fixed_test(void)
130 {
131         int ret=0;
132         float f;
133         
134         hermite<float,fixed> Hermie;
135         etl::clock timer;
136         double t;
137         
138         Hermie.p1()=0;
139         Hermie.t1()=1;
140         Hermie.p2()=0;
141         Hermie.t2()=1;
142         
143         Hermie.sync();
144         
145         
146         
147         for(f=0.0f,timer.reset();f<1.001f;f+=0.005f)
148         {
149                 t+=Hermie(f)+Hermie(f+0.1f);
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         }
162         t=timer();
163         
164         fprintf(stderr,"time=%f milliseconds\n",t*1000);
165         return ret;
166 }
167
168
169 int anglefixed_test(void)
170 {
171         int ret=0;
172         float f;
173         
174         hermite<angle,fixed> Hermie;
175         etl::clock timer;
176         angle tmp;
177         double t;
178         
179         Hermie.p1()=angle::degrees(0);
180         Hermie.t1()=angle::degrees(45);
181
182         Hermie.p2()=angle::degrees(-45);
183         Hermie.t2()=angle::degrees(180);
184
185         Hermie.sync();  
186         
187         
188         for(f=0.0f,timer.reset();f<1.001f;f+=0.0005f)
189         {
190                 tmp+=Hermie(f)+Hermie(f+0.1f);
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         }
203         t=timer();
204         
205         fprintf(stderr,"angle fixed time=%f milliseconds\n",t*1000);
206
207         return ret;
208 }
209
210 int float_intersection_test()
211 {
212         int ret=0;
213         float f;
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 }