Skip to contents

Apply an affine transformation (rotation, scaling, shearing, etc.) to a shape using a 2x2 transformation matrix.

Usage

coo_affine(x, ..., .cols = NULL, .ldk_col = NULL)

Arguments

x

A matrix (nx2), list of matrices, or tibble with coo columns.

...

Additional arguments (reserved for future use).

.cols

Column name(s) to process when x is a tibble. If NULL, automatically detects columns containing coo objects.

mat

A 2x2 numeric matrix defining the affine transformation.

Value

  • If x is a single matrix: returns the transformed matrix

  • If x is a list: returns a list of transformed matrices

  • If x is a tibble: returns the tibble with specified coo columns transformed

Details

The transformation is applied as: x_new = x %*% mat

Common transformation matrices:

  • Rotation by angle θ: matrix(c(cos(θ), sin(θ), -sin(θ), cos(θ)), nrow = 2)

  • Scaling by sx, sy: matrix(c(sx, 0, 0, sy), nrow = 2)

  • Shear in x: matrix(c(1, 0, k, 1), nrow = 2)

See also

coo_rotate() for rotation; coo_shear_x() for shearing; coo_flip_xaxis() for flipping

Examples

# Rotation matrix
rot_mat <- matrix(c(cos(pi/4), sin(pi/4), -sin(pi/4), cos(pi/4)), nrow = 2)
coo_affine(shapes$cat, rot_mat)
#> <xy [120 x 2]>
#>       [,1]     [,2]    
#>  [1,]  185.262  -97.581
#>  [2,]  178.191  -98.995
#>  [3,]  181.019 -101.823
#>  [4,]  183.848 -107.480
#>  [5,]  181.726 -113.844
#>  [6,] ...      ...     
#>  [7,]  186.676 -123.037
#>  [8,]  183.848 -117.380
#>  [9,]  184.555 -109.602
#> [10,]  185.969 -102.530
#> [11,]  188.798  -96.874

