X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftest%2Fhermite.cpp;fp=ETL%2Ftest%2Fhermite.cpp;h=25a6278ce7ab8f39ef00670c981e918c0c9ab05b;hb=a095981e18cc37a8ecc7cd237cc22b9c10329264;hp=0000000000000000000000000000000000000000;hpb=9459638ad6797b8139f1e9f0715c96076dbf0890;p=synfig.git diff --git a/ETL/test/hermite.cpp b/ETL/test/hermite.cpp new file mode 100644 index 0000000..25a6278 --- /dev/null +++ b/ETL/test/hermite.cpp @@ -0,0 +1,248 @@ +/*! ======================================================================== +** Extended Template and Library Test Suite +** Hermite Curve Test +** $Id$ +** +** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2007 Chris Moore +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** === N O T E S =========================================================== +** +** ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#include +#include +#include +#include +#include +#include + +/* === M A C R O S ========================================================= */ + +using namespace etl; + +/* === C L A S S E S ======================================================= */ + + +/* === P R O C E D U R E S ================================================= */ + +int basic_test(void) +{ + int ret=0; + float f; + + hermite Hermie; + etl::clock timer; + double t; + + Hermie.p1()=0; + Hermie.t1()=1; + Hermie.p2()=0; + Hermie.t2()=1; + + Hermie.sync(); + + integral > inte(Hermie); + + + fprintf(stderr,"integral of curve() on [0,1] = %f\n",inte(0,1.0)); + fprintf(stderr,"integral of curve() on [-1,3] = %f\n",inte(-1.0,3.0)); + Hermie.set_rs(-1.0,7.0); + inte=integral >(Hermie); + fprintf(stderr,"integral of curve()[%f,%f] on [-1,7] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(-1.0,7.0)); + fprintf(stderr,"integral of curve()[%f,%f] on [0,1] = %f\n",Hermie.get_r(),Hermie.get_s(),inte(0,1.0)); + Hermie.set_rs(0.0,1.0); + + + for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f) + { + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + } + t=timer(); + + fprintf(stderr,"time=%f milliseconds\n",t*1000); + return ret; +} + +int angle_test(void) +{ + int ret=0; + float f; + + hermite Hermie; + etl::clock timer; + angle tmp; + double t; + + Hermie.p1()=angle::degrees(0); + Hermie.t1()=angle::degrees(45); + + Hermie.p2()=angle::degrees(-45); + Hermie.t2()=angle::degrees(180); + + Hermie.sync(); + + + for(f=0.0f,timer.reset();f<1.001f;f+=0.000005f) + { + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + } + t=timer(); + + fprintf(stderr,"angle time=%f milliseconds\n",t*1000); + + return ret; +} + +int fixed_test(void) +{ + int ret=0; + float f; + + hermite Hermie; + etl::clock timer; + double t; + + Hermie.p1()=0; + Hermie.t1()=1; + Hermie.p2()=0; + Hermie.t2()=1; + + Hermie.sync(); + + + + for(f=0.0f,timer.reset();f<1.001f;f+=0.005f) + { + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + t+=Hermie(f)+Hermie(f+0.1f); + } + t=timer(); + + fprintf(stderr,"time=%f milliseconds\n",t*1000); + return ret; +} + + +int anglefixed_test(void) +{ + int ret=0; + float f; + + hermite Hermie; + etl::clock timer; + angle tmp; + double t; + + Hermie.p1()=angle::degrees(0); + Hermie.t1()=angle::degrees(45); + + Hermie.p2()=angle::degrees(-45); + Hermie.t2()=angle::degrees(180); + + Hermie.sync(); + + + for(f=0.0f,timer.reset();f<1.001f;f+=0.0005f) + { + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + tmp+=Hermie(f)+Hermie(f+0.1f); + } + t=timer(); + + fprintf(stderr,"angle fixed time=%f milliseconds\n",t*1000); + + return ret; +} + +int float_intersection_test() +{ + int ret=0; + + hermite curve1(0,1,0,1); + hermite curve2(-1,2,-1,-2); + double t1,t2; + float d; + + t1=curve1.intersect(curve2); + t2=curve2.intersect(curve1); + + d=curve1(t1)-curve2(t2); + + fprintf(stderr,"float:Intersection difference: %f (t1=%f, t2=%f)\n",d,t1,t2); + + if(d>0.01) + { + fprintf(stderr,"float:FAILED INTERSECTION TEST.\n"); + ret++; + } + + return ret; +} + +/* === E N T R Y P O I N T ================================================= */ + +int main() +{ + int error=0; + + error+=basic_test(); + error+=angle_test(); + error+=fixed_test(); + error+=float_intersection_test(); + return error; +}