Use LinkableValueNode members functions when possible in the derived valuenodes.
[synfig.git] / ETL / 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 ** 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
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
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
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
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
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
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 }