# Scaling matrix
scale_mat <- matrix(c(2, 0, 0, 2), nrow = 2)
coo_affine(bot$coo, scale_mat)
#> $brahma
#> <xy [138 x 2]>
#>       [,1] [,2]
#>  [1,]   74 1122
#>  [2,]   80 1080
#>  [3,]   80 1058
#>  [4,]   86 1016
#>  [5,]   92  974
#>  [6,] ...  ... 
#>  [7,]   68 1312
#>  [8,]   66 1290
#>  [9,]   66 1248
#> [10,]   68 1206
#> [11,]   70 1186
#> 
#> $caney
#> <xy [168 x 2]>
#>       [,1] [,2]
#>  [1,]  106 1070
#>  [2,]  106 1050
#>  [3,]  108 1010
#>  [4,]  106  990
#>  [5,]  108  970
#>  [6,] ...  ... 
#>  [7,]  152 1232
#>  [8,]  134 1192
#>  [9,]  124 1170
#> [10,]  118 1150
#> [11,]  110 1110
#> 
#> $chimay
#> <xy [189 x 2]>
#>       [,1] [,2]
#>  [1,]  98  666 
#>  [2,]  98  650 
#>  [3,]  98  636 
#>  [4,] 100  620 
#>  [5,] 100  604 
#>  [6,] ...  ... 
#>  [7,] 118  758 
#>  [8,] 108  742 
#>  [9,] 102  728 
#> [10,]  98  712 
#> [11,]  96  696 
#> 
#> $corona
#> <xy [129 x 2]>
#>       [,1] [,2]
#>  [1,] 182  852 
#>  [2,] 182  832 
#>  [3,] 180  790 
#>  [4,] 182  770 
#>  [5,] 182  748 
#>  [6,] ...  ... 
#>  [7,]  236 1012
#>  [8,]  220  972
#>  [9,]  210  954
#> [10,]  202  932
#> [11,]  188  894
#> 
#> $deusventrue
#> <xy [152 x 2]>
#>       [,1] [,2]
#>  [1,] 148  962 
#>  [2,] 140  944 
#>  [3,] 124  908 
#>  [4,] 118  890 
#>  [5,] 104  850 
#>  [6,] ...  ... 
#>  [7,]  200 1110
#>  [8,]  194 1090
#>  [9,]  180 1054
#> [10,]  174 1036
#> [11,]  164 1000
#> 
#> $duvel
#> <xy [161 x 2]>
#>       [,1] [,2]
#>  [1,] 122  630 
#>  [2,] 122  608 
#>  [3,] 122  586 
#>  [4,] 122  586 
#>  [5,] 122  564 
#>  [6,] ...  ... 
#>  [7,] 148  738 
#>  [8,] 138  716 
#>  [9,] 130  696 
#> [10,] 130  696 
#> [11,] 126  674 
#> 
#> $franziskaner
#> <xy [124 x 2]>
#>       [,1] [,2]
#>  [1,] 108  878 
#>  [2,] 108  836 
#>  [3,] 108  816 
#>  [4,] 108  778 
#>  [5,] 108  758 
#>  [6,] ...  ... 
#>  [7,]  120 1064
#>  [8,]  118 1022
#>  [9,]  114 1002
#> [10,]  108  960
#> [11,]  108  940
#> 
#> $grimbergen
#> <xy [126 x 2]>
#>       [,1] [,2]
#>  [1,]  84  808 
#>  [2,]  80  788 
#>  [3,]  80  746 
#>  [4,]  80  724 
#>  [5,]  80  704 
#>  [6,] ...  ... 
#>  [7,] 148  974 
#>  [8,] 120  934 
#>  [9,] 108  912 
#> [10,] 100  892 
#> [11,]  88  850 
#> 
#> $guiness
#> <xy [183 x 2]>
#>       [,1] [,2]
#>  [1,] 138  770 
#>  [2,] 138  754 
#>  [3,] 138  738 
#>  [4,] 138  720 
#>  [5,] 138  688 
#>  [6,] ...  ... 
#>  [7,] 146  884 
#>  [8,] 142  866 
#>  [9,] 134  836 
#> [10,] 136  820 
#> [11,] 138  802 
#> 
#> $hoegardeen
#> <xy [193 x 2]>
#>       [,1] [,2]
#>  [1,]   84 1088
#>  [2,]   80 1062
#>  [3,]   80 1038
#>  [4,]   80 1012
#>  [5,]   80  986
#>  [6,] ...  ... 
#>  [7,]  116 1238
#>  [8,]  108 1212
#>  [9,]  102 1188
#> [10,]   94 1162
#> [11,]   92 1136
#> 
#> $jupiler
#> <xy [156 x 2]>
#>       [,1] [,2]
#>  [1,]  110 1030
#>  [2,]  108 1002
#>  [3,]  108  976
#>  [4,]  108  948
#>  [5,]  108  920
#>  [6,] ...  ... 
#>  [7,]  148 1194
#>  [8,]  138 1166
#>  [9,]  132 1140
#> [10,]  124 1112
#> [11,]  118 1084
#> 
#> $kingfisher
#> <xy [182 x 2]>
#>       [,1] [,2]
#>  [1,] 142  768 
#>  [2,] 142  748 
#>  [3,] 142  730 
#>  [4,] 142  710 
#>  [5,] 142  690 
#>  [6,] ...  ... 
#>  [7,] 162  884 
#>  [8,] 156  866 
#>  [9,] 152  846 
#> [10,] 146  826 
#> [11,] 146  806 
#> 
#> $latrappe
#> <xy [136 x 2]>
#>       [,1] [,2]
#>  [1,]  52  778 
#>  [2,]  50  754 
#>  [3,]  50  728 
#>  [4,]  50  704 
#>  [5,]  50  678 
#>  [6,] ...  ... 
#>  [7,]  56  928 
#>  [8,]  50  902 
#>  [9,]  52  878 
#> [10,]  52  852 
#> [11,]  52  828 
#> 
#> $lindemanskriek
#> <xy [176 x 2]>
#>       [,1] [,2]
#>  [1,] 120  854 
#>  [2,] 120  838 
#>  [3,] 110  808 
#>  [4,] 108  790 
#>  [5,] 108  774 
#>  [6,] ...  ... 
#>  [7,] 154  972 
#>  [8,] 150  956 
#>  [9,] 144  938 
#> [10,] 140  922 
#> [11,] 130  888 
#> 
#> $nicechouffe
#> <xy [146 x 2]>
#>       [,1] [,2]
#>  [1,] 164  722 
#>  [2,] 162  706 
#>  [3,] 154  672 
#>  [4,] 154  654 
#>  [5,] 152  638 
#>  [6,] ...  ... 
#>  [7,] 192  836 
#>  [8,] 186  820 
#>  [9,] 182  802 
#> [10,] 178  788 
#> [11,] 170  756 
#> 
#> $pecheresse
#> <xy [129 x 2]>
#>       [,1] [,2]
#>  [1,] 126  990 
#>  [2,] 122  952 
#>  [3,] 122  934 
#>  [4,] 120  894 
#>  [5,] 116  856 
#>  [6,] ...  ... 
#>  [7,]  172 1160
#>  [8,]  166 1140
#>  [9,]  156 1104
#> [10,]  146 1066
#> [11,]  142 1048
#> 
#> $sierranevada
#> <xy [176 x 2]>
#>       [,1] [,2]
#>  [1,] 122  690 
#>  [2,] 122  666 
#>  [3,] 122  666 
#>  [4,] 122  640 
#>  [5,] 122  616 
#>  [6,] ...  ... 
#>  [7,] 126  814 
#>  [8,] 122  788 
#>  [9,] 118  764 
#> [10,] 122  740 
#> [11,] 122  740 
#> 
#> $tanglefoot
#> <xy [174 x 2]>
#>       [,1] [,2]
#>  [1,]  96  734 
#>  [2,]  96  718 
#>  [3,]  96  702 
#>  [4,]  96  670 
#>  [5,]  98  654 
#>  [6,] ...  ... 
#>  [7,] 104  846 
#>  [8,]  98  830 
#>  [9,]  96  814 
#> [10,]  94  782 
#> [11,]  94  766 
#> 
#> $tauro
#> <xy [174 x 2]>
#>       [,1] [,2]
#>  [1,]  112 1030
#>  [2,]  108 1006
#>  [3,]  108  982
#>  [4,]  108  956
#>  [5,]  108  932
#>  [6,] ...  ... 
#>  [7,]  142 1174
#>  [8,]  136 1150
#>  [9,]  126 1126
#> [10,]  122 1102
#> [11,]  118 1076
#> 
#> $westmalle
#> <xy [141 x 2]>
#>       [,1] [,2]
#>  [1,] 140  788 
#>  [2,] 140  772 
#>  [3,] 134  738 
#>  [4,] 134  722 
#>  [5,] 132  688 
#>  [6,] ...  ... 
#>  [7,] 172  922 
#>  [8,] 166  904 
#>  [9,] 160  872 
#> [10,] 152  854 
#> [11,] 148  822 
#> 
#> $amrut
#> <xy [191 x 2]>
#>       [,1] [,2]
#>  [1,] 114  882 
#>  [2,] 114  862 
#>  [3,] 114  842 
#>  [4,] 114  822 
#>  [5,] 114  802 
#>  [6,] ...  ... 
#>  [7,]  110 1002
#>  [8,]  114  982
#>  [9,]  114  962
#> [10,]  114  942
#> [11,]  114  922
#> 
#> $ballantines
#> <xy [146 x 2]>
#>       [,1] [,2]
#>  [1,]  76  714 
#>  [2,]  76  682 
#>  [3,]  76  666 
#>  [4,]  76  636 
#>  [5,]  76  620 
#>  [6,] ...  ... 
#>  [7,]  76  856 
#>  [8,]  76  824 
#>  [9,]  76  808 
#> [10,]  76  776 
#> [11,]  76  762 
#> 
#> $bushmills
#> <xy [165 x 2]>
#>       [,1] [,2]
#>  [1,] 144  912 
#>  [2,] 144  882 
#>  [3,] 144  850 
#>  [4,] 144  850 
#>  [5,] 144  820 
#>  [6,] ...  ... 
#>  [7,]  140 1066
#>  [8,]  140 1036
#>  [9,]  140 1004
#> [10,]  140 1004
#> [11,]  140  974
#> 
#> $chivas
#> <xy [164 x 2]>
#>       [,1] [,2]
#>  [1,]  66  874 
#>  [2,]  62  858 
#>  [3,]  58  824 
#>  [4,]  58  808 
#>  [5,]  58  776 
#>  [6,] ...  ... 
#>  [7,]  162 1004
#>  [8,]  146  990
#>  [9,]  114  956
#> [10,]  102  940
#> [11,]   80  906
#> 
#> $dalmore
#> <xy [155 x 2]>
#>       [,1] [,2]
#>  [1,] 104  742 
#>  [2,]  94  718 
#>  [3,]  88  692 
#>  [4,]  84  668 
#>  [5,]  84  644 
#>  [6,] ...  ... 
#>  [7,] 204  860 
#>  [8,] 204  860 
#>  [9,] 178  838 
#> [10,] 154  816 
#> [11,] 134  792 
#> 
#> $famousgrouse
#> <xy [169 x 2]>
#>       [,1] [,2]
#>  [1,] 198  626 
#>  [2,] 198  606 
#>  [3,] 198  588 
#>  [4,] 198  568 
#>  [5,] 198  568 
#>  [6,] ...  ... 
#>  [7,] 194  722 
#>  [8,] 194  702 
#>  [9,] 194  702 
#> [10,] 194  684 
#> [11,] 194  664 
#> 
#> $glendronach
#> <xy [197 x 2]>
#>       [,1] [,2]
#>  [1,] 146  870 
#>  [2,] 146  846 
#>  [3,] 148  822 
#>  [4,] 148  822 
#>  [5,] 148  798 
#>  [6,] ...  ... 
#>  [7,] 144  990 
#>  [8,] 144  966 
#>  [9,] 146  942 
#> [10,] 146  942 
#> [11,] 146  918 
#> 
#> $glenmorangie
#> <xy [179 x 2]>
#>       [,1] [,2]
#>  [1,]  106 1036
#>  [2,]  108 1002
#>  [3,]  108 1002
#>  [4,]  108  970
#>  [5,]  110  936
#>  [6,] ...  ... 
#>  [7,]  124 1198
#>  [8,]  116 1168
#>  [9,]  108 1134
#> [10,]  106 1100
#> [11,]  106 1100
#> 
#> $highlandpark
#> <xy [169 x 2]>
#>       [,1] [,2]
#>  [1,]  84  742 
#>  [2,]  84  714 
#>  [3,]  84  714 
#>  [4,]  84  686 
#>  [5,]  84  658 
#>  [6,] ...  ... 
#>  [7,]  82  882 
#>  [8,]  84  854 
#>  [9,]  84  826 
#> [10,]  84  798 
#> [11,]  84  798 
#> 
#> $jackdaniels
#> <xy [150 x 2]>
#>       [,1] [,2]
#>  [1,] 126  828 
#>  [2,] 126  802 
#>  [3,] 126  776 
#>  [4,] 126  750 
#>  [5,] 126  724 
#>  [6,] ...  ... 
#>  [7,] 140  986 
#>  [8,] 136  958 
#>  [9,] 130  932 
#> [10,] 128  906 
#> [11,] 130  880 
#> 
#> $jb
#> <xy [174 x 2]>
#>       [,1] [,2]
#>  [1,]   86 1062
#>  [2,]   86 1040
#>  [3,]   84 1020
#>  [4,]   84  976
#>  [5,]   86  954
#>  [6,] ...  ... 
#>  [7,]   84 1212
#>  [8,]   80 1190
#>  [9,]   84 1170
#> [10,]   86 1126
#> [11,]   86 1104
#> 
#> $johnniewalker
#> <xy [168 x 2]>
#>       [,1] [,2]
#>  [1,] 266  350 
#>  [2,] 266  342 
#>  [3,] 266  334 
#>  [4,] 266  326 
#>  [5,] 268  310 
#>  [6,] ...  ... 
#>  [7,] 266  406 
#>  [8,] 266  398 
#>  [9,] 266  382 
#> [10,] 266  374 
#> [11,] 266  366 
#> 
#> $magallan
#> <xy [141 x 2]>
#>       [,1] [,2]
#>  [1,] 156  794 
#>  [2,] 156  764 
#>  [3,] 160  750 
#>  [4,] 160  722 
#>  [5,] 162  692 
#>  [6,] ...  ... 
#>  [7,] 150  924 
#>  [8,] 150  910 
#>  [9,] 150  882 
#> [10,] 154  852 
#> [11,] 154  838 
#> 
#> $makersmark
#> <xy [177 x 2]>
#>       [,1] [,2]
#>  [1,]  62  864 
#>  [2,]  46  840 
#>  [3,]  32  816 
#>  [4,]  32  816 
#>  [5,]  26  788 
#>  [6,] ...  ... 
#>  [7,] 158  974 
#>  [8,] 148  946 
#>  [9,] 134  928 
#> [10,] 134  928 
#> [11,] 106  908 
#> 
#> $oban
#> <xy [179 x 2]>
#>       [,1] [,2]
#>  [1,] 148  914 
#>  [2,] 148  896 
#>  [3,] 148  862 
#>  [4,] 148  846 
#>  [5,] 148  828 
#>  [6,] ...  ... 
#>  [7,]  144 1034
#>  [8,]  146 1016
#>  [9,]  146 1000
#> [10,]  146  982
#> [11,]  146  948
#> 
#> $oldpotrero
#> <xy [131 x 2]>
#>       [,1] [,2]
#>  [1,] 166  614 
#>  [2,] 154  598 
#>  [3,] 142  582 
#>  [4,] 126  548 
#>  [5,] 120  530 
#>  [6,] ...  ... 
#>  [7,] 238  732 
#>  [8,] 234  716 
#>  [9,] 224  698 
#> [10,] 202  666 
#> [11,] 190  648 
#> 
#> $redbreast
#> <xy [177 x 2]>
#>       [,1] [,2]
#>  [1,] 210  466 
#>  [2,] 206  456 
#>  [3,] 202  448 
#>  [4,] 196  428 
#>  [5,] 196  420 
#>  [6,] ...  ... 
#>  [7,] 274  522 
#>  [8,] 264  514 
#>  [9,] 254  506 
#> [10,] 236  492 
#> [11,] 226  484 
#> 
#> $tamdhu
#> <xy [176 x 2]>
#>       [,1] [,2]
#>  [1,]   98 1104
#>  [2,]   98 1080
#>  [3,]   98 1054
#>  [4,]   98 1030
#>  [5,]   98 1006
#>  [6,] ...  ... 
#>  [7,]   92 1250
#>  [8,]   88 1226
#>  [9,]   90 1202
#> [10,]   92 1178
#> [11,]   94 1154
#> 
#> $wildturkey
#> <xy [185 x 2]>
#>       [,1] [,2]
#>  [1,]   36 1138
#>  [2,]   36 1110
#>  [3,]   36 1082
#>  [4,]   36 1054
#>  [5,]   36 1026
#>  [6,] ...  ... 
#>  [7,]   40 1302
#>  [8,]   36 1276
#>  [9,]   30 1250
#> [10,]   30 1222
#> [11,]   30 1194
#> 
#> $yoichi
#> <xy [123 x 2]>
#>       [,1] [,2]
#>  [1,] 138  768 
#>  [2,] 138  738 
#>  [3,] 138  710 
#>  [4,] 138  680 
#>  [5,] 138  650 
#>  [6,] ...  ... 
#>  [7,] 136  914 
#>  [8,] 136  900 
#>  [9,] 136  870 
#> [10,] 136  842 
#> [11,] 138  812 
#> 
#> attr(,"class")
#> [1] "out"  "coo"  "list"