## Trigonometry

Solidity library offering basic trigonometry functions where inputs and outputs are integers. Inputs are specified in radians scaled by 1e18, and similarly outputs are scaled by 1e18.

This implementation is based off the Solidity trigonometry library written by Lefteris Karapetsas which can be found here: https://github.com/Sikorkaio/sikorka/blob/e75c91925c914beaedf4841c0336a806f2b5f66d/contracts/trigonometry.sol

Compared to Lefteris' implementation, this version makes the following changes: - Uses a 32 bits instead of 16 bits for improved accuracy - Updated for Solidity 0.8.x - Various gas optimizations - Change inputs/outputs to standard trig format (scaled by 1e18) instead of requiring the integer format used by the algorithm

Lefertis' implementation is based off Dave Dribin's trigint C library http://www.dribin.org/dave/trigint/

Which in turn is based from a now deleted article which can be found in the Wayback Machine: http://web.archive.org/web/20120301144605/http://www.dattalo.com/technical/software/pic/picsine.html

### INDEX_WIDTH

``````uint256 INDEX_WIDTH
``````

### INTERP_WIDTH

``````uint256 INTERP_WIDTH
``````

### INDEX_OFFSET

``````uint256 INDEX_OFFSET
``````

### INTERP_OFFSET

``````uint256 INTERP_OFFSET
``````

### ANGLES_IN_CYCLE

``````uint32 ANGLES_IN_CYCLE
``````

``````uint32 QUADRANT_HIGH_MASK
``````

``````uint32 QUADRANT_LOW_MASK
``````

### SINE_TABLE_SIZE

``````uint256 SINE_TABLE_SIZE
``````

### PI

``````uint256 PI
``````

### TWO_PI

``````uint256 TWO_PI
``````

### PI_OVER_TWO

``````uint256 PI_OVER_TWO
``````

### entry_bytes

``````uint8 entry_bytes
``````

``````uint256 entry_mask
``````

### sin_table

``````bytes sin_table
``````

### sin

``````function sin(uint256 _angle) internal pure returns (int256)
``````

Return the sine of a value, specified in radians scaled by 1e18

This algorithm for converting sine only uses integer values, and it works by dividing the circle into 30 bit angles, i.e. there are 1,073,741,824 (2^30) angle units, instead of the standard 360 degrees (2pi radians). From there, we get an output in range -2,147,483,647 to 2,147,483,647, (which is the max value of an int32) which is then converted back to the standard range of -1 to 1, again scaled by 1e18

Name Type Description
_angle uint256 Angle to convert
Name Type Description
[0] int256 Result scaled by 1e18

### cos

``````function cos(uint256 _angle) internal pure returns (int256)
``````

Return the cosine of a value, specified in radians scaled by 1e18

This is identical to the sin() method, and just computes the value by delegating to the sin() method using the identity cos(x) = sin(x + pi/2) Overflow when `angle + PI_OVER_TWO > type(uint256).max` is ok, results are still accurate

Name Type Description
_angle uint256 Angle to convert
Name Type Description
[0] int256 Result scaled by 1e18