9fans.net/go@v0.0.5/draw/icossin2.go (about)

     1  package draw
     2  
     3  const ICOSSCALE = 1024
     4  
     5  /*
     6   * Sine and Cosine of arctangents, calculated by
     7   *   (sin(atan(index/100.0))*1024.+0.5)
     8   *   (cos(atan(index/100.0))*1024.+0.5)
     9   * To use, get rational tangent between 0<=tan<=1, scale by 100,
    10   * and look up sin and cos, and use linear interpolation.  divide by 1024.
    11   * Maximum error is 0.0020.  Without linear interpolation, it's 0.010.
    12   */
    13  var sinus1 = [...]int16{
    14  	0,   /* 0.00 */
    15  	10,  /* 0.01 */
    16  	20,  /* 0.02 */
    17  	31,  /* 0.03 */
    18  	41,  /* 0.04 */
    19  	51,  /* 0.05 */
    20  	61,  /* 0.06 */
    21  	72,  /* 0.07 */
    22  	82,  /* 0.08 */
    23  	92,  /* 0.09 */
    24  	102, /* 0.10 */
    25  	112, /* 0.11 */
    26  	122, /* 0.12 */
    27  	132, /* 0.13 */
    28  	142, /* 0.14 */
    29  	152, /* 0.15 */
    30  	162, /* 0.16 */
    31  	172, /* 0.17 */
    32  	181, /* 0.18 */
    33  	191, /* 0.19 */
    34  	201, /* 0.20 */
    35  	210, /* 0.21 */
    36  	220, /* 0.22 */
    37  	230, /* 0.23 */
    38  	239, /* 0.24 */
    39  	248, /* 0.25 */
    40  	258, /* 0.26 */
    41  	267, /* 0.27 */
    42  	276, /* 0.28 */
    43  	285, /* 0.29 */
    44  	294, /* 0.30 */
    45  	303, /* 0.31 */
    46  	312, /* 0.32 */
    47  	321, /* 0.33 */
    48  	330, /* 0.34 */
    49  	338, /* 0.35 */
    50  	347, /* 0.36 */
    51  	355, /* 0.37 */
    52  	364, /* 0.38 */
    53  	372, /* 0.39 */
    54  	380, /* 0.40 */
    55  	388, /* 0.41 */
    56  	397, /* 0.42 */
    57  	405, /* 0.43 */
    58  	412, /* 0.44 */
    59  	420, /* 0.45 */
    60  	428, /* 0.46 */
    61  	436, /* 0.47 */
    62  	443, /* 0.48 */
    63  	451, /* 0.49 */
    64  	458, /* 0.50 */
    65  	465, /* 0.51 */
    66  	472, /* 0.52 */
    67  	480, /* 0.53 */
    68  	487, /* 0.54 */
    69  	493, /* 0.55 */
    70  	500, /* 0.56 */
    71  	507, /* 0.57 */
    72  	514, /* 0.58 */
    73  	520, /* 0.59 */
    74  	527, /* 0.60 */
    75  	533, /* 0.61 */
    76  	540, /* 0.62 */
    77  	546, /* 0.63 */
    78  	552, /* 0.64 */
    79  	558, /* 0.65 */
    80  	564, /* 0.66 */
    81  	570, /* 0.67 */
    82  	576, /* 0.68 */
    83  	582, /* 0.69 */
    84  	587, /* 0.70 */
    85  	593, /* 0.71 */
    86  	598, /* 0.72 */
    87  	604, /* 0.73 */
    88  	609, /* 0.74 */
    89  	614, /* 0.75 */
    90  	620, /* 0.76 */
    91  	625, /* 0.77 */
    92  	630, /* 0.78 */
    93  	635, /* 0.79 */
    94  	640, /* 0.80 */
    95  	645, /* 0.81 */
    96  	649, /* 0.82 */
    97  	654, /* 0.83 */
    98  	659, /* 0.84 */
    99  	663, /* 0.85 */
   100  	668, /* 0.86 */
   101  	672, /* 0.87 */
   102  	676, /* 0.88 */
   103  	681, /* 0.89 */
   104  	685, /* 0.90 */
   105  	689, /* 0.91 */
   106  	693, /* 0.92 */
   107  	697, /* 0.93 */
   108  	701, /* 0.94 */
   109  	705, /* 0.95 */
   110  	709, /* 0.96 */
   111  	713, /* 0.97 */
   112  	717, /* 0.98 */
   113  	720, /* 0.99 */
   114  	724, /* 1.00 */
   115  	728, /* 1.01 */
   116  }
   117  
   118  var cosinus1 = [...]int16{
   119  	1024, /* 0.00 */
   120  	1024, /* 0.01 */
   121  	1024, /* 0.02 */
   122  	1024, /* 0.03 */
   123  	1023, /* 0.04 */
   124  	1023, /* 0.05 */
   125  	1022, /* 0.06 */
   126  	1022, /* 0.07 */
   127  	1021, /* 0.08 */
   128  	1020, /* 0.09 */
   129  	1019, /* 0.10 */
   130  	1018, /* 0.11 */
   131  	1017, /* 0.12 */
   132  	1015, /* 0.13 */
   133  	1014, /* 0.14 */
   134  	1013, /* 0.15 */
   135  	1011, /* 0.16 */
   136  	1010, /* 0.17 */
   137  	1008, /* 0.18 */
   138  	1006, /* 0.19 */
   139  	1004, /* 0.20 */
   140  	1002, /* 0.21 */
   141  	1000, /* 0.22 */
   142  	998,  /* 0.23 */
   143  	996,  /* 0.24 */
   144  	993,  /* 0.25 */
   145  	991,  /* 0.26 */
   146  	989,  /* 0.27 */
   147  	986,  /* 0.28 */
   148  	983,  /* 0.29 */
   149  	981,  /* 0.30 */
   150  	978,  /* 0.31 */
   151  	975,  /* 0.32 */
   152  	972,  /* 0.33 */
   153  	969,  /* 0.34 */
   154  	967,  /* 0.35 */
   155  	963,  /* 0.36 */
   156  	960,  /* 0.37 */
   157  	957,  /* 0.38 */
   158  	954,  /* 0.39 */
   159  	951,  /* 0.40 */
   160  	947,  /* 0.41 */
   161  	944,  /* 0.42 */
   162  	941,  /* 0.43 */
   163  	937,  /* 0.44 */
   164  	934,  /* 0.45 */
   165  	930,  /* 0.46 */
   166  	927,  /* 0.47 */
   167  	923,  /* 0.48 */
   168  	920,  /* 0.49 */
   169  	916,  /* 0.50 */
   170  	912,  /* 0.51 */
   171  	909,  /* 0.52 */
   172  	905,  /* 0.53 */
   173  	901,  /* 0.54 */
   174  	897,  /* 0.55 */
   175  	893,  /* 0.56 */
   176  	890,  /* 0.57 */
   177  	886,  /* 0.58 */
   178  	882,  /* 0.59 */
   179  	878,  /* 0.60 */
   180  	874,  /* 0.61 */
   181  	870,  /* 0.62 */
   182  	866,  /* 0.63 */
   183  	862,  /* 0.64 */
   184  	859,  /* 0.65 */
   185  	855,  /* 0.66 */
   186  	851,  /* 0.67 */
   187  	847,  /* 0.68 */
   188  	843,  /* 0.69 */
   189  	839,  /* 0.70 */
   190  	835,  /* 0.71 */
   191  	831,  /* 0.72 */
   192  	827,  /* 0.73 */
   193  	823,  /* 0.74 */
   194  	819,  /* 0.75 */
   195  	815,  /* 0.76 */
   196  	811,  /* 0.77 */
   197  	807,  /* 0.78 */
   198  	804,  /* 0.79 */
   199  	800,  /* 0.80 */
   200  	796,  /* 0.81 */
   201  	792,  /* 0.82 */
   202  	788,  /* 0.83 */
   203  	784,  /* 0.84 */
   204  	780,  /* 0.85 */
   205  	776,  /* 0.86 */
   206  	773,  /* 0.87 */
   207  	769,  /* 0.88 */
   208  	765,  /* 0.89 */
   209  	761,  /* 0.90 */
   210  	757,  /* 0.91 */
   211  	754,  /* 0.92 */
   212  	750,  /* 0.93 */
   213  	746,  /* 0.94 */
   214  	742,  /* 0.95 */
   215  	739,  /* 0.96 */
   216  	735,  /* 0.97 */
   217  	731,  /* 0.98 */
   218  	728,  /* 0.99 */
   219  	724,  /* 1.00 */
   220  	720,  /* 1.01 */
   221  }
   222  
   223  // IntCosSin2 returns scaled integers representing the cosine and sine
   224  // of the angle defined by the point (x, y).
   225  // The values are scaled by ICOSSCALE (1024), so that cos(0) is 1024.
   226  // IntCosSin2 is to IntCosSin what math.Atan2 is to math.Atan.
   227  func IntCosSin2(x, y int) (cos, sin int) {
   228  	if x == 0 {
   229  		if y >= 0 {
   230  			sin, cos = ICOSSCALE, 0
   231  		} else {
   232  			sin, cos = -ICOSSCALE, 0
   233  		}
   234  		return
   235  	}
   236  
   237  	sinsign := 1
   238  	cossign := 1
   239  	if x < 0 {
   240  		cossign = -1
   241  		x = -x
   242  	}
   243  	if y < 0 {
   244  		sinsign = -1
   245  		y = -y
   246  	}
   247  	var tan, tan10 int
   248  	var stp, ctp []int16
   249  	if y > x {
   250  		tan = 1000 * x / y
   251  		tan10 = tan / 10
   252  		stp = cosinus1[tan10:]
   253  		ctp = sinus1[tan10:]
   254  	} else {
   255  		tan = 1000 * y / x
   256  		tan10 = tan / 10
   257  		stp = sinus1[tan10:]
   258  		ctp = cosinus1[tan10:]
   259  	}
   260  	rem := tan - tan10*10
   261  	sin = sinsign * (int(stp[0]) + int(stp[1]-stp[0])*rem/10)
   262  	cos = cossign * (int(ctp[0]) + int(ctp[1]-ctp[0])*rem/10)
   263  	return
   264  }