/*! ========================================================================
** Extended Template and Library Test Suite
** Angle Class Test
-** $Id: angle.cpp,v 1.1.1.1 2005/01/04 01:31:48 darco Exp $
+** $Id$
**
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2008 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
{
int ret=0;
float largest_error;
-
+
{
angle theta;
fastangle theta2;
float error;
largest_error=0.0f;
-
+
for(
theta=angle::degrees(0),theta2=fastangle::degrees(0);
theta<=angle::degrees(360);
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest SIN error: (+/-)%f\n",largest_error);
if(largest_error>0.075)ret++;
-
+
{
angle theta;
fastangle theta2;
float error;
largest_error=0.0f;
-
+
for(
theta=angle::degrees(0),theta2=fastangle::degrees(0);
theta<=angle::degrees(360);
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest COS error: (+/-)%f\n",largest_error);
double val;
float error;
largest_error=0.0f;
-
+
for(
val=-1.0f;
val<1.0f;
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest ASIN error: (+/-)%frad\n",largest_error);
double val;
float error;
largest_error=0.0f;
-
+
for(
val=-1.0f;
val<1.0f;
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest ACOS error: (+/-)%frad\n",largest_error);
fastangle theta2;
float error;
largest_error=0.0f;
-
+
for(
theta=angle::degrees(0),theta2=fastangle::degrees(0);
theta<angle::degrees(360);
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest TAN error: (+/-)%f\n",largest_error);
double val;
float error;
largest_error=0.0f;
-
+
for(
val=-4.0f;
val<4.0f;
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest ATAN error: (+/-)%frad\n",largest_error);
angle theta;
float error;
largest_error=0.0f;
-
+
for(
theta=angle::degrees(-179);
theta<angle::degrees(180);
largest_error=error;
if(error < -largest_error)
largest_error=-error;
-
+
}
}
printf("fastangle: Largest ATAN2 error: (+/-)%frad\n",largest_error);
printf("constant tests: %f==%f\n",
(float)angle::degrees(angle::tan(-1.0)).get(),
(float)fastangle::degrees(fastangle::tan(-1.0)).get());
-
+
return ret;
}
{
Angle a,b,c,d;
float tmp,tmp2;
-
+
for(tmp=-1.0;tmp<1.0;tmp+=0.000002)
{
a=(typename Angle::cos)(tmp);
tmp2=((typename Angle::cos)(a)).get();
tmp2=((typename Angle::cos)(b)).get();
tmp2=((typename Angle::cos)(c)).get();
- tmp2=((typename Angle::cos)(d)).get();
+ tmp2=((typename Angle::cos)(d)).get();
}
}
template <class Angle>
{
Angle a,b,c,d;
float tmp,tmp2;
-
+
for(tmp=-1.0;tmp<1.0;tmp+=0.000002)
{
a=(typename Angle::sin)(tmp);
tmp2=((typename Angle::sin)(a)).get();
tmp2=((typename Angle::sin)(b)).get();
tmp2=((typename Angle::sin)(c)).get();
- tmp2=((typename Angle::sin)(d)).get();
+ tmp2=((typename Angle::sin)(d)).get();
}
}
template <class Angle>
{
Angle a,b,c,d;
float tmp,tmp2;
-
+
for(tmp=-1.0;tmp<1.0;tmp+=0.000002)
{
a=(typename Angle::tan)(tmp);
tmp2=((typename Angle::tan)(a)).get();
tmp2=((typename Angle::tan)(b)).get();
tmp2=((typename Angle::tan)(c)).get();
- tmp2=((typename Angle::tan)(d)).get();
+ tmp2=((typename Angle::tan)(d)).get();
}
}
template <class Angle, class mytan>
{
Angle a,b,c;
float x,y;
-
+
for(y=-10.0;y<10.0;y+=0.05)
for(x=-10.0;x<10.0;x+=0.05)
{
fastangle_atan2_time,
angle_sin_time,
fastangle_sin_time ;
-
+
etl::clock MyTimer;
-
+
MyTimer.reset();
angle_cos_speed_test<angle>();
angle_cos_time=MyTimer();
printf("angle: Cosine test: %f seconds\n",angle_cos_time);
-
+
MyTimer.reset();
angle_cos_speed_test<fastangle>();
fastangle_cos_time=MyTimer();
printf("fastangle: Cosine test: %f seconds\n",fastangle_cos_time);
printf("fastangle is %.02f%% faster\n",(angle_cos_time/fastangle_cos_time)*100.0-100.0);
-
+
MyTimer.reset();
angle_sin_speed_test<angle>();
angle_sin_time=MyTimer();
printf("angle: Sine test: %f seconds\n",angle_sin_time);
-
+
MyTimer.reset();
angle_sin_speed_test<fastangle>();
fastangle_sin_time=MyTimer();
angle_tan_speed_test<angle>();
angle_tan_time=MyTimer();
printf("angle: Tangent test: %f seconds\n",angle_tan_time);
-
+
MyTimer.reset();
angle_tan_speed_test<fastangle>();
fastangle_tan_time=MyTimer();
angle_atan2_speed_test<angle,angle::tan>();
angle_atan2_time=MyTimer();
printf("angle: arcTangent2 test: %f seconds\n",angle_atan2_time);
-
+
MyTimer.reset();
angle_atan2_speed_test<fastangle,fastangle::tan>();
fastangle_atan2_time=MyTimer();
printf("fastangle: arcTangent2 test: %f seconds\n",fastangle_atan2_time);
- printf("fastangle is %.02f%% faster\n",(angle_atan2_time/fastangle_atan2_time)*100.0-100.0);
-
+ printf("fastangle is %.02f%% faster\n",(angle_atan2_time/fastangle_atan2_time)*100.0-100.0);
+
return ret;
}
{
int ret=0;
float dist;
-
+
dist=angle::deg(angle::deg(330).dist(angle::deg(30))).get();
printf("angle: angular difference between 330deg and 30deg is %0.1fdeg\n",dist);
- if(floor(dist+0.5)!=-60)
+ if(floor(dist+0.5)!=300)
{
- printf("angle: error: should be -60deg!\n");
+ printf("angle: error: should be 300deg!\n");
ret++;
- }
+ }
dist=angle::deg(angle::deg(30).dist(angle::deg(330))).get();
printf("angle: angular difference between 30deg and 330deg is %0.1fdeg\n",dist);
- if(floor(dist+0.5)!=60)
+ if(floor(dist+0.5)!=-300)
{
- printf("angle: error: should be 60deg!\n");
+ printf("angle: error: should be -300deg!\n");
ret++;
- }
+ }
dist=angle::deg(angle::deg(30).dist(angle::deg(-30))).get();
printf("angle: angular difference between 30deg and -30deg is %0.1fdeg\n",dist);
{
printf("angle: error: should be 60deg!\n");
ret++;
- }
+ }
dist=angle::deg(angle::deg(-30).dist(angle::deg(30))).get();
printf("angle: angular difference between -30deg and 30deg is %0.1fdeg\n",dist);
{
printf("angle: error: should be -60deg!\n");
ret++;
- }
+ }
dist=angle::deg(angle::deg(20).dist(angle::deg(195))).get();
printf("angle: angular difference between 20deg and 195deg is %0.1fdeg\n",dist);
{
printf("angle: error: should be -175deg!\n");
ret++;
- }
+ }
dist=angle::deg(angle::deg(20).dist(angle::deg(205))).get();
printf("angle: angular difference between 20deg and 205deg is %0.1fdeg\n",dist);
- if(floor(dist+0.5)!=175)
+ if(floor(dist+0.5)!=-185)
{
- printf("angle: error: should be 175deg!\n");
+ printf("angle: error: should be -185deg!\n");
ret++;
- }
+ }
int i;
for(i=-1000;i<1000;i++)
{
dist=angle::deg(angle::deg(20+i+360).dist(angle::deg(205+i-360))).get();
- if(floor(dist+0.5)!=175)
+ if(floor(dist+0.5)!=535)
{
printf("angle: error: Badness at %d!\n",i);
ret++;
- }
-
+ }
+
}
for(i=-1000;i<1000;i++)
{
dist=angle::deg(angle::deg(20+i-360).dist(angle::deg(195+i+360))).get();
- if(floor(dist+0.5)!=-175)
+ if(floor(dist+0.5)!=-895)
{
printf("angle: error: Badness at %d!\n",i);
ret++;
- }
-
+ }
+
}
angle b(angle::deg(200));
affine_combo<angle> combo;
-
+
hermite<angle> hermie(a,b,b.dist(a),b.dist(a));
-
+
for(f=0;f<1.001;f+=0.1)
{
printf("@%f--affine_combo: %f hermie: %f\n",angle::deg(f).get(),angle::deg(combo(a,b,f)).get(),angle::deg(hermie(f)).get());
}
-
+
}
return ret;
int main()
{
int error=0;
-
+
error+=fastangle_test();
error+=fastangle_speed_test();
error+=angle_test();
-
+
return error;
}