to_x, to_y, to_r, to_t convert between polar coordinates (in degrees) and Cartesian coordinates. to_degrees and to_radians converts between degrees and radians. AA_to_R and R_to_AA convert back and forth between (post-multiplied) rotation matrix and axis-angle representations of 3D rotations. R_x, R_y, and R_z build (post-multiplied) rotation matrices for simple rotations around the x, y, and z axes.

AA_to_R(angle = 0, axis_x = 0, axis_y = 0, axis_z = NA, ...)

R_to_AA(R = diag(3))

R_x(angle = 0)

R_y(angle = 0)

R_z(angle = 0)

to_degrees(t)

to_x(t, r)

to_y(t, r)

to_r(x, y)

to_t(x, y)

## Arguments

angle Angle in degrees (counter-clockwise) First coordinate of the axis unit vector. Second coordinate of the axis unit vector. Third coordinate of the axis unit vector (usually inferred). Ignored 3D rotation matrix (post-multiplied) Angle in degrees (counter-clockwise) Radial distance Cartesian x coordinate Cartesian y coordinate

## Details

pp_cfg uses polar coordinates to determine where the "primary" and "directional" symbols are located on a game piece. They are also useful for drawing certain shapes and for making game diagrams on hex boards.

piecepackr and grid functions use angles in degrees but the base trigonometry functions usually use radians.

piecepackr's 3D graphics functions save_piece_obj, piece, and piece3d use the axis-angle representation for 3D rotations. The axis-angle representation involves specifying a unit vector indicating the direction of an axis of rotation and an angle describing the (counter-clockwise) rotation around that axis. Because it is a unit vector one only needs to specify the first two elements, axis_x and axis_y, and we are able to infer the 3rd element axis_z. The default of axis = 0, axis_y = 0, and implied axis_z = 1 corresponds to a rotation around the z-axis which is reverse-compatible with the originally 2D angle interpretation in grid.piece. In order to figure out the appropriate axis-angle representation parameters R_to_AA, R_x, R_y, and R_z allow one to first come up with an appropriate (post-multiplied) 3D rotation matrix by chaining simple rotations and then convert them to the corresponding axis-angle representation. Pieces are rotated as if their center was at the origin.

https://en.wikipedia.org/wiki/Axis-angle_representation for more details about the Axis-angle representation of 3D rotations. See Trig for R's built-in trigonometric functions.

## Examples

 to_x(90, 1)
#>  6.123234e-17 to_y(180, 0.5)
#>  6.123234e-17 to_t(0, -1)
#>  -90 to_r(0.5, 0)
#>  TRUE # default axis-angle axis is equivalent to a rotation about the z-axis
all.equal(AA_to_R(angle=60), R_z(angle=60))
#>  TRUE # axis-angle representation of 90 rotation about the x-axis
R_to_AA(R_x(90))
#> $angle #>  90 #> #>$axis_x
#>  1
#>
#> $axis_y #>  0 #> #>$axis_z
#>  0
#>  # find Axis-Angle representation of first rotating about x-axis 180 degrees
# and then rotating about z-axis 45 degrees
R_to_AA(R_x(180) %*% R_z(45))
#> $angle #>  180 #> #>$axis_x
#>  0.9238795
#>
#> $axis_y #>  0.3826834 #> #>$axis_z
#>  0
#>