ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

test_trig.c
Go to the documentation of this file.
00001 #include <ft2build.h>
00002 #include FT_FREETYPE_H
00003 #include FT_TRIGONOMETRY_H
00004 
00005 #include <math.h>
00006 #include <stdio.h>
00007 
00008 #define  PI   3.14159265358979323846
00009 #define  SPI  (PI/FT_ANGLE_PI)
00010 
00011 /* the precision in 16.16 fixed float points of the checks. Expect */
00012 /* between 2 and 5 noise LSB bits during operations, due to        */
00013 /* rounding errors..                                               */
00014 #define  THRESHOLD  64
00015 
00016   static  error = 0;
00017 
00018   static void
00019   test_cos( void )
00020   {
00021     FT_Fixed  f1, f2;
00022     double    d1, d2;
00023     int       i;
00024 
00025     for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00026     {
00027       f1 = FT_Cos(i);
00028       d1 = f1/65536.0;
00029       d2 = cos( i*SPI );
00030       f2 = (FT_Fixed)(d2*65536.0);
00031 
00032       if ( abs( f2-f1 ) > THRESHOLD )
00033       {
00034         error = 1;
00035         printf( "FT_Cos[%3d] = %.7f  cos[%3d] = %.7f\n",
00036                 (i >> 16), f1/65536.0, (i >> 16), d2 );
00037       }
00038     }
00039   }
00040 
00041 
00042 
00043   static void
00044   test_sin( void )
00045   {
00046     FT_Fixed  f1, f2;
00047     double    d1, d2;
00048     int       i;
00049 
00050     for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00051     {
00052       f1 = FT_Sin(i);
00053       d1 = f1/65536.0;
00054       d2 = sin( i*SPI );
00055       f2 = (FT_Fixed)(d2*65536.0);
00056 
00057       if ( abs( f2-f1 ) > THRESHOLD )
00058       {
00059         error = 1;
00060         printf( "FT_Sin[%3d] = %.7f  sin[%3d] = %.7f\n",
00061                 (i >> 16), f1/65536.0, (i >> 16), d2 );
00062       }
00063     }
00064   }
00065 
00066 
00067   static void
00068   test_tan( void )
00069   {
00070     FT_Fixed  f1, f2;
00071     double    d1, d2;
00072     int       i;
00073 
00074     for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 )
00075     {
00076       f1 = FT_Tan(i);
00077       d1 = f1/65536.0;
00078       d2 = tan( i*SPI );
00079       f2 = (FT_Fixed)(d2*65536.0);
00080 
00081       if ( abs( f2-f1 ) > THRESHOLD )
00082       {
00083         error = 1;
00084         printf( "FT_Tan[%3d] = %.7f  tan[%3d] = %.7f\n",
00085                 (i >> 16), f1/65536.0, (i >> 16), d2 );
00086       }
00087     }
00088   }
00089 
00090 
00091   static void
00092   test_atan2( void )
00093   {
00094     FT_Fixed  c2, s2;
00095     double    l, a, c1, s1;
00096     int       i, j;
00097 
00098     for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00099     {
00100       l  = 5.0;
00101       a  = i*SPI;
00102 
00103       c1 = l * cos(a);
00104       s1 = l * sin(a);
00105 
00106       c2 = (FT_Fixed)(c1*65536.0);
00107       s2 = (FT_Fixed)(s1*65536.0);
00108 
00109       j  = FT_Atan2( c2, s2 );
00110       if ( j < 0 )
00111         j += FT_ANGLE_2PI;
00112 
00113       if ( abs( i - j ) > 1 )
00114       {
00115         printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n",
00116                 c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 );
00117       }
00118     }
00119   }
00120 
00121   static void
00122   test_unit( void )
00123   {
00124     FT_Vector  v;
00125     double     a, c1, s1;
00126     FT_Fixed   c2, s2;
00127     int        i;
00128 
00129     for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00130     {
00131       FT_Vector_Unit( &v, i );
00132       a  = ( i*SPI );
00133       c1 = cos(a);
00134       s1 = sin(a);
00135       c2 = (FT_Fixed)(c1*65536.0);
00136       s2 = (FT_Fixed)(s1*65536.0);
00137 
00138       if ( abs( v.x-c2 ) > THRESHOLD ||
00139            abs( v.y-s2 ) > THRESHOLD )
00140       {
00141         error = 1;
00142         printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f )  vec = ( %.7f, %.7f )\n",
00143                 (i >> 16),
00144                 v.x/65536.0, v.y/65536.0,
00145                 c1, s1 );
00146       }
00147     }
00148   }
00149 
00150 
00151   static void
00152   test_length( void )
00153   {
00154     FT_Vector  v;
00155     FT_Fixed   l, l2;
00156     int        i;
00157 
00158     for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00159     {
00160       l   = (FT_Fixed)(500.0*65536.0);
00161       v.x = (FT_Fixed)( l * cos( i*SPI ) );
00162       v.y = (FT_Fixed)( l * sin( i*SPI ) );
00163       l2  = FT_Vector_Length( &v );
00164 
00165       if ( abs( l2-l ) > THRESHOLD )
00166       {
00167         error = 1;
00168         printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n",
00169                 v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 );
00170       }
00171     }
00172   }
00173 
00174 
00175   static void
00176   test_rotate( void )
00177   {
00178     FT_Fixed  c2, s2, c4, s4;
00179     FT_Vector v;
00180     double    l, ra, a, c1, s1, cra, sra, c3, s3;
00181     int       i, j, rotate;
00182 
00183     for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 )
00184     {
00185       ra  = rotate*SPI;
00186       cra = cos( ra );
00187       sra = sin( ra );
00188 
00189       for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
00190       {
00191         l  = 500.0;
00192         a  = i*SPI;
00193 
00194         c1 = l * cos(a);
00195         s1 = l * sin(a);
00196 
00197         v.x = c2 = (FT_Fixed)(c1*65536.0);
00198         v.y = s2 = (FT_Fixed)(s1*65536.0);
00199 
00200         FT_Vector_Rotate( &v, rotate );
00201 
00202         c3 = c1 * cra - s1 * sra;
00203         s3 = c1 * sra + s1 * cra;
00204 
00205         c4 = (FT_Fixed)(c3*65536.0);
00206         s4 = (FT_Fixed)(s3*65536.0);
00207 
00208         if ( abs( c4 - v.x ) > THRESHOLD ||
00209              abs( s4 - v.y ) > THRESHOLD )
00210         {
00211           error = 1;
00212           printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n",
00213                   c1, s1, ra,
00214                   c2/65536.0, s2/65536.0,
00215                   c4/65536.0, s4/65536.0 );
00216         }
00217       }
00218     }
00219   }
00220 
00221 
00222   int main( void )
00223   {
00224     test_cos();
00225     test_sin();
00226     test_tan();
00227     test_atan2();
00228     test_unit();
00229     test_length();
00230     test_rotate();
00231 
00232     if (!error)
00233       printf( "trigonometry test ok !\n" );
00234 
00235     return !error;
00236   }

Generated on Sat May 26 2012 04:32:57 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.