Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / ETL / tags / ETL_0_04_09 / 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 <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
214         hermite<float> curve1(0,1,0,1);
215         hermite<float> curve2(-1,2,-1,-2);
216         double t1,t2;
217         float d;
218
219         t1=curve1.intersect(curve2);
220         t2=curve2.intersect(curve1);
221
222         d=curve1(t1)-curve2(t2);
223
224         fprintf(stderr,"float:Intersection difference: %f (t1=%f, t2=%f)\n",d,t1,t2);
225
226         if(d>0.01)
227         {
228                 fprintf(stderr,"float:FAILED INTERSECTION TEST.\n");
229                 ret++;
230         }
231
232         return ret;
233 }
234
235 /* === E N T R Y P O I N T ================================================= */
236
237 int main()
238 {
239         int error=0;
240
241         error+=basic_test();
242         error+=angle_test();
243         error+=fixed_test();
244         error+=float_intersection_test();
245         return error;
246 }