⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_trig.c

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 C
字号:
#include <ft2build.h>#include FT_FREETYPE_H#include FT_TRIGONOMETRY_H#include <math.h>#include <stdio.h>#define  PI   3.14159265358979323846#define  SPI  (PI/FT_ANGLE_PI)/* the precision in 16.16 fixed float points of the checks. Expect *//* between 2 and 5 noise LSB bits during operations, due to        *//* rounding errors..                                               */#define  THRESHOLD  64  static  error = 0;  static void  test_cos( void )  {    FT_Fixed  f1, f2;    double    d1, d2;    int       i;    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )    {      f1 = FT_Cos(i);      d1 = f1/65536.0;      d2 = cos( i*SPI );      f2 = (FT_Fixed)(d2*65536.0);      if ( abs( f2-f1 ) > THRESHOLD )      {        error = 1;        printf( "FT_Cos[%3d] = %.7f  cos[%3d] = %.7f\n",                (i >> 16), f1/65536.0, (i >> 16), d2 );      }    }  }  static void  test_sin( void )  {    FT_Fixed  f1, f2;    double    d1, d2;    int       i;    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )    {      f1 = FT_Sin(i);      d1 = f1/65536.0;      d2 = sin( i*SPI );      f2 = (FT_Fixed)(d2*65536.0);      if ( abs( f2-f1 ) > THRESHOLD )      {        error = 1;        printf( "FT_Sin[%3d] = %.7f  sin[%3d] = %.7f\n",                (i >> 16), f1/65536.0, (i >> 16), d2 );      }    }  }  static void  test_tan( void )  {    FT_Fixed  f1, f2;    double    d1, d2;    int       i;    for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 )    {      f1 = FT_Tan(i);      d1 = f1/65536.0;      d2 = tan( i*SPI );      f2 = (FT_Fixed)(d2*65536.0);      if ( abs( f2-f1 ) > THRESHOLD )      {        error = 1;        printf( "FT_Tan[%3d] = %.7f  tan[%3d] = %.7f\n",                (i >> 16), f1/65536.0, (i >> 16), d2 );      }    }  }  static void  test_atan2( void )  {    FT_Fixed  c2, s2;    double    l, a, c1, s1;    int       i, j;    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )    {      l  = 5.0;      a  = i*SPI;      c1 = l * cos(a);      s1 = l * sin(a);      c2 = (FT_Fixed)(c1*65536.0);      s2 = (FT_Fixed)(s1*65536.0);      j  = FT_Atan2( c2, s2 );      if ( j < 0 )        j += FT_ANGLE_2PI;      if ( abs( i - j ) > 1 )      {        printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n",                c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 );      }    }  }  static void  test_unit( void )  {    FT_Vector  v;    double     a, c1, s1;    FT_Fixed   c2, s2;    int        i;    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )    {      FT_Vector_Unit( &v, i );      a  = ( i*SPI );      c1 = cos(a);      s1 = sin(a);      c2 = (FT_Fixed)(c1*65536.0);      s2 = (FT_Fixed)(s1*65536.0);      if ( abs( v.x-c2 ) > THRESHOLD ||           abs( v.y-s2 ) > THRESHOLD )      {        error = 1;        printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f )  vec = ( %.7f, %.7f )\n",                (i >> 16),                v.x/65536.0, v.y/65536.0,                c1, s1 );      }    }  }  static void  test_length( void )  {    FT_Vector  v;    FT_Fixed   l, l2;    int        i;    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )    {      l   = (FT_Fixed)(500.0*65536.0);      v.x = (FT_Fixed)( l * cos( i*SPI ) );      v.y = (FT_Fixed)( l * sin( i*SPI ) );      l2  = FT_Vector_Length( &v );      if ( abs( l2-l ) > THRESHOLD )      {        error = 1;        printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n",                v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 );      }    }  }  static void  test_rotate( void )  {    FT_Fixed  c2, s2, c4, s4;    FT_Vector v;    double    l, ra, a, c1, s1, cra, sra, c3, s3;    int       i, j, rotate;    for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 )    {      ra  = rotate*SPI;      cra = cos( ra );      sra = sin( ra );      for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )      {        l  = 500.0;        a  = i*SPI;        c1 = l * cos(a);        s1 = l * sin(a);        v.x = c2 = (FT_Fixed)(c1*65536.0);        v.y = s2 = (FT_Fixed)(s1*65536.0);        FT_Vector_Rotate( &v, rotate );        c3 = c1 * cra - s1 * sra;        s3 = c1 * sra + s1 * cra;        c4 = (FT_Fixed)(c3*65536.0);        s4 = (FT_Fixed)(s3*65536.0);        if ( abs( c4 - v.x ) > THRESHOLD ||             abs( s4 - v.y ) > THRESHOLD )        {          error = 1;          printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n",                  c1, s1, ra,                  c2/65536.0, s2/65536.0,                  c4/65536.0, s4/65536.0 );        }      }    }  }  int main( void )  {    test_cos();    test_sin();    test_tan();    test_atan2();    test_unit();    test_length();    test_rotate();    if (!error)      printf( "trigonometry test ok !\n" );    return !error;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -