aboutsummaryrefslogtreecommitdiff
path: root/src/cube.c
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-10-27 17:16:58 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2023-10-27 17:16:58 +0200
commit989e933fc557cbc1e9e16e45033387816ee6075e (patch)
tree867ee23bdaf6ba1e0e5f001d1a15e3bb46fa3bc3 /src/cube.c
parent2a8d66906dde19ffb7315fb3f60a396a71612037 (diff)
downloadnissy-core-989e933fc557cbc1e9e16e45033387816ee6075e.tar.gz
nissy-core-989e933fc557cbc1e9e16e45033387816ee6075e.zip
Improved transformations and cleaned up
Diffstat (limited to 'src/cube.c')
-rw-r--r--src/cube.c270
1 files changed, 74 insertions, 196 deletions
diff --git a/src/cube.c b/src/cube.c
index 87570b4..0d97635 100644
--- a/src/cube.c
+++ b/src/cube.c
@@ -42,6 +42,78 @@
42#define _eflip 0x10U 42#define _eflip 0x10U
43#define _error 0xFFU 43#define _error 0xFFU
44 44
45move_t inverse_move[] = {
46 [U] = U3,
47 [U2] = U2,
48 [U3] = U,
49 [D] = D3,
50 [D2] = D2,
51 [D3] = D,
52 [R] = R3,
53 [R2] = R2,
54 [R3] = R,
55 [L] = L3,
56 [L2] = L2,
57 [L3] = L,
58 [F] = F3,
59 [F2] = F2,
60 [F3] = F,
61 [B] = B3,
62 [B2] = B2,
63 [B3] = B,
64};
65
66trans_t inverse_trans[] = {
67 [UFr] = UFr,
68 [ULr] = URr,
69 [UBr] = UBr,
70 [URr] = URr,
71 [DFr] = DFr,
72 [DLr] = DLr,
73 [DRr] = DRr,
74 [DBr] = DBr,
75 [RUr] = FRr,
76 [RFr] = LFr,
77 [RDr] = BLr,
78 [RBr] = RBr,
79 [LUr] = FLr,
80 [LFr] = RFr,
81 [LDr] = BRr,
82 [LBr] = LBr,
83 [FUr] = FUr,
84 [FRr] = RUr,
85 [FDr] = BUr,
86 [FLr] = LUr,
87 [BUr] = FDr,
88 [BLr] = RDr,
89 [BDr] = BDr,
90 [BRr] = LDr,
91 [UFm] = UFm,
92 [ULm] = ULm,
93 [UBm] = UBm,
94 [URm] = ULm,
95 [DFm] = DFm,
96 [DLm] = DRm,
97 [DRm] = DLm,
98 [DBm] = DBm,
99 [RUm] = FLm,
100 [RFm] = RFm,
101 [RDm] = BRm,
102 [RBm] = LBm,
103 [LUm] = FRm,
104 [LFm] = LFm,
105 [LDm] = BLm,
106 [LBm] = RBm,
107 [FUm] = FUm,
108 [FRm] = LUm,
109 [FDm] = BUm,
110 [FLm] = RUm,
111 [BUm] = FDm,
112 [BLm] = LDm,
113 [BDm] = BDm,
114 [BRm] = RDm,
115};
116
45static char *cornerstr[] = { 117static char *cornerstr[] = {
46 [_c_ufr] = "UFR", 118 [_c_ufr] = "UFR",
47 [_c_ubl] = "UBL", 119 [_c_ubl] = "UBL",
@@ -894,200 +966,7 @@ flipallcorners(cube_t c)
894cube_t 966cube_t
895transform(cube_t c, trans_t t) 967transform(cube_t c, trans_t t)
896{ 968{
897 static cube_t trans_move_cube[] = { 969#include "trans_move_arr.h"
898 [UFr] = {
899 .c = {0, 1, 2, 3, 4, 5, 6, 7},
900 .e = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
901 },
902 [ULr] = {
903 .c = {4, 5, 7, 6, 1, 0, 2, 3},
904 .e = {5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24}
905 },
906 [UBr] = {
907 .c = {1, 0, 3, 2, 5, 4, 7, 6},
908 .e = {1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9}
909 },
910 [URr] = {
911 .c = {5, 4, 6, 7, 0, 1, 3, 2},
912 .e = {4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26}
913 },
914 [DFr] = {
915 .c = {2, 3, 0, 1, 6, 7, 4, 5},
916 .e = {3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10}
917 },
918 [DLr] = {
919 .c = {7, 6, 4, 5, 2, 3, 1, 0},
920 .e = {6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27}
921 },
922 [DBr] = {
923 .c = {3, 2, 1, 0, 7, 6, 5, 4},
924 .e = {2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8}
925 },
926 [DRr] = {
927 .c = {6, 7, 5, 4, 3, 2, 0, 1},
928 .e = {7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25}
929 },
930 [RUr] = {
931 .c = {64, 67, 65, 66, 37, 38, 36, 39},
932 .e = {20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3}
933 },
934 [RFr] = {
935 .c = {38, 37, 36, 39, 64, 67, 66, 65},
936 .e = {24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18}
937 },
938 [RDr] = {
939 .c = {67, 64, 66, 65, 38, 37, 39, 36},
940 .e = {23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1}
941 },
942 [RBr] = {
943 .c = {37, 38, 39, 36, 67, 64, 65, 66},
944 .e = {27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16}
945 },
946 [LUr] = {
947 .c = {65, 66, 64, 67, 36, 39, 37, 38},
948 .e = {21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2}
949 },
950 [LFr] = {
951 .c = {36, 39, 38, 37, 66, 65, 64, 67},
952 .e = {25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17}
953 },
954 [LDr] = {
955 .c = {66, 65, 67, 64, 39, 36, 38, 37},
956 .e = {22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0}
957 },
958 [LBr] = {
959 .c = {39, 36, 37, 38, 65, 66, 67, 64},
960 .e = {26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19}
961 },
962 [FUr] = {
963 .c = {68, 70, 69, 71, 32, 34, 33, 35},
964 .e = {16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6}
965 },
966 [FRr] = {
967 .c = {32, 34, 35, 33, 70, 68, 69, 71},
968 .e = {8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21}
969 },
970 [FDr] = {
971 .c = {70, 68, 71, 69, 34, 32, 35, 33},
972 .e = {19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4}
973 },
974 [FLr] = {
975 .c = {34, 32, 33, 35, 68, 70, 71, 69},
976 .e = {9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23}
977 },
978 [BUr] = {
979 .c = {69, 71, 68, 70, 33, 35, 32, 34},
980 .e = {17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7}
981 },
982 [BRr] = {
983 .c = {35, 33, 32, 34, 69, 71, 70, 68},
984 .e = {11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22}
985 },
986 [BDr] = {
987 .c = {71, 69, 70, 68, 35, 33, 34, 32},
988 .e = {18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5}
989 },
990 [BLr] = {
991 .c = {33, 35, 34, 32, 71, 69, 68, 70},
992 .e = {10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20}
993 },
994 [UFm] = {
995 .c = {4, 5, 6, 7, 0, 1, 2, 3},
996 .e = {0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10}
997 },
998 [ULm] = {
999 .c = {0, 1, 3, 2, 5, 4, 6, 7},
1000 .e = {4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25}
1001 },
1002 [UBm] = {
1003 .c = {5, 4, 7, 6, 1, 0, 3, 2},
1004 .e = {1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8}
1005 },
1006 [URm] = {
1007 .c = {1, 0, 2, 3, 4, 5, 7, 6},
1008 .e = {5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27}
1009 },
1010 [DFm] = {
1011 .c = {6, 7, 4, 5, 2, 3, 0, 1},
1012 .e = {3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11}
1013 },
1014 [DLm] = {
1015 .c = {3, 2, 0, 1, 6, 7, 5, 4},
1016 .e = {7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26}
1017 },
1018 [DBm] = {
1019 .c = {7, 6, 5, 4, 3, 2, 1, 0},
1020 .e = {2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9}
1021 },
1022 [DRm] = {
1023 .c = {2, 3, 1, 0, 7, 6, 4, 5},
1024 .e = {6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24}
1025 },
1026 [RUm] = {
1027 .c = {68, 71, 69, 70, 33, 34, 32, 35},
1028 .e = {21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3}
1029 },
1030 [RFm] = {
1031 .c = {34, 33, 32, 35, 68, 71, 70, 69},
1032 .e = {25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18}
1033 },
1034 [RDm] = {
1035 .c = {71, 68, 70, 69, 34, 33, 35, 32},
1036 .e = {22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1}
1037 },
1038 [RBm] = {
1039 .c = {33, 34, 35, 32, 71, 68, 69, 70},
1040 .e = {26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16}
1041 },
1042 [LUm] = {
1043 .c = {69, 70, 68, 71, 32, 35, 33, 34},
1044 .e = {20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2}
1045 },
1046 [LFm] = {
1047 .c = {32, 35, 34, 33, 70, 69, 68, 71},
1048 .e = {24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17}
1049 },
1050 [LDm] = {
1051 .c = {70, 69, 71, 68, 35, 32, 34, 33},
1052 .e = {23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0}
1053 },
1054 [LBm] = {
1055 .c = {35, 32, 33, 34, 69, 70, 71, 68},
1056 .e = {27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19}
1057 },
1058 [FUm] = {
1059 .c = {64, 66, 65, 67, 36, 38, 37, 39},
1060 .e = {16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7}
1061 },
1062 [FRm] = {
1063 .c = {36, 38, 39, 37, 66, 64, 65, 67},
1064 .e = {9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20}
1065 },
1066 [FDm] = {
1067 .c = {66, 64, 67, 65, 38, 36, 39, 37},
1068 .e = {19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5}
1069 },
1070 [FLm] = {
1071 .c = {38, 36, 37, 39, 64, 66, 67, 65},
1072 .e = {8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22}
1073 },
1074 [BUm] = {
1075 .c = {65, 67, 64, 66, 37, 39, 36, 38},
1076 .e = {17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6}
1077 },
1078 [BRm] = {
1079 .c = {39, 37, 36, 38, 65, 67, 66, 64},
1080 .e = {10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23}
1081 },
1082 [BDm] = {
1083 .c = {67, 65, 66, 64, 39, 37, 38, 36},
1084 .e = {18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4}
1085 },
1086 [BLm] = {
1087 .c = {37, 39, 38, 36, 67, 65, 64, 66},
1088 .e = {11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21}
1089 },
1090 };
1091 970
1092 cube_t ret; 971 cube_t ret;
1093 972
@@ -1104,8 +983,7 @@ transform(cube_t c, trans_t t)
1104 983
1105 ret = compose(solvedcube, trans_move_cube[t]); 984 ret = compose(solvedcube, trans_move_cube[t]);
1106 ret = compose(ret, c); 985 ret = compose(ret, c);
1107 /* TODO: pre-compute inverse for performance */ 986 ret = compose(ret, trans_move_cube_inverse[t]);
1108 ret = compose(ret, inverse(trans_move_cube[t]));
1109 987
1110 /* TODO: work out a better way to do this */ 988 /* TODO: work out a better way to do this */
1111 if (t >= 24) 989 if (t >= 24)

Generated with cgit - Back to sebastiano.tronto.net