misc/libfreetype/src/tools/cordic.py
changeset 9372 915436ff64ab
parent 9371 f3840de881bd
child 9373 b769a8e38cbd
equal deleted inserted replaced
9371:f3840de881bd 9372:915436ff64ab
     1 # compute arctangent table for CORDIC computations in fttrigon.c
       
     2 import sys, math
       
     3 
       
     4 #units  = 64*65536.0   # don't change !!
       
     5 units  = 256
       
     6 scale  = units/math.pi
       
     7 shrink = 1.0
       
     8 comma  = ""
       
     9 
       
    10 def calc_val( x ):
       
    11     global units, shrink
       
    12     angle  = math.atan(x)
       
    13     shrink = shrink * math.cos(angle)
       
    14     return angle/math.pi * units
       
    15 
       
    16 def  print_val( n, x ):
       
    17     global comma
       
    18 
       
    19     lo  = int(x)
       
    20     hi  = lo + 1
       
    21     alo = math.atan(lo)
       
    22     ahi = math.atan(hi)
       
    23     ax  = math.atan(2.0**n)
       
    24 
       
    25     errlo = abs( alo - ax )
       
    26     errhi = abs( ahi - ax )
       
    27 
       
    28     if ( errlo < errhi ):
       
    29       hi = lo
       
    30 
       
    31     sys.stdout.write( comma + repr( int(hi) ) )
       
    32     comma = ", "
       
    33 
       
    34 
       
    35 print ""
       
    36 print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units"
       
    37 
       
    38 # compute range of "i"
       
    39 r = [-1]
       
    40 r = r + range(32)
       
    41 
       
    42 for n in r:
       
    43 
       
    44     if n >= 0:
       
    45         x = 1.0/(2.0**n)    # tangent value
       
    46     else:
       
    47         x = 2.0**(-n)
       
    48 
       
    49     angle  = math.atan(x)    # arctangent
       
    50     angle2 = angle*scale     # arctangent in FT_Angle units
       
    51 
       
    52     # determine which integer value for angle gives the best tangent
       
    53     lo  = int(angle2)
       
    54     hi  = lo + 1
       
    55     tlo = math.tan(lo/scale)
       
    56     thi = math.tan(hi/scale)
       
    57 
       
    58     errlo = abs( tlo - x )
       
    59     errhi = abs( thi - x )
       
    60 
       
    61     angle2 = hi
       
    62     if errlo < errhi:
       
    63         angle2 = lo
       
    64 
       
    65     if angle2 <= 0:
       
    66         break
       
    67 
       
    68     sys.stdout.write( comma + repr( int(angle2) ) )
       
    69     comma = ", "
       
    70 
       
    71     shrink = shrink * math.cos( angle2/scale)
       
    72 
       
    73 
       
    74 print
       
    75 print "shrink factor    = " + repr( shrink )
       
    76 print "shrink factor 2  = " + repr( shrink * (2.0**32) )
       
    77 print "expansion factor = " + repr(1/shrink)
       
    78 print ""
       
    79