inverse method
Implementation
Cube inverse() {
final cpA = List.of(_cp);
final cpB = List.filled(cornerCount, Corner.upRightFront);
final coA = List.of(_co);
final coB = List.filled(cornerCount, 0);
final epA = List.of(_ep);
final epB = List.filled(edgeCount, Edge.upRight);
final eoA = List.of(_eo);
final eoB = List.filled(edgeCount, 0);
for (var edge = 0; edge < edgeCount; edge++) {
epB[epA[edge].index] = Edge.values[edge];
}
for (var edge = 0; edge < edgeCount; edge++) {
eoB[edge] = eoA[epB[edge].index];
}
for (var corner = 0; corner < cornerCount; corner++) {
cpB[cpA[corner].index] = Corner.values[corner];
}
for (var corner = 0; corner < cornerCount; corner++) {
final ori = coA[cpB[corner].index];
// Just for completeness. We do not invert mirrored.
if (ori >= 3) {
// cubes in the program.
coB[corner] = ori;
}
// the standard case.
else {
coB[corner] = -ori;
if (coB[corner] < 0) {
coB[corner] += 3;
}
}
}
return Cube._(cp: cpB, co: coB, ep: epB, eo: eoB);
}